文件操作
学习编程操作中,我觉得文件操作是必不可少的一部分。不管是读书的时候学习的c,c++,工作的前学的java,现在学的Python,没学过的php和go,都有文件操作的模块以及库的支持,重要性毫无疑问。
学习文件操作是编程技能体系中不可或缺的一部分,它对于数据管理、程序间通信、系统维护等多个方面都具有重要意义。
- 数据持久化:程序运行过程中产生的数据,通过文件操作可以保存到磁盘上,实现数据的长期存储。这样即使程序关闭或系统重启,数据依然存在,保证了信息的持久性。
- 信息交换:文件是程序之间交换数据的一种常见方式。一个程序可以通过读取另一个程序写入的文件来获取数据,或者将自己的处理结果写入文件供其他程序使用,增强了软件之间的兼容性和协同工作能力。
- 配置与日志:许多应用程序会使用配置文件来存储设置信息,使得用户无需修改源代码即可调整程序行为。同时,通过记录日志文件,开发者可以追踪程序运行状态,便于调试和故障排查。
- 资源管理:在开发多媒体应用、网页服务或其他需要处理大量静态资源(如图片、视频、文档)的场景中,有效地读取、写入和管理这些文件资源是必不可少的技能。
- 提升编程能力:掌握文件操作能够加深对操作系统如何管理和访问文件系统的理解,这是编程基础中的重要一环。它涉及到路径管理、权限控制、缓冲区使用等概念,有助于培养良好的编程习惯和问题解决能力。
- 跨平台开发:了解不同操作系统(如Windows、Linux、macOS)下文件操作的差异,可以帮助开发者编写更加健壮、可移植的代码,适应多样化的开发环境。
文件读取是Python标准库就支持的操作,也就是说我们可以直接使用内置函数来进行文件的读取,市面上也许有第三方库支持更加细腻功能更多更简便的文件操作,但是今天我们只讲标准库中的操作。
废话不多说,进入正题。
文件路径
在将实际的操作之前,讲一下文件的相对路径和绝对路径。对后面操作文件时有一定的帮助。
在计算机文件系统中,文件路径是用来定位文件位置的字符串。
根据路径参照点的不同,文件路径主要分为两类:相对路径和绝对路径。
绝对路径(Absolute Path)
绝对路径是从文件系统的根目录(如 Windows 的盘符 C:,Linux 和 macOS 的 /)开始的完整路径,能够唯一确定文件的位置,不依赖于当前工作目录。
例如:
Windows: C: Users/Username/Documents/example.txt
Linux/macOS: /home/user/documents/example.txt
相对路径(Relative Path)
相对路径是相对于当前工作目录(即你当前所在的位置)的路径。使用相对路径时,文件的位置是相对于执行代码或命令时的工作目录来决定的。
例如:
如果当前目录是 /home/user/documents/,那么引用 example.txt 的相对路径只需写成 example.txt
或者 ./example.txt(. 表示当前目录)。
要访问同一级目录下的 pictures 文件夹里的 image.jpg,可以写成 pictures/image.jpg。
使用 … 可以向上一级目录移动,如从 /home/user/documents/ 访问 downloads 文件夹下的文件,则路径为 …/downloads/file.zip。
选择何时使用
绝对路径适用于需要明确指定文件位置,不受当前工作目录影响的场景,如配置文件中的资源路径、系统服务启动脚本等。
相对路径更适用于项目内部文件引用,特别是在代码或脚本中,因为它们往往与项目的结构紧密相关,且易于迁移和维护。
理解并恰当使用这两种路径类型,对于编写跨平台、易维护的代码至关重要。
文件读取
-
创建读取目标和读取模块。我先新建一个txt文件用作读取目标。同时新建一个文件模块,用于今天的学习。
-
读取文件。
两行行代码,一行完成了文件的读取,一行完成了打印。注意我的文件内容是中文,所以指定了编码,不指定的话可能会报错。with open('test_file.txt', encoding="utf-8") as file_object: print(file_object.read())
with:关键字with 在不再需要访问文件后将其关闭。通常在进行流操作的时候,会有open操作和对应的close操作,这种操作的目的是保证流能够正确的开启和关闭,当流未关闭时,再次访问可能出现未知的错误,甚至流不关闭本身就会导致问题。但是手动的close流,有一个问题就是并非在任何情况下都能轻松确定关闭文件的恰当时机,但通过使用with,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。
open()。这是Python中读取文件的函数。介绍一下open函数得入参:
- file (必填): 字符串类型,表示要打开的文件的路径和名称。
- mode (可选): 字符串类型,表示文件的打开模式。常见的模式有:
2.1 ‘r’: 读取(默认)
2.2 ‘w’: 写入,会覆盖原有文件内容
2.3 ‘a’: 追加,在文件末尾添加内容
2.4 ‘b’: 二进制模式
2.5 ‘+’: 读写模式,可以与上述模式组合,如 ‘r+’, ‘w+’, ‘a+’- encoding (可选): 字符串类型,指定文件的编码方式,如 ‘utf-8’, ‘gbk’。默认为 None,则使用系统默认编码。
- buffering (可选): 控制缓冲策略。默认为 -1,表示使用默认缓冲策略;0 表示不缓冲;大于 1 的整数表示缓冲区大小;1 表示行缓冲(对于文本模式)。
- errors (可选): 指定如何处理编码和解码错误,如 ‘strict’, ‘ignore’, ‘replace’ 等。
- newline (可选): 控制换行符的处理方式,如 ‘n’, ‘rn’, ‘’(读取时不转换,写入时不添加)。
- closefd (可选): 布尔值,对于特殊文件描述符是否关闭,默认为 True。
- opener (可选): 一个可调用对象,用于自定义文件打开方式。
在示例中,我们使用两个参数,必填的文件路径和选填的文件编码方式。文件路径因为我们是放在了项目目录里面。所以直接用的相对路径,当然我们也可以使用绝对路径。但是要注意的是Windows系统,在文件路径中使用的是反斜杠。
with open('D:\测试文件\test_file.txt', encoding="utf-8") as file_object:
print(file_object.read())
使用绝对路径的方式,我们同样打开并读取了在D盘中的test_file.txt文件。
- 按行读取文件
通过for循环,我们可以直接读取文件中的每一行的数据,并且将数据放到一个列表中进行存储。由于我们在文件中是本身就通过回车换行,所以读取的内容也带换行符,我们可以通过字符串去空白的函数去掉。
file_line_list_1 = []
file_line_list_2 = []
with open('test_file.txt', encoding="utf-8") as file_object:
line_num = 0
for line in file_object:
line_num += 1
print(f"我是第{line_num}行,内容是{line}")
file_line_list_1.append(line)
file_line_list_2.append(line.rstrip())
print(file_line_list_1)
print(file_line_list_2)
- 读取指针
我们在分行读取完文件后,在进行打印读取内容的操作,发现打印的内容是空的,为什么?
with open("D:\\测试文件\\test_file.txt", encoding="utf-8") as file_object:
for line in file_object:
print(line)
print("============分隔===========")
print(file_object.read())
大家要注意,Python读取文件的时候有一个指针,读取以后指针会停在最后读取的位置,在上述代码中,我们分行读取后,指针已经停留到了最后一行,再进行读取的时候,就读取到了空的内容。
这种情况怎么办呢?使用seek()函数,可以修改指针位置。
seek()函数接收两个参数:
offset:偏移量,即从参照点移动的字节数。
whence:可选参数,默认值为 0,表示从文件开头开始计算偏移量;如果为1,则表示从当前位置开始计算;如果为 2,则表示从文件末尾开始计算。
所以我们在第二次读取前调用一次seek函数即可。
with open("D:\\测试文件\\test_file.txt", encoding="utf-8") as file_object:
for line in file_object:
print(line)
print("============分隔===========")
file_object.seek(0)
print(file_object.read())
文件内容成功读取并打印。
文件写入
在介绍open函数入参的时候,其实已经讲到了怎么写入文件。通过open函数的传参。
在Python中,文件就是打开和关闭,区别在打开的模式是读取还是写入又或者是其他模式。
with open('test_file.txt', mode="w", encoding="utf-8") as file_object:
file_object.write("给测试文件写点东西")
文件执行在运行框没有信息,但是打开目标文件发现,内容已经写入。注意前面已经说过,“w"是覆盖模式。
如果你想追加内容,使用mode参数值应该设置为"a”。附加模式下,如果你输入的文件不存在,还会给你创建一个文件。
with open('test_file.txt', mode="a", encoding="utf-8") as file_object:
file_object.write("给测试文件写点东西")
可以看到直接拼接在了最后一行上面,如果你想换下一行拼接,应该怎么办呢?加上换行符,就这么简单!
多次写入
其实多次写入相比和单次相比,重复调用write函数即可。
with open('test_file.txt', mode="a", encoding="utf-8") as file_object:
file_object.write("\n给测试文件写一点东西")
file_object.write("\n给测试文件写两点东西")
file_object.write("\n给测试文件写三点东西")
file_object.write("\n给测试文件写四点东西")
file_object.write("\n给测试文件写五点东西")
file_object.write("\n给测试文件写六点东西")
多行写入也成功了,是不是很简单。
结尾
文件的读取和写入也讲到这里,只是初级的应用,应对大部分需要操作文件的场景就够了,大家要好好练习。进阶阶段的知识,不敲几次加深印象等于白学了。
点赞收藏关注,感谢支持!!!
作业
- 读取文件。
- 逐行读取并进行添加条件语句进行输出。
- 写入文件,更改文件信息。
- 使用附加模式,创建一个文件。