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 - 要读取的字节数。

这里,传递的参数是要从打开的文件中读取的字节数。此方法从文件开头开始读取,如果 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() 方法,而无需关闭文件。

File 对象还支持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”)时,无法从中读取文件,反之亦然。这样做会引发 UnSupportedOperation 错误。我们需要在进行其他操作之前关闭该文件。

为了同时执行这两个操作,我们必须在模式参数中添加“+”字符。因此,“w+”或“r+”模式允许使用 write() 和 read() 方法,而无需关闭文件。File 对象还支持seek() 函数来将流倒回到任何所需的字节位置。

search() 方法

eek() 方法将文件的当前位置设置为偏移量。whence 参数是可选的,默认为 0,表示绝对文件定位,其他值为 1 表示相对于当前位置查找,2 表示相对于文件末尾查找。

没有返回值。请注意,如果使用“a”或“a+”打开文件进行追加,则任何seek()操作都将在下次写入时撤消。

如果仅使用“a”在附加模式下打开文件进行写入,则此方法本质上是无操作,但对于在启用读取(模式“a+”)的附加模式下打开的文件仍然有用。

如果使用“t”以文本模式打开文件,则只有tell() 返回的偏移量才是合法的。使用其他偏移量会导致未定义的Behave。

请注意,并非所有文件对象都是可查找的。

句法

以下是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