文章目录
前言
在日常开发中,文件和目录操作是必不可少的一部分。Python 提供了许多内置模块,使得文件和目录的操作变得十分方便和高效。通过本指南,您将掌握以下知识点:
- 文件操作:使用 Python 打开、读取和写入文件。
- 目录遍历:使用
os
模块遍历指定目录,列出所有文件和子目录。 - 数据处理与存储:将处理后的数据分别存储到不同的文件中。
- 综合运用:结合文件操作和目录遍历,实现综合功能的 Python 脚本。
一、常用标准库
Python 中用于文件操作的标准库有几个主要的模块和包,每个模块都有其特定的功能。以下是一些常用的标准库:
1. os 模块
os
模块提供了一些与操作系统交互的功能,尤其是文件和目录操作。
os.open()
,os.close()
:低级别的文件打开和关闭。os.listdir()
:列出指定目录中的所有文件和子目录。os.mkdir()
,os.makedirs()
:创建目录。os.remove()
,os.unlink()
:删除文件。os.rmdir()
,os.removedirs()
:删除目录。os.path
:包含许多处理文件路径的方法,如os.path.join()
,os.path.exists()
,os.path.isfile()
,os.path.isdir()
2. shutil 模块
shutil
模块提供了一些高级的文件操作功能,如复制和删除目录树。
shutil.copy()
,shutil.copy2()
,shutil.copyfile(
):复制文件。shutil.move()
:移动文件或目录。shutil.rmtree()
:递归删除目录树。
3. pathlib 模块
pathlib
模块提供了面向对象的文件系统路径操作接口,更加直观和易用。
Path
对象:表示文件系统路径。Path.mkdir()
:创建目录。Path.unlink()
:删除文件。Path.rmdir()
:删除目录。Path.iterdir()
:生成目录中的所有条目。
4. io 模块
io
模块提供了核心工具来处理流式 I/O,如文件读取和写入。
io.open()
:与内置的open()
函数类似。io.StringIO
和io.BytesIO
:在内存中操作文本和二进制数据的流。
二、操作过程及内容
步骤一:环境准备
- 安装并配置 Python 开发环境,不会配置的可以参考该篇文章喔🚪
- 创建所需的输入文件
input.txt
,并在该文件中写入一些初始内容以供读取。如下图:
步骤二:文件操作
- 读取文件内容:编写函数
read_file(file_path)
,接受一个文件路径作为参数,读取文件内容并返回。调用 Python 自带的open()
函数以只读r
的方式打开文件,在open()
函数中增加参数encoding="utf-8
,确保文件内容为 UTF-8 编码格式。文件中存储的内容是中文,编码格式是utf-8格式,而Windows系统的默认编码是gbk,故需要在open()
函数中指定字符编码utf-8,否则程序会出现异常。对返回的文件对象f调用read()
函数读取文件的内容,调用该函数读取input.txt
文件内容。
# 1. 打开一个文件,并将文件内容读取出来
def read_file(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
return content
- 写入文件内容:编写函数
write_file(content, new_content, output_file_path)
,将读取的内容和新内容写入到指定的文件中。以覆盖写w
的模式打开要输出的文件,文件不存在则创建,存在则完全覆盖。对返回的文件对象f
调用write()
函数将读取的内容换行后和新内容一起写入到output.txt
中
# 2. 将读取的内容写入另外一个文件,增加新的内容
def write_file(content, new_content, output_file_path):
with open(output_file_path, 'w', encoding='utf-8') as file:
file.write(content)
file.write("\n") # 添加一个换行符
file.write(new_content)
write_file(content, '这是新内容', 'output.txt')
步骤三:目录遍历
- 遍历目录:编写函数
list_files_and_directories(directory_path)
,遍历指定目录,返回文件和子目录的列表。初始化用于存放文件和子目录的两个列表,使用os
模块中的walk()
函数遍历指定目录,获取指定路径下的所有目录和文件信息
再对得到的目录名称和文件名称遍历,分别拼接在root
目录后面填入到列表中,调用该函数,获取指定目录的文件和子目录列表。
walk()
函数的返回值是一个生成器,生成器的每一个元素都是一个三元组(root,dirs,files)
,root
是指当前正在遍历的文件夹的路径;dirs
是一个列表,包含当前文件夹下所有目录的名称;files
是一个列表,包含当前文件夹下所有文件的名称。
# 3. 对指定目录进行遍历,并列出其中所有的文件和子目录
def list_files_and_directories(directory_path):
files = []
directories = []
for root, dirs, file_names in os.walk(directory_path):
for dir_name in dirs:
directories.append(os.path.join(root, dir_name))
for file_name in file_names:
files.append(os.path.join(root, file_name))
return files, directories
- 编写函数
write_list_to_file(items, output_file_path)
,将列表items
写入到指定文件,每个项占一行。以覆盖写的方式打开要输出的文件,遍历输入的列表items
,将每一项数据都写入到文件中,调用该函数,将文件列表写入files_list.txt
,将目录列表写入directories_list.txt
# 4. 将列出的文件和子目录分别写入两个不同的文件中
def write_list_to_file(items, output_file_path):
with open(output_file_path, 'w', encoding='utf-8') as file:
for item in items:
file.write(item + "\n")
步骤四:综合脚本
编写主程序,整合上述各步骤的函数,完成指定的功能:
if __name__ == "__main__":
# 设置文件路径
input_file_path = 'verse.txt' # 替换为要读取的文件路径
intermediate_output_file_path = 'output.txt'
final_files_list_output_path = 'files_list.txt'
final_directories_list_output_path = 'directories_list.txt'
directory_to_traverse = 'D:/hjy/python学习/workspace/pythonProject' # 替换为要遍历的目录路径
# 读取文件内容
file_content = read_file(input_file_path)
# 写入新的内容到另外一个文件
new_content = "这是添加的新内容。"
write_file(file_content, new_content, intermediate_output_file_path)
# 遍历目录,列出所有文件和子目录
files, directories = list_files_and_directories(directory_to_traverse)
# 将文件列表和目录列表分别写入两个不同的文件中
write_list_to_file(files, final_files_list_output_path)
write_list_to_file(directories, final_directories_list_output_path)
print("操作完成,结果已写入相应文件。")
操作结果
运行这个python程序,控制台打印,操作完成,结果已写入相应文件。
检查输出的文件,Output.txt
在原内容的基础上换行后添加了新内容
files_list.txt
输出了指定目录下的所有文件
directories_list.txt
输出了指定目录下的所有子目录
总结
通过本篇博客,我们详细介绍了如何使用 Python 进行文件和目录操作。首先,我们了解了几个常用的标准库如 os、shutil、pathlib 和 io 的基本用法。接着,我们通过具体的示例展示了如何读取和写入文件,如何遍历目录并列出其中的文件和子目录,最后将这些操作整合到一个完整的脚本中。希望这篇博客能帮助读者更好地理解和运用 Python 进行文件和目录操作,如果有任何疑问或者建议,欢迎留言讨论🌹