Python 读取文件
要使用Python编程从文件中读取数据,首先必须打开它。使用内置的open()函数:
file object = open(file_name [, access_mode][, buffering])
下面是参数细节-
- file_name -file_name参数是一个包含您想要访问的文件的名称的字符串值。
-
access_mode -access_mode确定了文件应该打开的模式,例如读取、写入、追加等。这是一个可选参数,默认文件访问模式为读取(r)。
这两个语句是相同的-
fo = open("foo.txt", "r")
fo = open("foo.txt")
使用File对象的read()方法读取打开文件中的数据。重要的是要注意,Python字符串除了文本数据外,还可以包含二进制数据。
语法
fileObject.read([count])
参数
- count − 要读取的字节数。
这里传递的参数是要从打开的文件中读取的字节数。这个方法从文件的开头开始读取,如果缺少计数参数,则尝试读取尽可能多的内容,直到文件结束。
示例
# Open a file
fo = open("foo.txt", "r")
text = fo.read()
print (text)
# Close the opened file
fo.close()
它将产生以下的 输出 −
Python is a great language.
Yeah its great!!
以二进制模式读取
默认情况下,对文件对象的读/写操作是针对文本字符串数据的。如果我们想处理不同类型的文件,如媒体文件(mp3)、可执行文件(exe)、图片文件(jpg)等,我们需要在读/写模式前添加’b’前缀。
假设 test.bin 文件已经使用二进制模式写入。
f=open('test.bin', 'wb')
data=b"Hello World"
f.write(data)
f.close()
我们需要使用“rb”模式来读取二进制文件。在打印之前,read()方法的返回值将首先解码。
f=open('test.bin', 'rb')
data=f.read()
print (data.decode(encoding='utf-8'))
它将产生以下 输出 。
Hello World
从文件中读取整数数据
为了将整数数据写入二进制文件中,应该使用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)
使用r+模式
当一个文件被用于读取(使用’r’或’rb’)时,无法向其中写入数据。在进行其他操作之前,我们需要关闭文件。为了同时执行这两种操作,我们需要在模式参数中添加’+’字符。因此,’w+’或’r+’模式可以在不关闭文件的情况下使用write()和read()方法。
文件对象也支持seek()函数,以将流倒回到任意字节位置进行读取。
seek()方法的语法如下:
fileObject.seek(offset[, whence])
参数
- offset − 这是文件中读/写指针的位置。
-
whence − 这是可选的,默认为0,表示绝对文件定位,其他值为1表示相对于当前位置的查找,2表示相对于文件末尾的查找。
让我们使用seek()方法来展示如何从特定的字节位置读取数据。
示例
该程序以w+模式(读写模式)打开文件,添加一些数据。然后它在文件中寻找特定的位置,并用新文本覆盖其先前的内容。
fo=open("foo.txt","r+")
fo.seek(10,0)
data=fo.read(3)
print (data)
fo.close()
它将产生以下 输出 –
rat
Python同时读写
当以写入(’w’或’a’)的方式打开文件时,不可能从中读取,反之亦然。这样做会引发不支持操作错误。在执行其他操作之前,我们需要关闭文件。
为了同时执行这两个操作,我们必须在mode参数中添加’+’字符。因此,’w+’或’r+’模式可以使用write()和read()方法而不关闭文件。文件对象还支持seek()函数,以将流重置到任何所需的字节位置。
seek()方法
seek()方法将文件的当前位置设置为指定的偏移量。whence参数是可选的,默认为0,表示绝对文件定位,其他值为1表示相对于当前位置的查找,2表示相对于文件结尾的查找。
该方法没有返回值。请注意,如果文件以追加方式打开(使用’a’或’a+’),任何seek()操作都将在下一次写入时被撤消。
如果文件仅以追加模式打开,并启用了读取(模式’a+’),则该方法本质上是无操作的,但对于以追加模式打开且启用了读取的文件(模式’a+’),它仍然有用。
如果以文本模式(’t’)打开文件,只有由tell()返回的偏移量是合法的。使用其他偏移量会导致未定义的行为。
请注意,并非所有文件对象都支持seek操作。
语法
seek()方法的语法如下:
fileObject.seek(offset[, whence])
参数
- offset - 这是文件中读写指针的位置。
-
whence - 这是可选的,默认为0,表示绝对文件定位,其他值为1表示相对于当前位置的查找,2表示相对于文件末尾的查找。
让我们使用seek()方法来展示如何在文件上同时进行读写操作。
下面的程序以w+模式打开文件(即读写模式),添加一些数据。然后在文件中寻找特定位置,并使用新文本覆盖其之前的内容。
示例
# Open a file in read-write mode
fo=open("foo.txt","w+")
fo.write("This is a rat race")
fo.seek(10,0)
data=fo.read(3)
fo.seek(10,0)
fo.write('cat')
fo.seek(0,0)
data=fo.read()
print (data)
fo.close()
输出
This is a cat race