Python Data Persistence 简明教程
Python Data Persistence - File API
Python 使用内置 input() 和 print() 函数来执行标准输入/输出操作。input() 函数从标准输入流设备(即键盘)读取字节。
另一方面, print() 函数将数据发送到标准输出流设备(即显示器)。Python 程序通过 sys 模块中定义的标准流对象 stdin 和 stdout 与这些 IO 设备进行交互。
input() 函数实际上是 sys.stdin 对象的 readline() 方法的包装函数。接收所有来自输入流中的击键操作,直至按下「回车」键。
>>> 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() 是一个编写 stdout 对象的 write() 方法的简便函数。
>>> x='Welcome to TutorialsPoint\n'
>>> sys.stdout.write(x)
Welcome to TutorialsPoint
26
如同 stdin 和 stdout 预定义的流对象,Python 程序可以从磁盘文件或网络套接字读取数据并向其发送数据。它们也是流。任何具有 read() 方法的对象都是输入流。具有 write() 方法的任何对象都是输出流。通过获取对流对象的引用,借助内置的 open() 函数,可以与流建立通信。
open() function
这个内置函数使用以下参数:
f=open(name, mode, buffering)
name 参数是磁盘文件或字节字符串的名称,mode 是可选项,指定要执行的操作类型(读取、写入、追加等)的单字符字符串,buffering 参数为 0、1 或 -1,表示缓冲为关闭、开启或系统默认。
文件打开模式中根据下表进行枚举。默认模式为‘r’
Sr.No |
Parameters & Description |
1 |
R Open for reading (default) |
2 |
* W 打开用于写入,首先截断文件 |
3 |
* X 创建新文件并打开以进行写入 |
4 |
* A 打开用于写入,如果存在文件,则追加到文件末尾 |
5 |
B Binary mode |
6 |
T Text mode (default) |
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 控制台中显示。文件对象还支持 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()
Binary mode
默认情况下,在文件对象上执行的读/写操作针对文本字符串数据执行。如果我们想处理其他不同类型(例如媒体(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)
Simultaneous read/write
当某一文件打开进行写入(使用“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 |
Method & Description |
1 |
` close() `关闭该文件。无法再从关闭的文件读取或写入。 |
2 |
flush() Flush the internal buffer. |
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]) Truncates the file’s size. |
12 |
` write(str) `向该文件写入字符串。没有返回值。 |