Python 文件处理

作者 耿嘉豪 日期 2018-04-07 阅读量
Python 文件处理

文件处理

常用打开文件方式

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)