Python 数据持久化 - 文件 API


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

另一方面, print() 函数将数据发送到标准输出流设备,即显示监视器Python程序通过sys模块中定义的标准流对象stdinstdout与这些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()是一个模拟 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 是可选的单字符字符串,用于指定要执行的操作类型(读、写、追加等),缓冲参数是 0、1 或 -1 表示缓冲关闭、打开或系统默认设置。

文件打开方式如下表所示。默认模式是“r”

先生编号 参数及说明
1

打开以供阅读(默认)

2

打开写入,首先截断文件

3

X

创建一个新文件并打开它进行写入

4

A

打开进行写入,如果存在则追加到文件末尾

5

二进制模式

6

时间

文本模式(默认)

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()

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

先生编号 方法及说明
1

关闭()

关闭文件。关闭的文件无法再读取或写入。

2

冲洗()

刷新内部缓冲区。

3

文件编号()

返回整数文件描述符。

4

下一个()

每次调用时返回文件的下一行。在 Python 3 中使用 next() 迭代器。

5

读取([大小])

从文件中读取最多 size 字节(如果在获取 size 字节之前读取达到 EOF,则读取次数较少)。

6

读行([大小])

从文件中读取一整行。尾随换行符保留在字符串中。

7

读取行([大小提示])

使用 readline() 读取直到 EOF 并返回包含行的列表。

8

寻求(偏移[,从哪里])

设置文件的当前位置。0-开始 1-当前 2-结束。

9

寻求(偏移[,从哪里])

设置文件的当前位置。0-开始 1-当前 2-结束。

10

告诉()

返回文件的当前位置

11

截断([大小])

截断文件的大小。

12

写(字符串)

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