Python基础(七):文件与数据格式化
文件和数据格式化
7.1 文件
7.1.1 文件类型
文件是数据的抽象和集合
文件的展示方式
- 本质上,文件都是二进制存储
- 形式上,文件有两种展示方式
- 文本文件:由单一特定编码组成的文件,也被看成是存储的长字符串,例如 txt 文件、.py 文件。
- 二进制文件:二进制 01 组成,没有统一字符编码,例如 .png 文件。
7.1.2 文件的打开与关闭
打开文件:
open(filename, mode='r')
打开一个文件,并返回文件对象。filename
: 必需,文件路径(相对路径或绝对路径)。mode
: 可选,文件打开模式
文件打开模式(
mode
参数)参数 模式 "r" 只读模式(默认) "w" 覆盖写,文件不存在则创建,存在则覆盖 "x" 创建写,文件不存在则创建,存在则报错 "a" 追加写,文件不存在则创建,存在则追加 "t" 文本模式(默认) "b" 二进制模式 "+" 与 r/w/x/a 一起使用,打开一个文件进行更新(可读可写)。
关闭文件:
fileObject.close()
关闭一个已打开的文件。- 关闭后的文件不能再进行读写操作,
- 没有参数,没有返回值
python对文件的操作步骤:打开→操作→关闭
打开文件后采用
close()
关闭文件是一个好习惯。如果不调用close()
,当前 Python 程序完全运行退出时,该文件引用被释放,即程序退出时,相当于调用了close()
。
7.1.3 文件读取
函数 | 说明 |
---|---|
file.read(size=-1) |
读取所有,作为一个字符串。如果给定 size 则读取前 size 长度。 |
file.readline(size=-1) |
读取整行,包括 "" ,如果给定 size 则读取该行的前 size 长度。 |
file.readlines(sizeint=-1) |
读取所有行,以每行为元素返回列表,如果给定 sizeint 则读取前 sizeint 行。 |
# 实例
# 遍历全文本:方法一
# 特点:一次读入,统一处理
file = open("f1.txt", "r")
txt = file.read()
file.close()
# 遍历全文本,方法二
# 特点:按数量读入,逐步处理
file = open("f1.txt", "r")
txt = file.read(5)
while txt != "":
txt = file.read(5)
file.close()
# 逐行遍历:方法一
file = open("f1.txt", "r")
ls = file.readlines()
for line in ls:
print(line)
file.close()
print(ls)
Who's there?
hello
python
["Who's there?\n", 'hello\n', 'python']
# 逐行遍历:方法二
file = open("f1.txt", "r")
ls = []
for line in file: # 读取每行为一个字符串
print(line)
ls.append(line)
file.close()
print(ls)
Who's there?
hello
python
["Who's there?\n", 'hello\n', 'python']
7.1.4 文件写入
函数 | 说明 |
---|---|
file.write(s) |
将字符串 s 写入文件,返回写入的字符长度。 |
file.writelines(lines) |
向文件写入一个字符串列表 lines,如需换行则要自己加入每行的换行符。 |
file.tell() |
返回文件指针的当前位置。 |
file.seek(offset[, whence]) |
将文件指针移动到指定位置。 |
file.seek(offset[, whence])
offset
— 偏移量
whence
— 从文件哪个位置开始偏移(可选,默认为0)
- 0 → 从文件开头开始,1 → 从文件当前位置开始,2 → 从文件结尾开始
# tell()与seek()
file = open("f1.txt", "rb")
print(file.tell())
file.read(5)
print(file.tell())
file.seek(20, 1)
print(file.tell())
0
5
25
# 注意:Pyhon3 在文本文件中,如果没有使用 b 模式打开文件,
# 那么只允许从文件头开始计算相对位置,从其它位置开始就会引发异常。
# io.UnsupportedOperation: can't do nonzero cur-relative seeks
file = open("f1.txt", "rb")
file.read(5)
print(file.tell())
file.seek(20, 1)
5
25
# 实例
# 数据写入到文件的操作
file = open("f1.txt", "w+")
ls = ["Who's there?\n", "hello\n", "python"]
file.writelines(ls)
for line in file:
print(line)
file.close()
# 没有任何输出
# 修改代码
file = open("f1.txt", "w+")
ls = ["Who's there?\n", "hello\n", "python"]
file.writelines(ls)
print(file.tell())
file.seek(0) # 文件指针回到文件头
for line in file:
print(line, end="") # 读取一行会将末尾换行符也读取
file.close()
27
Who's there?
hello
python
7.2 一维数据的格式化和处理
数据组织的维度
- 一维数据:由对等关系的有序或无序数据构成,采用线性方式组织,例如集合、列表
- 二维数据:一维数据的组合形式
- 多维数据:由一维或二维数据在新维度的扩展
- 高维数据:仅利用最基本的二元关系展示数据的复杂结构,例如字典
一维数据的表示
- 数据有序:列表
- 数据无序:集合
一维数据的存储
- 方式一:空格分隔进行存储,不换行。缺点:数据中不能有空格
- 方式二:逗号分隔进行存储,不换行。缺点:数据中不能有逗号
- 其他方式:特殊符号或符号组合
一维数据的处理:指的是表示方式与存储方式的相互转换
# 1.从空格分隔的文件读取数据
file = open("data1.txt", "r")
txt = file.read()
ls = txt.split()
file.close()
ls
['Thu', 'Nov', '17', '15:13:13', '2022']
# 2.采用空格分隔方式将数据写入文件
txt = " ".join(ls)
file = open("data1.txt", "w")
file.write(txt)
file.close()
7.3 二维数据的格式化和处理
二维数据的表示
- 基本方式:二维列表
CSV格式与二维数据的存储
逗号分隔值(Comma-Separated Values,CSV):通用的一二维数据存储格式,
.csv
扩展名- 每行一个一维数据,采用逗号分隔,无空行
- 如果某个元素缺失,逗号仍要保留
- 英文半角逗号,逗号与数据之间无额外空格
- 暂时不考虑数据中出现逗号的情况(加引号、转义符)
二维数据的存储:一般索引习惯为ls[row][column]
二维数据的处理
- Python 提供了一个读写 csv 的标准库,可以通过
import csv
使用。csv 库包含操作 CSV 格式最基本的功能,csv.reader 和 csv.writer(). - 由于 CSV 格式十分简单,对于一般程序来说,建议程序员自己编写操作 CSV 格式的函数,这样更灵活和个性化。
- 对于需要运行在复杂环境或商业使用的程序,建议采用 csv 标准库。
- Python 提供了一个读写 csv 的标准库,可以通过
# 从CSV格式的文件读取数据
ls = []
file = open("sample1.csv", "r")
for line in file:
line = line.replace("\n", "")
lt = line.split(",")
ls.append(lt)
file.close()
# 打印
for item in ls:
print(item)
['"Month"', '"Average"', '"2005"', '"2006"', '"2007"', '"2008"', '"2009"', '"2010"', '"2011"', '"2012"', '"2013"', '"2014"', '"2015"']
['"May"', '0.1', '0', '0', '1', '1', '0', '0', '0', '2', '0', '0', '0']
['"Jun"', '0.5', '2', '1', '1', '0', '0', '1', '1', '2', '2', '0', '1']
['"Jul"', '0.7', '5', '1', '1', '2', '0', '1', '3', '0', '2', '2', '1']
['"Aug"', '2.3', '6', '3', '2', '4', '4', '4', '7', '8', '2', '2', '3']
['"Sep"', '3.5', '6', '4', '7', '4', '2', '8', '5', '2', '5', '2', '5']
['"Oct"', '2.0', '8', '0', '1', '3', '2', '5', '1', '5', '2', '3', '0']
['"Nov"', '0.5', '3', '0', '0', '1', '1', '0', '1', '0', '1', '0', '1']
['"Dec"', '0.0', '1', '0', '1', '0', '0', '0', '0', '0', '0', '0', '1']
# 将二维数据写入CSV格式文件
file = open("sample1.csv", "w")
for item in ls:
file.write(",".join(item) + "\n")
file.close()
代码中用到的文件:
链接:https://pan.baidu.com/s/1yQ5a3NQS8LxYagRyQSvs1A?pwd=c31g 提取码:c31g
Python基础(七):文件与数据格式化
https://luminous-ee.github.io/2023/01/26/Python基础(七):文件与数据格式化/