Python 数据持久化 - 文件 API



Python 使用内置的 input()print() 函数执行标准输入/输出操作。input() 函数从标准输入流设备(即键盘)读取字节。

另一方面,print() 函数将数据发送到标准输出流设备(即显示器)。Python 程序通过 sys 模块中定义的标准流对象 stdinstdout 与这些 I/O 设备交互。

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() 是一个模拟 stdout 对象的 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”

序号 参数和描述
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 错误。我们需要在执行其他操作之前关闭文件。

为了同时执行这两个操作,我们必须在 mode 参数中添加“+”字符。因此,“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()

下表总结了文件式对象可用的所有方法。

序号 方法和描述
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)

将字符串写入文件。没有返回值。

广告