Python 数据持久化 - 文件 API
Python 使用内置的input() 和print() 函数来执行标准的输入/输出操作。 input() 函数从标准输入流设备(即键盘)读取字节。
另一方面,print() 函数将数据发送到标准输出流设备,即显示器。 Python 程序通过定义在 sys 模块中的标准流对象 stdin 和 stdout 与这些 IO 设备进行交互。
input() 函数实际上是 sys.stdin 对象的 readline() 方法的包装器。 接收来自输入流的所有击键,直到按下"Enter"键。
>>> import sys >>> x=sys.stdin.readline() Welcome to TutorialsPoint >>> x 'Welcome to TutorialsPoint\n'
请注意,readline() 函数会留下尾随的"\n"字符。 还有一个 read() 方法,它从标准输入流中读取数据,直到它被 Ctrl+D 字符终止。
>>> x=sys.stdin.read() Hello Welcome to TutorialsPoint >>> x 'Hello\nWelcome to TutorialsPoint\n'
类似地,print() 是模拟标准输出对象的 write() 方法的便捷函数。
>>> x='Welcome to TutorialsPoint\n' >>> sys.stdout.write(x) Welcome to TutorialsPoint 26
就像 stdin 和 stdout 预定义的流对象一样,Python 程序可以从磁盘文件或网络套接字读取数据并将数据发送到磁盘文件或网络套接字。 它们也是流。 任何具有 read() 方法的对象都是输入流。 任何具有 write() 方法的对象都是输出流。 通过使用内置的 open() 函数获取对流对象的引用来建立与流的通信。
open() 函数
此内置函数使用以下参数 −
f=open(name, mode, buffering)
name 参数,是磁盘文件的名称或字节串,mode 是可选的单字符字符串,用于指定要执行的操作类型(读、写、追加等),buffering 参数是 0、1 或 -1 表示缓冲关闭、打开或系统默认。
文件打开方式如下表列举。 默认模式是"r"
Sr.No | 参数 & 说明 |
---|---|
1 |
R 打开读取(默认) |
2 |
W 打开写入,先截断文件 |
3 |
X 创建一个新文件并打开它进行写入 |
4 |
A 以写入方式打开,如果文件存在则追加到文件末尾 |
5 |
B 二进制模式 |
6 |
T 文本模式(默认) |
7 |
+ 打开一个磁盘文件进行更新(读写) |
为了将数据保存到文件中,必须使用"w"模式打开。
f=open('test.txt','w')
这个文件对象充当输出流,并且可以访问 write() 方法。 write() 方法向该对象发送一个字符串,并存储在它下面的文件中。
string="Hello TutorialsPoint\n" f.write(string)
关闭流很重要,以确保缓冲区中剩余的任何数据都已完全传输给它。
file.close()
尝试使用测试编辑器(例如记事本)打开"test.txt"以确认文件创建成功。
要以编程方式读取"test.txt"的内容,必须以"r"模式打开它。
f=open('test.txt','r')
这个对象表现为一个输入流。 Python 可以使用 read() 方法从流中获取数据。
string=f.read() print (string)
文件的内容显示在 Python 控制台上。 File 对象还支持 readline() 方法,该方法能够读取字符串直到遇到 EOF 字符。
但是,如果以"w"模式打开同一文件以在其中存储额外的文本,则较早的内容将被删除。 每当以写权限打开一个文件时,它就被视为一个新文件。 要将数据添加到现有文件,请使用"a"作为追加模式。
f=open('test.txt','a') f.write('Python Tutorials\n')
现在的文件,既有较早的字符串,也有新添加的字符串。 文件对象还支持writelines() 方法将列表对象中的每个字符串写入文件。
f=open('test.txt','a') lines=['Java Tutorials\n', 'DBMS tutorials\n', 'Mobile development tutorials\n'] f.writelines(lines) f.close()
示例
readlines() 方法返回一个字符串列表,每个字符串代表文件中的一行。 也可以逐行读取文件,直到到达文件末尾。
f=open('test.txt','r') while True: line=f.readline() if line=='' : break print (line, end='') f.close()
输出
Hello TutorialsPoint Python Tutorials Java Tutorials DBMS tutorials Mobile development tutorials
二进制模式
默认情况下,对文件对象的读/写操作是对文本字符串数据执行的。 如果我们要处理其他不同类型的文件,如媒体(mp3)、可执行文件(exe)、图片(jpg)等,我们需要在读/写模式中添加'b'前缀。
以下语句将字符串转换为字节并写入文件。
f=open('test.bin', 'wb') data=b"Hello World" f.write(data) f.close()
也可以使用 encode() 函数将文本字符串转换为字节。
data="Hello World".encode('utf-8')
我们需要使用'rb'模式来读取二进制文件。 read() 方法的返回值在打印前首先被解码。
f=open('test.bin', 'rb') data=f.read() print (data.decode(encoding='utf-8'))
为了在二进制文件中写入整数数据,应该通过to_bytes() 方法将整数对象转换为字节。
n=25 n.to_bytes(8,'big') f=open('test.bin', 'wb') data=n.to_bytes(8,'big') f.write(data)
要从二进制文件中读回,请通过 from_bytes() 函数将 read() 函数的输出转换为整数。
f=open('test.bin', 'rb') data=f.read() n=int.from_bytes(data, 'big') print (n)
对于浮点数据,我们需要使用 Python 标准库中的 struct 模块。
import struct x=23.50 data=struct.pack('f',x) f=open('test.bin', 'wb') f.write(data)
从 read() 函数中解压字符串,从二进制文件中检索浮点数据。
f=open('test.bin', 'rb') data=f.read() x=struct.unpack('f', data) print (x)
同时读/写
当打开文件进行写入时(使用'w'或'a'),不可能从中读取,反之亦然。 这样做会引发 UnSupportedOperation 错误。 在进行其他操作之前,我们需要关闭文件。
为了同时执行这两个操作,我们必须在模式参数中添加"+"字符。 因此,"w+"或"r+"模式允许在不关闭文件的情况下使用 write() 和 read() 方法。 File 对象还支持 seek() 函数以将流倒回到任何所需的字节位置。
f=open('test.txt','w+') f.write('Hello world') f.seek(0,0) data=f.read() print (data) f.close()
下表总结了文件类对象可用的所有方法。
Sr.No | 方法 & 描述 |
---|---|
1 |
close() 关闭文件。 无法再读取或写入已关闭的文件。 |
2 |
flush() 刷新内部缓冲区。 |
3 |
fileno() 返回整数文件描述符。 |
4 |
next() 每次调用时返回文件的下一行。 在 Python 3 中使用 next() 迭代器。 |
5 |
read([size]) 从文件中读取最多 size 个字节(如果读取在获取 size 个字节之前达到 EOF,则更少)。 |
6 |
readline([size]) 从文件中读取一整行。 尾随换行符保留在字符串中。 |
7 |
readlines([sizehint]) 使用 readline() 读取直到 EOF 并返回包含行的列表。 |
8 |
seek(offset[, whence]) 设置文件的当前位置。 0-开始 1-当前 2-结束。 |
9 |
seek(offset[, whence]) 设置文件的当前位置。 0-开始 1-当前 2-结束。 |
10 |
tell() 返回文件的当前位置 |
11 |
truncate([size]) 截断文件的大小。 |
12 |
write(str) 将字符串写入文件。 没有返回值。 |