文件处理
常用打开文件方式
1.读取文件内容, 模式为 'r' 表示读, 这也是打开的默认方式。
2.如果要创建或者替换文件, 模式为 'w', 表示写。
3.为现有文件添加内容, 模式为 'a', 表示追加。
4.如果文件是二进制的, 读写都需要添加 'b'。
模式可以组合, 比如 rb 就表示读取二进制文件, 更多的模式可以使用 dir 查看 open 函数的文档说明。
不同模式打开文件的列表:
模式 | 描述 |
---|---|
r |
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ |
打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ |
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w |
打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb |
以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在, 创建新文件。一般用于非文本文件如图片等。 |
w+ |
打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在, 创建新文件。 |
wb+ |
以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在, 创建新文件。一般用于非文本文件如图片等。 |
a |
打开一个文件用于追加。如果该文件已存在, 文件指针将会放在文件的结尾。也就是说, 新的内容将会被写入到已有内容之后。如果该文件不存在, 创建新文件进行写入。 |
ab |
以二进制格式打开一个文件用于追加。如果该文件已存在, 文件指针将会放在文件的结尾。也就是说, 新的内容将会被写入到已有内容之后。如果该文件不存在, 创建新文件进行写入。 |
a+ |
打开一个文件用于读写。如果该文件已存在, 文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在, 创建新文件用于读写。 |
ab+ |
以二进制格式打开一个文件用于追加。如果该文件已存在, 文件指针将会放在文件的结尾。如果该文件不存在, 创建新文件用于读写。 |
打开一个文件需要使用 open() 函数建立一个文件对象:
open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])
file
: 要访问的文件名称。
mode
: 打开文件的模式, 默认访问文件模式是只读(r)。
buffering
: 设置 buffer(取值为 0, 1, >1)。如果 buffering 的值被设为 0, 就不会有寄存。如果 buffering 的值取 1, 访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数, 表明了这就是的寄存区的缓冲大小。如果取负值, 寄存区的缓冲大小则为系统默认。
encoding
: 返回数据的编码格式。
errors
: 报错级别, 一般为 strict, ignore。当取strict的时候, 字符编码出现问题的时候, 会报错, 当取ignore的时候, 编码出现问题, 程序会忽略而过, 继续执行下面的程序。
newline
: 用于区分换行符, 这个参数只对文本模式有效, 可以取的值有 None, '\n', '\r', '', '\r\n'
closefd
: 取值与传入的文件参数有关, 默认情况下为 True, 传入的 file 参数为文件的文件名, 取值为 False 的时候,file 只能是文件描述符, 什么是文件描述符, 就是一个非负整数, 在 Unix 内核的系统中, 打开一个文件, 便会返回一个文件描述符。
例如:
f = open('a.txt', 'r') # 以只读方式打开 a.txt
close() 方法
文件对象的 close()
方法刷新缓冲区里任何还没写入的信息, 并关闭该文件,这之后便不能再进行写入。
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。
使用语法如下:
f = open('a.txt', 'r')
f.close()
读文件
读文件的常用方法:
read()
: 一次性读取文件的所有内容。
read(size)
: 读取 size 个字节的内容。
readline()
: 逐行读取文本,结果是一个 list(列表)
readlines()
: 一次性地按行读取全部内容, 存入一个 list(列表)
。
写文件
写文件的常用方法:
write(str)
: 将 str 写入文件。write()并不会在 str 后加上一个换行符。
writelines(seq)
: 把 seq 的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
Python File(文件) 其他方法:
file 对象使用 open() 函数来创建, 下面是一些常用的函数
函数 | 作用 |
---|---|
file.flush() |
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
file.fileno() |
返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
file.isatty() |
如果文件连接到一个终端设备返回 True,否则返回 False。 |
file.next() |
返回文件下一行 |
file.seek(offset[, whence]) |
设置文件当前位置 |
file.tell() |
返回文件当前位置 |
file.truncate([size]) |
截取文件, 截取的字节通过size指定, 默认为当前文件位置。 |
with-文件上下文管理器
文件操作可能会出现异常(例如要操作的文件不存在等), 抛出异常会影响 close() 方法正确关闭文件。如果想保证 close() 方法的执行, 可以使用如下方法处理异常:
try:
f = open('a.txt', 'r')
print(f.read())
finally:
f.close()
Python 的文件对象支持 with 语法, 上面代码的效果可以用如下代码实现:
with open('a.txt', 'r') as f:
print(f.read())
with 上下文管理器在执行完代码块之后, 会自动调用文件对象的 close() 方法, 使用 with ... as ... 语法, 可以更简洁。
json/pickle 存储 Python 对象
如果我们需要存储的不是字符串, 而是 Python 内置的数据结构或者是一些自定义的类对象, 这时候就需要通过某种方式将需要存储的 Python 对象转换为字符串或者二进制内容存放, 这个过程叫做 序列化, 从字符串转换成对象叫做 反序列化。
下面是 json 和 pickle 模块完成序列化的简单操作:
In: import json
In: import pickle
In: my_dict = {'a': [1, 2, 3], 'b': 123}
In: json_data = json.dumps(my_dict)
In: pickle_data = pickle.dumps(my_dict)
In: json_data
Out: '{"a": [1, 2, 3], "b": 123}'
In: pickle_data
Out: b'\x80\x03}q\x00(X\x01\x00\x00\x00aq\x01]q\x02(K\x01K\x02K\x03eX\x01\x00\x00\x00bq\x03K{u.'
将序列化的结果写入文件的操作如下:
with open('data.json', 'w') as f:
f.write(json_data)
with open('data.json') as f:
data = json.loads(f.read()) # loads() 方法反序列化
print(data)