文件读写
- 2021-12-08 10:42:21
- admin
- 1859
- 最后编辑:admin 于 2022-11-24 20:28:40
要写入字符串到文件中,需要先将字符串编码为字节串。
而从文本文件中读取的文本信息都是字节串,要进行处理之前,必须先将字节串解码为字符串。
编码 解码
字符串——>字节串——>字符串
encode decode
open()
open 函数
在 Python 语言中,我们要读写文本文件, 首先通过内置函数 open 打开一个文件。
open 函数会返回一个对象,我们可以称之为文件对象。
这个返回的文件对象就包含读取文本内容和写入文本内容的方法。
open 函数常用三个参数:
• 目标文件路径(相对或绝对路径);
• 打开方式 mode(只读r/只写w/追加a/读写r+);
• 编/解码方式 encoding;
调用 open 函数时,如果传入了 encoding 参数值:
后面调用 write 写入字符串到文件中,open 函数会使用指定 encoding 编码为字节串;
后面调用 read 从文件中读取内容,open 函数会使用指定 encoding 解码为字符串对象
with 用法
使用 with 可以省略 close 文件的步骤,避免因为遗忘关闭文件而引起错误。
例如:
with open('test.txt', 'r', encoding = 'utf8') as f: content = f.read() print(content)
读取文件全部内容
# 指定编码方式为 gbk,gbk 编码兼容 gb2312
with open('test.txt', 'r', encoding = 'gb2312') as f: content = f.read() print(content)
read 方法会在读取文件中的原始字节串后, 根据上面指定的 gbk 解码为字符串对象返回。
以文本模式打开文件后, 后面的读写文件的方法(比如 read,write 等),底层实现都会自动的进行 字符串(对应Python 的string对象)和字节串(对应 Python 的 bytes 对象) 的转换。
逐行读取文件内容
要以每次一行的方式读取文件内容,可以对文件对象使用 for 循环:
with open('test.txt', 'r', encoding = 'utf8') as f: for line in f: print(line)
文件对象的 readlines() 方法从文件中读取每一行,并将其存储在一个列表中。
with open('/data/test.txt', 'r', encoding = 'utf8') as f: lines = f.readlines() for line in lines: print(line.strip())
写入文件
可以将程序输出写入文件中进行保存,便于后期使用。
如果写入的文件不存在,函数 open() 会创建它。但如果是目录不存在,open() 不会创建它,并提示错误。
注:以写入模式 w 打开文件时,如果指定文件已存在,Python 会在返回文件对象前清空该文件的内容。
with open('/data/test.txt', 'w', encoding = 'utf8') as f: f.write('hello world')
指定编码方式为 utf8,write 方法会将字符串编码为 utf8 字节串写入文件。
注:write() 方法不会在写入的文本末尾添加换行符,所以在写入多行内容时,需要在 write() 中包含换行符:
with open('/data/test.txt', 'w', encoding = 'utf8') as f: f.write('hello world\n') f.write('hello Python\n')
附加文件内容
与覆盖写入 w 不同,附加模式 a 可以在文件原有内容的基础上写入新的内容。
with open('/data/test.txt', 'a', encoding = 'utf8') as f: f.write('\nhello Python.\n')
使用 JSON 保存结构化数据
字符串可以很轻松地写入文件并从文件中读取出来。数字可能会费点劲,因为 read() 方法只能返回字符串,这些字符串必须传递给像 int() 函数,它会接受类似 '123' 这样的字符串并返回其数字值 123。当你想保存诸如嵌套列表和字典这样更复杂的数据类型时,手动解析和序列化会变得复杂,这时可以使用 JSON。
如果你有一个对象 x ,你可以用一行简单的代码来查看它的 JSON 字符串表示:
import json json.dumps([1, 'simple', 'list']) # 结果:'[1, "simple", "list"]'
dumps() 函数的另一个变体叫做 dump() ,它只是将对象序列化为 text file 。因此,如果 f 是一个 text file 对象,我们可以这样做:
json.dump(x, f)
要再次解码对象,如果 f 是一个打开的以供阅读的 text file 对象:
x = json.load(f)
这种简单的序列化技术可以处理列表和字典。