文件读写

2021-12-08 10:42:21
admin
1869
最后编辑: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)

这种简单的序列化技术可以处理列表和字典。