📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口测试、APPium移动端测试、Python知识、Selenium自动化测试相关、性能测试、性能测试、计算机网络知识、Jmeter、HR面试,命中率杠杠的。(大家刷起来…)
📝 职场经验干货:
大家好!在Python编程中,文件的读写操作是非常基础且重要的一部分。无论是存储数据、读取配置文件,还是记录日志,文件操作都扮演着关键角色。本文将带你深入了解Python中如何高效、安全地进行文件读写操作,帮助你全面掌握这一重要的编程技能。
一、文件操作的重要性
1.1 什么是文件操作?
文件操作指的是在程序中对文件进行读取、写入、修改和删除的过程。通过文件操作,程序可以持久化存储数据,实现数据的长期保存和共享。
用途:
-
数据持久化存储:保存程序运行时生成的数据,确保数据在程序结束后仍然存在。
-
配置文件管理:读取和修改程序的配置参数,方便程序的个性化设置。
-
日志记录:记录程序的运行状态、错误信息和调试信息,便于问题排查和性能优化。
-
数据交换与通信:在不同程序或系统之间传递数据,实现数据的共享和交互。
1.2 文件操作的应用场景
文件操作在实际开发中有着广泛的应用场景,包括但不限于:
-
数据存储与管理:保存用户数据、程序生成的数据等。
-
配置管理:读取和修改程序的配置文件,支持动态配置。
-
日志记录:记录程序的运行日志、错误日志,便于监控和调试。
-
数据分析:处理和分析存储在文件中的数据,如CSV、JSON等格式的数据。
-
备份与恢复:定期备份重要文件,确保数据安全和可恢复性。
二、文件相关的基本概念
2.1 文件类型
2.1.1 文本文件
存储可读的字符数据,如 .txt、.csv、.json、.xml 等。
❝
CSV(Comma-Separated Values,逗号分隔值):一种表格数据格式,每行是一条记录,字段之间用逗号(,)分隔,类似 Excel,但只存文本。适用于简单结构化数据存储。
JSON(JavaScript Object Notation):一种轻量级数据交换格式,使用 键值对(类似 Python 字典)和 数组 组织数据,结构清晰,可读性强,广泛用于前后端数据交互。
XML(Extensible Markup Language,可扩展标记语言):类似 HTML,用标签来组织数据,适用于层次结构(树状)数据,但比 JSON 更冗长,常用于配置文件、文档存储等。
2.1.2 二进制文件
存储非字符数据,如图片、音频、视频、可执行文件等。
❝
二进制文件(Binary File) 是计算机直接存储二进制数据(0 和 1)的文件,与普通的文本文件(Text File)不同,它不能直接用文本编辑器打开和阅读。
2.2 文件路径
-
绝对路径:是指从系统根目录(Windows:
C:\,Linux/macOS:/)开始,完整地指定文件或文件夹的位置,无论当前在哪个目录,都能唯一确定该文件的位置。如/home/user/documents/data.txt。 -
相对路径:指相对于当前工作目录(程序运行的起点)来指定文件或文件夹的位置,而不是从系统根目录开始。
比如
./data.txt代表当前目录下的data.txt。../config/settings.json代表上一级目录的 config 文件夹内settings.json。
2.3 文件模式
在 Python 中,打开文件时需要指定文件模式,不同模式决定了如何读写文件:
2.3.1 读取模式 ('r')
只读模式,文件必须存在,否则报错。
2.3.2 写入模式 ('w')
写入模式,会清空原文件内容;如果文件不存在,会创建新文件。
2.3.3 追加模式 ('a')
在文件末尾追加内容,不会清空原内容;文件不存在时会创建新文件。
2.3.4 二进制模式 ('b')
用于处理图片、音频、视频等非文本文件,可以与其他模式组合使用,如 'rb'(二进制读取)、'wb'(二进制写入)。
2.3.5 读写模式 ('r+', 'w+', 'a+')
'r+':同时读+写,不会清空文件,文件必须存在。
'w+':同时写+读,但会清空原文件,文件不存在时会创建。
'a+':同时追加+读,不会清空文件,文件不存在时会创建。
2.4 文件指针
文件指针(File Pointer) 是文件内部的“光标”,指示当前读写的位置。当我们打开文件时,文件指针默认在文件开头,每次读取或写入后,指针都会移动。
文件指针的特点:
-
默认在文件开头,除非使用追加模式(
'a'),则指针在文件末尾。 -
读取后,指针向前移动,不会重新回到开头。
-
写入时,指针决定数据写入的位置。
-
可以使用
seek()手动调整指针位置。
2.5 文件编码
文件编码(Encoding) 指的是如何在文件中存储文本数据。不同编码方式决定了字符如何转换成二进制数据,影响文件的正确读取和显示。
常见编码格式:
-
UTF-8(默认编码):支持多种语言字符,通用且推荐使用。
-
GBK:适用于简体中文文件,部分旧系统仍在使用。
-
ASCII:只支持英文和基本符号,无法存储中文。
Python 默认使用 UTF-8,但如果遇到乱码,可以尝试 encoding="gbk" 或其他编码。
三、文件的基本读写操作
3.1 打开与关闭文件
3.1.1 打开文件——open()方法
在 Python 中,open() 方法用于打开文件,并返回一个文件对象,允许我们读取、写入或修改文件内容。
open()方法语法结构如下:
file = open("文件路径", "模式", encoding="编码格式")
-
文件路径:要打开的文件名或路径(如"example.txt")。 -
模式(可选):指定文件的打开方式(如只读'r',写入'w')。 -
encoding(可选):用于指定文本编码,一般使用"utf-8"处理中文。
file = open('Python读写测试.txt', 'r', encoding='utf-8') # 读取一个文本文件
lines = file.readlines() # 读取文件
print(lines)
# 输出
['这个文件用来测试Python的文件读写操作。']
注意:上面的这个示例代码其实少了一个关闭文件的操作,在编程中我们打开一个文件后,要记得对文件进行关闭操作,否则会导致某些错误。
3.1.2 关闭文件——close()方法
在 Python 进行文件操作时,使用 open() 打开的文件需要手动关闭,否则可能会导致资源泄露。close() 方法就是用来关闭文件的。close() 关闭文件后,该文件对象不能再被读取或写入,否则会报错。
file = open('Python读写测试.txt', 'r', encoding='utf-8') # 读取一个文本文件
lines = file.readlines() # 读取文件
print(lines)
file.close() # 关闭文件
lines = file.readlines() # 关闭后读取文件
# 输出
['这个文件用来测试Python的文件读写操作。']
# 报错
ValueError: I/O operation on closed file.
为什么要使用close()?
-
释放系统资源:打开文件会占用计算机资源,关闭文件可以释放资源,提高程序运行效率。
-
防止数据丢失:如果写入数据后没有及时
close(),可能导致数据未保存完整。 -
避免错误:如果文件未关闭,其他程序可能无法访问它。
3.1.3 推荐的文件打开与关闭方法
Python 推荐使用 with open()来对文件进行操作,它能自动关闭文件,无需手动调用 close()。
with open('Python读写测试.txt', 'r', encoding='utf-8') as file: # 读取一个文本文件
lines = file.readlines() # 读取文件
print(lines)
# 输出
['这个文件用来测试Python的文件读写操作。']
3.2 文件的读取
3.2.1 读取整个文件——read()方法
一次性读取整个文件内容,适用于小型文件。
特点:
-
适合小文件(文件太大会占用大量内存)。
-
读取后文件指针到达文件末尾,再次
read()会返回''(空字符串)。
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
content = file.read() # 读取整个文件
print(content)
content_2 = file.read() # 再次读取,此时文件指针已经在文件末尾,所以读取不到内容
print(f"content_2: {content_2}")
# 输出
这个文件用来测试Python的文件读写操作。
这是第二行
这是第三行
这是第四行
content_2:
3.2.2 读取指定字节数——read(size) 方法
只读取文件的一部分,而不是整个文件。
特点:
-
适用于大文件,可以分批读取,节省内存。
-
每次读取后,文件指针会向前移动,下一次
read(10)读取下 10 个字符。
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
content = file.read(10) # 读取前10个字符
print(content)
content = file.read(10) # 再读取10个字符
print(content)
# 输出
这个文件用来测试Py
thon的文件读写操
3.2.3 读取一行——readline() 方法
只读取文件的第一行,或逐行读取文件。
特点:
-
适合处理结构化文本(如 CSV、日志文件)。
-
每次调用
readline(),都会读取下一行。 -
末尾带有换行符
\n(如果文件里有)。
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
line1 = file.readline() # 读取第一行
print(line1)
line2 = file.readline() # 读取第二行
print(line2)
# 输出
这个文件用来测试Python的文件读写操作。
这是第二行
3.2.4 读取所有行并返回列表——readlines() 方法
一次性读取所有行,并以列表(list)形式返回。
特点:
-
适合需要按行处理的场景。
-
lines[0]是第一行,lines[1]是第二行。
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
lines = file.readlines() # 读取所有行
print(lines)
# 输出
['这个文件用来测试Python的文件读写操作。\n', '这是第二行\n', '这是第三行\n', '这是第四行']
3.2.5 使用 for 循环逐行读取(推荐大文件)
高效读取大文件,不会一次性占用大量内存。
特点:
-
最节省内存,适合大文件。
-
逐行处理,不会一次性加载整个文件。
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
for line in file:
print(line.strip()) # 去除换行符
# 输出
这个文件用来测试Python的文件读写操作。
这是第二行
这是第三行
这是第四行
3.3 文件的写入
3.3.1 写入字符串——write() 方法
向文件写入字符串,可用于创建新文件或覆盖已有文件。
with open("Python读写测试.txt", "w", encoding="utf-8") as file:
file.write("这是覆盖写入的一行")
with open("Python读写测试.txt", "a", encoding="utf-8") as file:
file.write("\n这是追加写入的一行") # \n是为了添加换行符
# 打印文件内容
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
for line in file:
print(line.strip()) # 去除换行符
with open("Python读写测试.txt", "w", encoding="utf-8") as file:
file.write("这是重新覆盖写入的一行") # \n是为了添加换行符
# 打印文件内容
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
for line in file:
print(line.strip()) # 去除换行符
# 输出
这是覆盖写入的一行
这是追加写入的一行
这是重新覆盖写入的一行
特点:
-
如果文件不存在,会自动创建。
-
如果文件存在,会清空原内容再写入。
-
只能写入字符串,对于其他类型的数据需要先转换成字符串
with open("Python读写测试.txt", "w", encoding="utf-8") as file: a_list = [1, 2, 3, 4, 5] file.write(a_list) # 报错,因为write方法只接受字符串TypeError: write() argument must be str, not list
3.3.2 写入多行——writelines() 方法
一次性写入多个字符串,通常用于写入列表数据。writelines() 需要手动**添加换行符 \n**,否则所有内容会连在一起。
lines = ["第一行\n", "第二行\n", "第三行\n"]
with open("Python读写测试.txt", "w", encoding="utf-8") as file:
file.writelines(lines) # 写入多行
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
# 输出
第一行
第二行
第三行
lines = ["第一行", "第二行", "第三行"]
with open("Python读写测试.txt", "w", encoding="utf-8") as file:
file.writelines(lines) # 写入多行
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
# 输出
第一行第二行第三行
3.3.3 向文件末尾追加内容——追加模式('a')
不清空原文件,而是在文件末尾继续写入。
with open("Python读写测试.txt", "w", encoding="utf-8") as file:
file.write("原始内容\n")
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
with open("Python读写测试.txt", "a", encoding="utf-8") as file:
file.write("追加内容\n")
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content)
# 输出
原始内容
原始内容
追加内容
特点:
-
不会清空原内容,而是追加到文件末尾。
-
文件不存在时,会自动创建。
3.3.4 读写模式('r+'、'w+'、'a+')
'r+'模式:
-
读写模式:文件既可以读取也可以写入。
-
文件必须存在:如果文件不存在,会抛出
FileNotFoundError。 -
文件指针在文件开头:打开文件后,文件指针位于文件的开头。
with open("Python读写测试.txt", "w", encoding="utf-8") as file:
file.write("原始内容\n")
with open("Python读写测试.txt", "r+", encoding="utf-8") as file:
raw_content = file.read() # 可以读取文件,也可以写入文件
print(raw_content)
file.write("追加内容\n")
with open("Python读写测试.txt", "r", encoding="utf-8") as file:
print(file.read())
# 输出
原始内容
原始内容
追加内容
❝
上面的代码看起来好像r+模式是追加的而不是覆盖原来的内容,但其实不是这样的。注意到我们以r+模式读写的时候,先是读取了以下文件原来的内容,结合先前介绍的文件指针的概念,此时文件指针其实已经移动到文件的末尾了,我们写入新内容的时候是在文件指针的位置写入的,所以看起来像是追加一样。
# 以 r+ 模式向不存在的文件写入内容
with open("不存在的文件.txt", "r+", encoding="utf-8") as file:
file.write("写入内容\n")
# 报错
FileNotFoundError: [Errno 2] No such file or directory: '不存在的文件.txt'
'w+'模式:
-
读写模式:文件既可以读取也可以写入。
-
文件不存在时创建文件:如果文件不存在,会创建一个新文件。
-
清空文件内容:如果文件存在,打开文件时会清空文件的内容。
-
文件指针在文件开头:打开文件后,文件指针位于文件的开头。
# 以 w+ 模式向不存在的文件写入内容
with open("不存在的文件.txt", "w+", encoding="utf-8") as file:
file.write("以w+模式向不存在的文件写入内容,会自动创建文件\n")
with open("不存在的文件.txt", "r", encoding="utf-8") as file:
print(file.read())
# 输出
以w+模式向不存在的文件写入内容,会自动创建文件
with open("不存在的文件.txt", "w+", encoding="utf-8") as file:
file.write("以w+模式向不存在的文件写入内容,会自动创建文件\n")
with open("不存在的文件.txt", "w+", encoding="utf-8") as file:
print("什么也不做,但是文件原来的内容会被清空")
with open("不存在的文件.txt", "r+", encoding="utf-8") as file:
print(f"文件内容:{file.read()}")
print("被清空了所以什么都没有")
# 输出
什么也不做,但是文件原来的内容会被清空
文件内容:
被清空了所以什么都没有
'a+'模式:
-
读写模式:文件既可以读取也可以写入。
-
文件不存在时创建文件:如果文件不存在,会创建一个新文件。
-
文件指针在文件末尾:打开文件后,文件指针位于文件的末尾。
-
追加模式:所有写入操作都会在文件末尾进行,不会覆盖文件的现有内容。
with open("a+模式创建不存在的文件.txt", "a+", encoding="utf-8") as file:
file.write("以a+模式向不存在的文件写入内容,会自动创建文件\n")
with open("a+模式创建不存在的文件.txt", "a+", encoding="utf-8") as file:
file.write("文件指针位于文件末尾,所以这行内容会追加到文件末尾\n")
with open("a+模式创建不存在的文件.txt", "r+", encoding="utf-8") as file:
content = file.read()
print(content)
# 输出
以a+模式向不存在的文件写入内容,会自动创建文件
文件指针位于文件末尾,所以这行内容会追加到文件末尾
四、实战示例
4.1 复制一个文本文件
作为一个小示例,我们来写个脚本,把 source.txt 的内容复制到 dest.txt,如果没内容则创建新的 dest.txt。
defcopy_file(source, destination):
with open(source, "r", encoding="utf-8") as src:
content = src.read()
with open(destination, "w", encoding="utf-8") as dst:
dst.write(content)
# 使用
copy_file("source.txt", "dest.txt")
-
第一次用
read()读完所有数据; -
第二次用
write()把数据写到目标文件; -
用
w会覆盖或新建dest.txt。
4.2 统计小说中的词频
以网络小说《斗破苍穹》为例,我们试着统计一下在《斗破苍穹》中桀字和恐怖如斯一共出现了多少次?
file_name = '斗破苍穹.txt'
with open(file_name, 'r', encoding='utf-8') as file:
# 逐行读取
lines = file.readlines()
count = 0
count_2 = 0
for line in lines:
for word in line:
if word == '桀':
count += 1
if'恐怖如斯'in line:
count_2 += 1
print("在《斗破苍穹》中:")
print('恐怖如斯出现了{}次'.format(count_2))
print('桀字出现了{}次'.format(count))
# 输出
在《斗破苍穹》中:
恐怖如斯出现了25次
桀字出现了567次
五、常见错误及注意事项
5.1 文件未找到 (FileNotFoundError)
错误原因:尝试读取一个不存在的文件。
file = open("不存在的文件.txt", "r") # 报错:FileNotFoundError
解决方案:
确认文件是否存在,可以用 os.path.exists() 先检查:
import os
if os.path.exists("不存在的文件.txt"):
with open("不存在的文件.txt", "r") as file:
print(file.read())
else:
print("文件不存在")
❝
os.path.exists() 方法可以检查给定路径的文件是否存在
5.2 忘记关闭文件
错误原因:手动 open() 打开文件后,忘记 close(),可能导致资源泄露。
file = open("example.txt", "r")
content = file.read()
# 忘记 file.close()
解决方案:
推荐使用 with open() 语法,自动关闭文件
with open("example.txt", "r") as file:
content = file.read()
5.3 读写模式错误 (IOError 或 UnsupportedOperation)
错误原因:使用错误的模式(如 'r' 模式尝试写入文件)。
with open("example.txt", "r") as file:
file.write("New data") # 报错:io.UnsupportedOperation: not writable
解决方案:
想写入数据,必须使用 'w'、'a' 或 'r+' 模式
5.4 读取大文件导致内存溢出
错误原因:用 read() 读取超大文件,导致内存占用过高。
with open("large_file.txt", "r") as file:
content = file.read() # 可能导致内存不足
解决方案:
使用 for line in file 逐行读取,减少内存占用
with open("large_file.txt", "r") as file:
for line in file:
print(line.strip()) # 逐行处理
或使用 read(size) 读取指定大小的内容
with open("large_file.txt", "r") as file:
chunk = file.read(1024) # 每次读取 1KB
while chunk:
print(chunk)
chunk = file.read(1024)
5.5 文件指针位置错误
错误原因:多次 read() 后,文件指针已经到了文件末尾,导致读取不到数据。
with open("example.txt", "r") as file:
print(file.read()) # 读取整个文件
print(file.read()) # 这里会返回空字符串
解决方案:使用 seek(0) 重置文件指针
with open("example.txt", "r") as file:
print(file.read()) # 读取文件
file.seek(0) # 让指针回到开头
print(file.read()) # 重新读取
5.6 乱码 (UnicodeDecodeError)
错误原因:读取文件时未正确指定编码格式,导致 Python 无法解码。
with open("chinese.txt", "r") as file:
content = file.read() # 可能报错:UnicodeDecodeError
解决方案:指定正确的编码格式(推荐 utf-8)
with open("chinese.txt", "r", encoding="utf-8") as file:
content = file.read()
如果编码不确定,可以使用 errors="ignore" 忽略错误
with open("chinese.txt", "r", encoding="utf-8", errors="ignore") as file:
content = file.read()
5.7 write() 忘记 \n 导致内容连在一起
错误原因:write() 方法不会自动换行。
with open("example.txt", "w") as file:
file.write("Hello")
file.write("Python")
# 文件内容变成:HelloPython
解决方案:手动添加 \n
with open("example.txt", "w") as file:
file.write("Hello\n")
file.write("Python\n")
5.8 writelines() 误用
错误原因:使用 writelines() 时,没有添加换行符,导致内容不分行。
lines = ["Hello", "Python", "World"]
with open("example.txt", "w") as file:
file.writelines(lines) # 结果:HelloPythonWorld
解决方案:确保每个元素后面带上 \n
lines = ["Hello\n", "Python\n", "World\n"]
with open("example.txt", "w") as file:
file.writelines(lines)
5.9 追加模式 ('a') 忘记换行
错误原因:追加内容时,没有换行,导致新内容直接接在原内容后面。
with open("example.txt", "a") as file:
file.write("New Line") # 可能和上一行连在一起
解决方案:确保写入时手动添加 \n
with open("example.txt", "a") as file:
file.write("\nNew Line")
六、小结
-
打开文件:使用
open("filename", "mode", encoding="..."),常见模式有r、w、a。 -
读取内容:
read()一次性读完全部,readline()/readlines()/循环可按行读,或分段读取大文件。 -
写入内容:写文本用
w(覆盖)或a(追加);记得手动加换行符"\n"。 -
关闭文件:使用
with open(...) as f:可以自动关闭,代码更简洁也更安全。 -
注意编码:中文文件常使用
utf-8,若文件是其它编码,需要指定对应的encoding;
掌握这些基础操作,你就能读写各种文本文件,配合字符串处理、列表、字典等工具,让你在做数据处理、配置管理、日志记录时更加得心应手。
如果觉得这篇文章对你有帮助,欢迎点赞或分享给更多想学 Python 的朋友。继续加油,在文件操作的技能加持下,你能更轻松地处理日常项目中各种数据文件了!下次见~
最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

1万+

被折叠的 条评论
为什么被折叠?



