从文件读取数据涉及打开文件,读取其内容,然后关闭文件以释放系统资源。Python 提供了几种方法来从文件读取数据,每种方法适合不同的应用场景。
打开文件用于读取
打开文件是读取其内容的第一步。在 Python 中,使用 open()
函数来打开文件。此函数至少需要一个参数,即文件名,并可选地指定打开文件的目的模式。
为了以读取模式打开文件,你使用 'r'
模式。这是默认模式,所以如果你只需要从文件读取数据,你可以省略它。
使用 read()
方法读取文件
read()
方法用来读取文件的内容。它读取文件的全部内容作为一个单一的字符串。当你需要一次处理整个文件时,这种方法特别有用。
语法
下面是 read()
方法的基本语法:
file_object.read(size)
其中,
-
file_object
是由 open()
函数返回的文件对象。
-
size
是要从文件中读取的字节数。这是一个可选参数。如果省略或设置为负数,则方法会读取到文件末尾。
示例
在下面的示例中,我们以读取模式打开文件 example.txt
。然后使用 read()
方法读取文件的全部内容:
file = open('example.txt', 'r')
content = file.read()
print(content)
file.close()
执行以上代码后,得到的输出如下:
welcome to Tutorialspoint.
Learn Python in-depth with real-world projects through our Python certification course. Enroll and become a certified expert to boost your career.
使用 readline()
方法读取文件
readline()
方法用来一次读取文件的一行。当你需要逐行处理文件时,特别是在读取整个内容不实际的大文件时,这种方法很有用。
语法
下面是 readline()
方法的基本语法:
file_object.readline(size)
其中,
-
file_object
是由 open()
函数返回的文件对象。
-
size
是一个可选参数,指定从行中读取的最大字节数。如果省略或设置为负数,则方法读取到行末尾。
示例
在下面的示例中,我们以读取模式打开文件 example.txt
。然后使用 readline()
方法读取文件的第一行:
file = open('example.txt', 'r')
line = file.readline()
print(line)
file.close()
上面代码的输出如下:
welcome to Tutorialspoint.
使用 readlines()
方法读取文件
readlines()
方法读取文件的所有行并将其作为字符串列表返回。列表中的每个字符串代表文件中的一行,包括每一行末尾的新行字符。
当需要一次处理或分析文件的所有行时,这种方法特别有用。
语法
下面是 readlines()
方法的基本语法:
file_object.readlines(hint)
其中,
-
file_object
是由 open()
函数返回的文件对象。
-
hint
是一个可选参数,指定要读取的字节数。如果指定,它读取指定字节数的行,不一定读取整个文件。
示例
在这个例子中,我们以读取模式打开文件 example.txt
。然后使用 readlines()
方法读取文件的所有行并将其作为一个字符串列表返回:
file = open('example.txt', 'r')
lines = file.readlines()
for line in lines:
print(line, end='')
file.close()
上面代码的输出如下:
welcome to Tutorialspoint.
Hi Surya.
How are you?.
使用 “with” 语句
Python 中的 “with” 语句用于异常处理。在处理文件时,使用 “with” 语句可以确保文件在读取后被正确关闭,即使发生了异常也是如此。
当你使用 with
语句打开一个文件时,文件会在块结束时自动关闭,即使块内部发生了错误。
示例
下面是一个简单的示例,展示如何使用 with
语句打开、读取并打印文件的内容:
with open('example.txt', 'r') as file:
content = file.read()
print(content)
我们得到的输出如下:
welcome to Tutorialspoint.
Hi Surya.
How are you?.
在二进制模式下读取文件
默认情况下,对文件对象的操作是在文本字符串数据上执行的。如果我们想处理不同类型的文件,比如媒体文件(mp3)、可执行文件(exe)或图片(jpg),我们必须在读/写模式前加上 'b'
前缀以二进制模式打开文件。
写入二进制文件
假设 test.bin
文件已经在二进制模式下被写入:
with open('test.bin', 'wb') as f:
data = b"Hello World"
f.write(data)
示例
要读取一个二进制文件,我们需要以 'rb'
模式打开它。read()
方法返回的值在打印前需要解码:
with open('test.bin', 'rb') as f:
data = f.read()
print(data.decode(encoding='utf-8'))
它会产生以下输出:
Hello World
从文件中读取整型数据
要将整型数据写入二进制文件,应该使用 to_bytes()
方法将整型对象转换为字节。
写入整型到二进制文件
下面是一个如何将整型写入二进制文件的例子:
n = 25
data = n.to_bytes(8, 'big')
with open('test.bin', 'wb') as f:
f.write(data)
从二进制文件读取整型
要从二进制文件中读回整型数据,需要将 read()
函数的输出转换回整型:
with open('test.bin', 'rb') as f:
data = f.read()
n = int.from_bytes(data, 'big')
print(n)
从文件中读取浮点型数据
对于处理二进制文件中的浮点型数据,我们需要使用 Python 标准库中的 struct
模块。该模块帮助在 Python 值与表示为 Python 字节对象的 C 结构体之间转换。
写入浮点型到二进制文件
要将浮点型数据写入二进制文件,我们使用 struct.pack()
方法将浮点数转换为字节对象:
import struct
x = 23.50
data = struct.pack('f', x)
with open('test.bin', 'wb') as f:
f.write(data)
从二进制文件读取浮点数
要从二进制文件中读取浮点型数据,我们使用 struct.unpack()
方法将字节对象转换回浮点数:
import struct
with open('test.bin', 'rb') as f:
data = f.read()
x = struct.unpack('f', data)[0]
print(x)
使用 ‘r+’ 模式读取和写入文件
当文件以读取模式('r'
或 'rb'
)打开时,除非关闭文件并以不同模式重新打开,否则不可能写入数据。为了同时进行读取和写入操作,可以在模式参数中加上 +
字符。使用 'w+'
或 'r+'
模式可以启用 write()
和 read()
方法而不需要关闭文件。
此外,文件对象支持 seek()
函数,这允许将读/写指针重新定位到文件内的任何期望字节位置。
语法
下面是 seek()
方法的语法:
fileObject.seek(offset[, whence])
参数:
-
offset
—— 这是指定文件内读/写指针的位置。
-
whence
—— 这是可选的,默认为 0
表示绝对文件定位,其他值为 1
表示相对于当前位置定位,2
表示相对于文件末尾定位。
示例
下面的程序以 'r+'
模式(读写模式)打开文件,在文件中的某个位置重新定位,并从该位置读取数据:
with open("foo.txt", "r+") as fo:
fo.seek(10, 0)
data = fo.read(3)
print(data)
执行以上代码后,得到的输出如下:
rat
在 Python 中同时读取和写入文件
当文件以写入模式('w'
或 'a'
)打开时,不可能从中读取,并尝试这样做将会抛出 UnsupportedOperation
错误。
同样,当文件以读取模式('r'
或 'rb'
)打开时,不允许向其中写入。为了在读取和写入之间切换,通常需要关闭文件并以所需的模式重新打开它。
为了同时进行读取和写入操作,可以在模式参数中加上 +
字符。使用 'w+'
或 'r+'
模式可以启用 write()
和 read()
方法而不需要关闭文件。
另外,文件对象支持 seek()
函数,这允许你将读/写指针重新定位到文件内的任何期望字节位置。
示例
在这个示例中,我们在 'r+'
模式下打开文件并向文件写入数据。seek(0)
方法将指针重新定位到文件的开头:
with open("foo.txt", "r+") as fo:
fo.write("This is a rat race")
fo.seek(0)
data = fo.read()
print(data)
从特定偏移量读取文件
我们可以使用 seek()
方法将文件的当前位置设置到指定的偏移量。
如果使用 'a'
或 'a+'
模式打开文件用于追加,则任何 seek()
操作将在下次写入时失效。 如果仅以追加模式 ('a'
) 打开文件用于写入,此方法基本上无效,但它对于以允许读取的追加模式 ('a+'
) 打开的文件仍然有用。 如果使用 't'
模式以文本方式打开文件,则只有 tell()
返回的偏移量是合法的。使用其他偏移量会导致未定义的行为。 注意,并非所有的文件对象都是可寻址的。
示例
下面的示例演示了如何使用 seek()
方法在文件上执行同步的读/写操作。文件以 w+
模式(读写模式)打开,添加一些数据,然后在特定位置读取并修改文件:
fo = open("foo.txt", "w+")
fo.write("This is a rat race")
fo.seek(10, 0)
data = fo.read(3)
print("从位置 10 读取的数据:", data)
fo.seek(10, 0)
fo.write("cat")
fo.seek(0, 0)
data = fo.read()
print("更新后的文件内容:", data)
fo.close()
上面代码的输出如下:
从位置 10 读取的数据: rat
更新后的文件内容: This is a cat race