Python 简明教程
Python - Read Files
从文件中读取涉及打开文件、读取其内容,然后关闭文件释放系统资源。Python 提供了多种从文件中读取的方法,每种方法都适合不同的用例。
Opening a File for Reading
打开文件是读取其内容的第一步。在 Python 中,可以使用 open() 函数打开文件。此函数至少需要一个 filename 的参数,还可以使用 mode 来指定文件打开的目的。
若要打开一个文件来读取,可以使用模式 'r' 。这是默认模式,所以如果您只需要从文件中读取,可以省略此模式。
Reading a File Using read() Method
read() 方法用于在 Python 中读取文件内容。它将文件的整个内容读作一个字符串。当需要一次处理整个文件时,此方法特别有用。
Reading a File Using readline() Method
readline() 方法用于一次从文件中读取一行。当需要逐行处理文件时此方法特别有用,尤其是对于一次读取整个内容不切实际的大文件。
Reading a File Using readlines() Method
readlines() 方法读取文件中的所有行,并作为字符串列表返回。列表中的每个字符串都代表文件中的单行,包括每行末尾的换行符。
当需要一次处理或分析文件的所有行时,此方法特别有用。
Syntax
以下是 Python 中 readlines() 方法的基本语法 −
file_object.readlines(hint)
其中,
-
file_object 是由 open() 函数返回的文件对象。
-
hint 是一个可选参数,指定要读取的字节数。如果指定了此参数,它会读取指定字节数的行,而不一定会读取整个文件。
Example
在此示例中,以只读模式打开文件“example.txt”。然后使用 readlines() 方法读取文件中的所有行,并作为字符串列表返回 −
# Open the file in read mode
file = open('example.txt', 'r')
# Read all lines from the file
lines = file.readlines()
# Print the lines
for line in lines:
print(line, end='')
# Close the file
file.close()
以上代码的输出如下所示 −
welcome to Tutorialspoint.
Hi Surya.
How are you?.
Reading a File in Binary Mode
默认情况下,对文件对象执行的读/写操作在文本字符串数据上进行。如果我们要处理不同类型文件,例如媒体文件 (mp3)、可执行文件 (exe) 或图片 (jpg),则必须通过在读/写模式中添加 'b' 前缀以二进制模式打开文件。
Reading Integer Data From a File
要将整数数据写入二进制文件,应使用 to_bytes() 方法将整数对象转换为字节。
Reading Float Data From a File
对于在二进制文件中处理浮点数数据,我们需要使用来自 Python 标准库的 struct 模块。此模块有助于在 Python 值和表示为 Python 字节对象的 C 结构之间进行转换。
Writing a Float to a Binary File
要将浮点数数据写入二进制文件,我们将使用 struct.pack() 方法将浮点数转换为字节对象 −
import struct
# Define a floating-point number
x = 23.50
# Pack the float into a binary format
data = struct.pack('f', x)
# Open the file in binary write mode and write the packed data
with open('test.bin', 'wb') as f:
f.write(data)
Reading Float Numbers from a Binary File
要从二进制文件中读取浮点数数据,我们将使用 struct.unpack() 方法将字节对象转换回浮点数 −
import struct
# Open the file in binary read mode
with open('test.bin', 'rb') as f:
# Read the binary data from the file
data = f.read()
# Unpack the binary data to retrieve the float
x = struct.unpack('f', data)[0]
# Print the float value
print(x)
Reading and Writing to a File Using "r+" Mode
当一个文件打开用于读取 (使用 'r' 或 'rb') 时,不可能写入数据,除非关闭文件并以不同模式重新打开。要同时执行读和写操作,我们在模式参数中添加 '' 字符。使用 'w' 或 'r+' 模式时,可以使用 write() 和 read() 方法,而不必关闭文件。
File 对象还支持 seek() 函数,它允许将读/写指针重新定位到文件中的任何所需的字节位置。
Example
以下程序以 'r+' 模式(读写模式)打开一个文件,寻找文件中的某个位置,并从该位置读取数据 −
# Open the file in read-write mode
with open("foo.txt", "r+") as fo:
# Move the read/write pointer to the 10th byte position
fo.seek(10, 0)
# Read 3 bytes from the current position
data = fo.read(3)
# Print the read data
print(data)
执行上面的代码后,我们得到以下输出: -
rat
Reading and Writing to a File Simultaneously in Python
当一个文件打开用于写入 (使用 'w' 或 'a') 时,不可能从中读取数据,并且尝试这样做会引发 UnsupportedOperation 错误。
类似地,当一个文件打开用于读取 (使用 'r' 或 'rb') 时,不允许写入数据。要在读和写之间切换,通常需要关闭文件,然后以所需模式重新打开。
要同时执行读和写操作,可以在模式参数中添加 '' 字符。使用 'w' 或 'r+' 模式时,可以使用 write() 和 read() 方法,而不必关闭文件。
此外,File 对象还支持 seek() 函数,它允许将读/写指针重新定位到文件中的任何所需的字节位置。
Example
在此示例中,我们以 'r+' 模式打开文件并向文件中写入数据。seek(0) 方法将指针重新定位到文件开头 −
# Open the file in read-write mode
with open("foo.txt", "r+") as fo:
# Write data to the file
fo.write("This is a rat race")
# Rewind the pointer to the beginning of the file
fo.seek(0)
# Read data from the file
data = fo.read()
print(data)
Reading a File from Specific Offset
我们可以使用 seek() 方法在指定偏移处设置他文件当前的位置。
-
如果使用“a”或“a+”打开文件以进行追加,则在下次写入时将取消任何 seek() 操作。
-
如果仅使用“a”以追加模式打开文件以进行写入,则此方法基本上是一种无操作,但对于以启用读模式(模式“a+”)打开的追加模式文件仍然有用。
-
如果使用 't' 以文本模式打开文件,tell() 返回的偏移量合法。使用其他偏移量将导致未定义的行为。
请注意并非所有文件对象都可寻址。
Example
以下示例演示了如何使用 seek() 方法对文件执行同时读/写操作。文件以 w+ 模式(读写模式)打开,添加了一些数据,然后在特定位置读取和修改该文件 −
# Open a file in read-write mode
fo = open("foo.txt", "w+")
# Write initial data to the file
fo.write("This is a rat race")
# Seek to a specific position in the file
fo.seek(10, 0)
# Read a few bytes from the current position
data = fo.read(3)
print("Data read from position 10:", data)
# Seek back to the same position
fo.seek(10, 0)
# Overwrite the earlier contents with new text
fo.write("cat")
# Rewind to the beginning of the file
fo.seek(0, 0)
# Read the entire file content
data = fo.read()
print("Updated file content:", data)
# Close the file
fo.close()
以下是上面代码的输出: -
Data read from position 10: rat
Updated file content: This is a cat race