Python Data Persistence 简明教程

Python Data Persistence - File API

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

另一方面, print() 函数将数据发送到标准输出流设备(即显示器)。Python 程序通过 sys 模块中定义的标准流对象 stdinstdout 与这些 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()

Example

` readlines() ` 方法返回字符串列表,其中每个字符串表示该文件中的一个行。也可以逐行读取该文件,直到达到文件结尾。

f=open('test.txt','r')
while True:
   line=f.readline()
   if line=='' : break
   print (line, end='')
f.close()

Output

Hello TutorialsPoint
Python Tutorials
Java Tutorials
DBMS tutorials
Mobile development tutorials

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) `向该文件写入字符串。没有返回值。