Python数据的持久性 文件API

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)

名称参数,是磁盘文件的名称或字节串,模式是可选的一个字符串,用于指定要执行的操作类型(读、写、追加等),缓冲参数是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控制台。文件对象也支持 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+’模式可以在不关闭文件的情况下使用写()和读()方法。文件对象还支持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) 向文件中写入一个字符串。没有返回值。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程