文件操作
大家好,这个章节我们要讨论的是文件操作,这个话题对每个程序员来说都非常重要。为什么呢?因为文件操作是很多应用程序的核心,特别是对于需要持久化数据的系统,比如数据库、配置文件等。通过文件,我们可以将程序中的数据保存到硬盘中,或者从硬盘中读取数据。在编程中,操作文件就像是和文件系统打交道,我们需要知道如何打开文件、读写文件、关闭文件等基本操作。
简介
文件操作是每一门编程语言中都必不可少的一项语法,通过文件,可以实现数据持久化存储,测试数据驱动文件的处理,程序配置文件的处理等。
在程序中操作文件和使用图形界面操作文件的过程基本一致,都要进行找到文件位置,打开文件,读写文件,关闭文件等操作。
文件操作是编程中不可缺少的一部分,几乎每种编程语言都会提供相应的功能。在 Python 中,我们使用文件操作来实现很多重要功能,比如数据持久化存储、读取配置文件、处理日志文件等等。操作文件的过程,基本上和我们在操作电脑中的文件一样:找到文件,打开它,读取或写入内容,然后最后关闭文件。你可以把文件看作是存储数据的容器,程序通过打开这个容器来获取数据或放入新数据。
打开文件
Python 使用 open 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
Python 提供了 open() 函数来打开文件,它返回一个文件对象,我们通过这个对象来进行后续的文件操作。open() 函数很灵活,可以用来打开不同模式的文件,比如只读、写入或追加等。它的基本语法是 open(file, mode),其中 file 是文件的路径,mode 是文件的打开模式。比如,如果你想以只读的方式打开文件,你可以用 mode='r',如果是写入则可以用 mode='w',这些模式决定了你对文件的权限和操作方式。如果文件打开失败,Python 会抛出一个 OSError 错误。
完整格式:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
完整的语法格式是这样的。
简化格式:
open(file, mode='r', encoding=None)
file: 必选,指定打开文件的相对路径或者绝对路径。mode: 可选,文件打开模式,默认为r只读模式encoding: 一般使用utf8
我们一般用的比较多的格式是简化之后的。这里的 file 参数就是文件的路径,可以是相对路径或者绝对路径。mode 参数用来指定文件的打开方式,最常见的是 r 表示只读模式。你还可以指定 encoding,一般情况下,我们使用 utf8 编码来确保文件能够正确处理中文字符。
mode 常见参数
| 字符 | 含意 |
|---|---|
r |
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w |
以只写方式打开文件。如果该文件已存在则覆盖文件。如果该文件不存在则创建新文件。 |
a |
以追加写入方式打开文件,如果文件存在则在末尾追加,文件不存在则创建新文件 |
b |
二进制模式 |
t |
文本模式(默认) |
Python 的文件打开模式非常丰富,最常用的是这几个。r 表示以只读方式打开文件,文件指针放在文件开头,这是默认模式。w 表示以写入方式打开文件,如果文件已存在就覆盖,文件不存在则创建新文件。a 表示以追加方式打开文件,文件已存在时内容会被追加到文件末尾,文件不存在则创建新文件。b 表示用二进制模式,用于处理图片、音频等二进制文件。t 代表文本模式。
示例:
# 以写入文件打开 index.html 文件
file = open("index.html", "w")
比如我们要打开一个文件并写入内容。这里我们使用 open() 打开了 index.html 文件,并指定了模式为 w,表示我们要对文件进行写操作。
文件关闭
文件在操作完以后,需要将其关闭,close() 方法用于关闭一个已打开的文件。
关闭后的文件不能再进行读写操作, 否则会触发 ValueError 错误。
close() 方法允许调用多次。
使用 close() 方法关闭文件是一个好的习惯。
格式:fileObject.close()
# 以写入文件打开 index.html 文件
file = open("index.html", "w")
# 关闭文件
file.close()
文件在操作完后需要关闭,这是一个很好的习惯,因为如果文件长时间处于打开状态,可能会导致系统资源的浪费。Python 提供了 close() 方法来关闭文件。如果你在文件关闭之后尝试读取或写入文件,就会遇到 ValueError 错误。虽然 close() 方法可以多次调用,但是最好在完成文件操作后立即关闭文件,以避免潜在的资源泄露问题。这个例子展示了如何打开一个文件进行写入,并在操作完成后使用 close() 方法关闭文件。
文件写入
write() 方法
write() 方法用于向文件中写入指定字符串。如果文件打开模式为 b,则要将字符串转换成 bytes 类型的二进制字符串,函数返回成功写入数据的长度。
格式:fileObject.write( [ str ])
# 以写入文件打开 index.html 文件
file = open("index.html", "w")
# 写入数据
file.write("<h1>文件写入标题</h1>")
file.write("\n")
file.write("<p>文件写入内容。。。。。。</p>")
# 关闭文件
file.close()
write() 方法允许我们将指定的字符串写入到文件中。你可以用它来写入一些简单的文本数据。如果文件是以二进制模式打开的,那么写入的内容必须是 bytes 类型。如果是文本模式,直接写入字符串就可以了。write() 方法会返回成功写入的字节数。这里的例子演示了如何用 write() 方法将 HTML 内容写入 index.html 文件。每次写入时,你可以指定具体的内容,写完后记得关闭文件。
writelines() 方法
writelines() 方法用于向文件中写入一序列的字符串。
这一序列字符串可以是由迭代对象产生的,如一个字符串列表。
注意:不要被方法名所迷惑,如果每个元素独占一行,需要在数据后指定换行符 \n。
格式:fileObject.writelines(seq)
datas = ["AAAAAAAAAAAA\n","BBBBBBBBBBBB\n","CCCCCCCCCCCC\n","DDDDDDDDDDDD\n"]
file = open('data.txt',"w")
file.writelines(datas)
file.close()
如果你需要一次性写入多行数据,writelines() 方法会非常有用。它接受一个序列(如列表或元组),并将每个元素写入文件。要注意的是,writelines() 不会自动添加换行符,如果你希望每个元素占一行,需要自己加上 \n。这个例子展示了如何将多行数据写入 data.txt 文件。这里我们通过 writelines() 方法将一个字符串列表写入文件,每行数据后面加上了换行符 \n。
读取文件
read() 方法
read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有。
格式:fileObject.read([size=-1])
file = open('data.txt',"r")
# 读取10个字符
content = file.read(10)
print(content)
# 读取所有内容
content = file.read()
print(content)
file.close()
read() 方法允许我们从文件中读取指定的字节数。如果你不指定参数,它会读取整个文件内容。你可以通过设置 size 参数来控制读取的字节数,比如读取前 10 个字符。这个例子演示了如何读取文件中的内容。首先读取前 10 个字符,然后继续读取剩余内容。
readline() 方法
readline() 方法用于从文件读取整行,包括 \n 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 \n 字符。
格式:fileObject.readline(size=-1)
file = open('data.txt',"r")
# 读取10个字符
content = file.readline(10)
print(content)
# 读取文件指针所在行剩余所有内容
content = file.readline()
print(content)
file.close()
readline() 方法每次读取文件的一行内容,包括行末的换行符。如果你指定了 size 参数,它会限制返回的字节数,直到读取到指定的内容。这个例子展示了如何逐行读取文件的内容,readline() 会返回当前行的数据,方便逐行处理。
readlines() 方法
readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表。
格式:fileObject.readlines()
file = open('data.txt',"r")
# 以行为单位读取文件所有的内容
contents = file.readlines()
print(contents)
file.close()
readlines() 方法会一次性读取文件中的所有行,并将它们作为一个列表返回,每行数据是列表的一个元素。不过要注意,如果文件非常大,使用 readlines() 可能会导致内存消耗过多。这个例子会把文件中的所有行都读取出来,并把每一行存储在一个列表中,方便后续处理。
使用 with 语句管理文件
with 语句用于简化文件的打开和关闭操作。它可以确保文件在操作完成后自动关闭,不需要手动调用 close()。
with open('data.txt', 'r') as file:
content = file.read()
print(content)
在前面的例子中,当你打开一个文件后,都需要使用 close() 方法来关闭它。这样做的好处是释放资源,避免文件一直占用内存或其他系统资源。但是如果文件很多,或者在复杂的程序中管理多个文件时,手动关闭每个文件可能会变得繁琐,并且很容易遗漏某些文件没被关闭,这时候就会引发问题。为了避免这种情况,Python 提供了 with 语句,它能帮助我们自动管理文件的打开和关闭。使用 with 语句时,你不需要显式调用 close(),Python 会在你离开 with 语句的作用域时自动关闭文件。这不仅使代码更简洁,还能保证文件在操作结束后总是会被关闭,避免潜在的资源泄露。这也是比较推荐的操作文件的方式。
总结
- 打开文件
- 文件关闭
- 文件写入
- 读取文件
最后来总结一下。这个章节我们学习了如何在 Python 中进行文件操作。从打开文件、写入文件,到读取文件的基本方法,都有详细的介绍。在实际开发中,文件操作是非常常见的需求,无论是保存配置文件,还是处理日志数据,都离不开文件操作。记住,操作完文件后,一定要关闭它,以防止资源浪费。