Python 中的文件处理是一种功能强大且用途广泛的工具,可用于执行各种操作。但是,在编写 Python 程序时,我们需要考虑文件处理的优缺点,以确保代码安全、可靠且性能良好。
Python 文件处理
Python 支持文件处理,并允许用户处理文件,即读取和写入文件,以及许多其他文件处理选项,以对文件进行操作。文件处理的概念已经延伸到其他各种语言中,但实现要么复杂,要么冗长,就像 Python 的其他概念一样,这里的概念也简单而简短。Python 将文件以不同的方式视为文本或二进制文件。每行代码都包含一个字符序列,它们形成一个文本文件。文件的每一行都以一个特殊字符结尾,称为 EOL 或行尾字符,如逗号{,}
或换行符
。它结束当前行,并告诉解释器新行已经开始。让我们从读取和写入文件开始。
Python 中文件处理的优势
- 多功能性:Python 中的文件处理允许您执行广泛的操作,例如创建、读取、写入、附加、重命名和删除文件。
- 灵活性:Python 中的文件处理非常灵活,因为它允许您处理不同的文件类型(例如文本文件、二进制文件、CSV 文件等),并对文件执行不同的操作(例如读取、写入、追加等)。
- 用户友好:Python 为文件处理提供了一个用户友好的界面,使创建、读取和操作文件变得容易。
- 跨平台:Python 文件处理功能可在不同平台(例如 Windows、Mac、Linux)上运行,从而实现无缝集成和兼容性。
Python 中文件处理的缺点
- 容易出错:Python 中的文件处理操作容易出错,尤其是在代码编写不仔细或文件系统存在问题(例如文件权限、文件锁定等)的情况下。
- 安全风险:Python 中的文件处理也可能带来安全风险,尤其是当程序接受可用于访问或修改系统上的敏感文件的用户输入时。
- 复杂性:Python 中的文件处理可能很复杂,尤其是在使用更高级的文件格式或操作时。必须仔细注意代码,以确保正确且安全地处理文件。
- 性能:Python 中的文件处理操作可能比其他编程语言慢,尤其是在处理大文件或执行复杂操作时。
Python 打开文件
打开文件是指准备好文件以供读取或写入。这可以使用 open()
函数来完成。此函数返回一个文件对象并采用两个参数,一个接受文件名,另一个接受模式(访问模式)。
现在,问题出现了,什么是访问模式?
访问模式控制打开的文件中可能的操作类型。它指的是文件打开后的使用方式。这些模式还定义文件句柄在文件中的位置。文件句柄类似于游标,它定义了数据必须在文件中读取或写入的位置。Python 中有 6 种访问模式。
模式 | 描述 |
---|---|
r | 打开文本文件进行阅读。如果文件不存在,则引发 I/O 错误。 |
r | 打开文件进行读取和写入。如果文件不存在,则引发 I/O 错误。 |
w | 打开文件进行写入。如果文件已存在,则截断该文件。如果新文件不存在,则创建新文件。 |
w | 打开文件进行读取和写入。如果文件已存在,则截断该文件。如果新文件不存在,则创建新文件。 |
a | 打开文件进行写入。正在写入的数据将插入到文件的末尾。如果新文件不存在,则创建新文件。 |
a | 打开文件进行读取和写入。正在写入的数据将插入到文件的末尾。如果新文件不存在,则创建新文件。 |
rb | 打开文件以二进制格式读取。如果文件不存在,则引发 I/O 错误。 |
rb | 打开文件以二进制格式进行读写。如果文件不存在,则引发 I/O 错误。 |
wb | 打开文件以二进制格式写入。如果文件已存在,则截断该文件。如果新文件不存在,则创建新文件。 |
wb | 打开文件以二进制格式进行读写。如果文件已存在,则截断该文件。如果新文件不存在,则创建新文件。 |
ab | 打开文件以二进制格式进行追加。在文件末尾插入数据。如果新文件不存在,则创建新文件。 |
ab | 打开文件以二进制格式读取和追加。在文件末尾插入数据。如果新文件不存在,则创建新文件。 |
语法:
代码语言:python代码运行次数:0复制File_object = open(r"File_Name", "访问模式")
注意:该文件应与 Python 脚本位于同一目录中,否则应写入文件的完整地址。如果文件不存在,则会生成一个错误,即该文件不存在。
Python 读取文件
在此示例中,我们从 Txt 文件中读取数据。我们使用read()
来读取数据。
file1 = open("myfile.txt")
print(file1.read())
file1.close()
注意:在上面的示例中,我们没有提供访问模式。默认情况下,如果未提供任何参数,open()
函数将在读取模式下打开文件。
Python 添加数据
如果要将更多数据添加到已创建的文件中,则访问模式应为“a”,即追加模式,如果我们选择“w”模式,则现有文本将被新数据覆盖。
代码语言:python代码运行次数:0复制# 打开一个文件
# Open函数用于以追加模式打开文件 "myfile.txt"
# (同一目录)并将其引用存储在变量file1中
file1 = open("myfile.txt" , "a" )
# 写入文件
file1.write("nWriting to file:)" )
# 关闭文件
file1.close()
Python 写入文件
在此示例中,我们使用“w ”
,它从文件中删除了内容,写入了一些数据,并将文件指针移动到开头。
# 打开一个文件进行写入和读取
file = open('test.txt', 'w ')
# 向文件写入一些数据
file.write('Hello, world!')
# 将文件指针移回文件开头
file.seek(0)
# 从文件中读取数据
data = file.read()
# 将数据打印到控制台
print(data)
# 完成后关闭文件
file.close()
读取模式
如何在 Python 中读取文件的方法不止一种。让我们看看如何在读取模式下读取文件的内容。
示例 1:
open 命令将在读取模式下打开 Python 文件,for 循环将打印文件中的每一行。
代码语言:python代码运行次数:0复制# 以读取模式打开名为 "geek" 的文件。
file = open('geek.txt', 'r')
# 这将逐行打印文件中的每一行。
for each in file:
print(each)
示例 2:
在此示例中,我们将提取一个包含 Python 文件中所有字符的字符串,然后我们可以使用 file.read()。
代码语言:python代码运行次数:0复制# Python代码示例,演示 read() 模式
file = open("geeks.txt", "r")
print(file.read())
示例 3:
在此示例中,我们将了解如何在 Python 中使用 with 语句读取文件。
Python 中的 with 语句用于异常处理,以使代码更简洁、更具可读性。它简化了文件流等常见资源的管理。与上述实现不同,使用 with 语句时无需调用 file.close()。with 语句本身可确保正确获取和释放资源。
语法:
代码语言:python代码运行次数:0复制with open filename as file:
代码语言:python代码运行次数:0复制# with()语句
with open("geeks.txt") as file:
data = file.read()
print(data)
示例 4:
读取文件的另一种方法是调用一定数量的字符,如以下代码所示,解释器将读取存储数据的前五个字符并将其作为字符串返回:
代码语言:python代码运行次数:0复制# 字符读取(read() 模式)
file = open("geeks.txt", "r")
print(file.read(5))
示例 5:
我们还可以在 Python 中读取文件时拆分行。split() 函数在遇到空格时拆分变量。您还可以根据需要使用任何字符进行拆分。
代码语言:python代码运行次数:0复制# split()函数
with open("geeks.txt", "r") as file:
data = file.readlines()
for line in data:
word = line.split()
print(word)
读取方法
有三种方法可以从文本文件中读取数据。
read() :以字符串形式返回读取的字节。读取 n 个字节,如果未指定 n,则读取整个文件。
代码语言:python代码运行次数:0复制File_object.read([n])
readline() :读取文件的一行并以字符串的形式返回。对于指定的 n,最多读取 n 个字节。但是,即使 n 超过行的长度,也不会读取多一行。
代码语言:python代码运行次数:0复制File_object.readline([n])
readlines() :读取所有行并将它们作为列表中的字符串元素返回。
代码语言:python代码运行次数:0复制File_object.readlines()
注意:“n”被视为两个字节的特殊字符。
使用 readline() 逐行从文件中读取数据
Python 中的 readline() 方法用于从已打开读取的文件中读取一行。当在代码中使用 readline() 时,它会读取文件的下一行并将其作为字符串返回。
在此示例中,我们将从名为 test.txt 的文件中逐行读取数据并将其打印到终端中。
代码语言:python代码运行次数:0复制# 打开一个文件进行读取
file = open('test.txt', 'r')
# 读取文件的第一行
line = file.readline()
# 循环遍历文件的其余部分并打印每一行
while line:
print(line)
line = file.readline()
# 完成后关闭文件
file.close()
写入模式
使用 write() 函数创建文件
就像在 Python 中读取文件一样,有很多方法可以在 Python 中写入文件。在 Python 中使用write()
函数编写文件的内容。
示例 1:
在此示例中,我们将看到如何使用写入模式和 write() 函数写入文件。close() 命令终止所有正在使用的资源,并释放此特定程序的系统。
代码语言:python代码运行次数:0复制file = open('geek.txt','w')
file.write("This is the write command")
file.write("It allows us to write in a particular file")
file.close()
示例 2:
我们还可以将书面语句与 with() 函数一起使用。
代码语言:python代码运行次数:0复制
with open("file.txt", "w") as f:
f.write("Hello World!!!")
追加模式
示例:
对于此示例,我们将使用在上一个示例中创建的 Python 文件。
代码语言:python代码运行次数:0复制file = open('geek.txt', 'a')
file.write("This will add this line")
file.close()
Python 文件处理中还有各种其他命令用于处理各种任务:
代码语言:javascript复制rstrip(): 这个函数将文件的每一行从右边去掉空格。
lstrip(): 这个函数将文件的每一行从左侧去掉空格。
它旨在在处理代码时提供更简洁的语法和异常处理。这就解释了为什么在适用的情况下将它们与语句一起使用是一种很好的做法。这很有帮助,因为使用这种方法,任何打开的文件都会在完成后自动关闭,因此会自动清理。
实现文件处理中的所有功能
在这个例子中,我们将介绍上面看到的所有概念。除此之外,我们还将看到如何使用 Python os 模块中的 remove() 函数删除文件。
代码语言:python代码运行次数:0复制import os
def create_file(filename):
try:
with open(filename, 'w') as f:
f.write('Hello, world!n')
print("文件 " filename " 创建成功。")
except IOError:
print("错误:无法创建文件 " filename)
def read_file(filename):
try:
with open(filename, 'r') as f:
contents = f.read()
print(contents)
except IOError:
print("错误:无法读取文件 " filename)
def append_file(filename, text):
try:
with open(filename, 'a') as f:
f.write(text)
print("文本成功追加到文件 " filename "。")
except IOError:
print("错误:无法追加到文件 " filename)
def rename_file(filename, new_filename):
try:
os.rename(filename, new_filename)
print("文件 " filename " 成功重命名为 " new_filename "。")
except IOError:
print("错误:无法重命名文件 " filename)
def delete_file(filename):
try:
os.remove(filename)
print("文件 " filename " 成功删除。")
except IOError:
print("错误:无法删除文件 " filename)
if __name__ == '__main__':
filename = "example.txt"
new_filename = "new_example.txt"
create_file(filename)
read_file(filename)
append_file(filename, "This is some additional text.n")
read_file(filename)
rename_file(filename, new_filename)
read_file(new_filename)
delete_file(new_filename)