写点什么

掌握 Python 文件操作:从基础到高阶的全方位探索

  • 2023-06-27
    福建
  • 本文字数:2679 字

    阅读完需:约 9 分钟

在本篇博客中,我们将全面、深入地探讨 Python 中的文件操作。文件操作在 Python 编程中是不可或缺的一部分,它包含了打开、读取、写入和关闭文件等各种操作。我们将从基础的文件操作讲解到高级的文件处理技巧,以及如何优雅地使用 Python 进行文件操作。每一部分我们都会分享一些独特的用法,并且附有具体的示例代码和输出结果。在文章的最后,我们还将分享一些鲜为人知但非常实用的文件操作技巧。

基础文件操作:打开、读取、写入和关闭文件


Python 使用内置的open()函数来打开一个文件,它返回一个文件对象,常用的模式如下:'r'表示读取,'w'表示写入(会先清空原有文件),'a'表示追加,'b'表示二进制模式。特别的,我们可以使用with关键字,这样当我们完成操作后,文件将自动关闭。


# 以读取模式打开一个文件with open('file.txt', 'r') as file:    content = file.read()print(content)
复制代码


当你运行这段代码,假设file.txt的内容是Hello, Python!,你会看到以下输出:


Hello, Python!
复制代码


文件读取:细粒度控制


除了一次性读取整个文件,我们还可以以更小的单位来读取文件。这对于处理大文件时非常有用,可以有效控制内存的使用。


with open('file.txt', 'r') as file:    while True:        line = file.readline()        if not line:            break        print(line, end='')
复制代码


这段代码会逐行读取file.txt文件的内容并打印。其中,end=''是为了防止print函数在每次打印后都插入一个换行符,因为从文件中读取的每一行都已经带有一个换行符。


文件写入:内容追加与覆盖


我们使用写入模式('w')或追加模式('a')来写入文件。这里有一个小技巧:如果你的程序需要频繁写入文件,那么在写入时使用\n来换行会比使用write()函数后再使用write('\n')函数来插入新行更有效率。


with open('file.txt', 'a') as file:    file.write('Hello, Python!\n')
复制代码


这段代码会在file.txt文件的末尾追加一行Hello, Python!


更高级的文件处理:osshutil模块


Python 的os模块和shutil模块为我们提供了更高级的文件操作功能,如重命名文件、删除文件、创建

目录、复制文件等。


import osimport shutil
# 创建一个新的目录os.mkdir('new_folder')
# 重命名文件os.rename('old.txt', 'new.txt')
# 复制文件shutil.copy2('src.txt', 'dst.txt')
# 删除文件os.remove('file_to_delete.txt')
复制代码


运行这段代码会按顺序执行上述文件操作。


文件编码:处理不同编码格式的文件


在处理文件时,我们可能会遇到各种不同的编码格式,如 UTF-8, ASCII, ISO-8859-1 等。Python 的open()函数允许我们通过encoding参数来指定文件的编码方式。


with open('file.txt', 'r', encoding='utf-8') as file:    content = file.read()print(content)
复制代码


如果你尝试读取一个包含非 ASCII 字符的文本文件,但没有提供正确的编码参数,Python 可能会抛出UnicodeDecodeError。在这种情况下,你需要知道文件的正确编码格式才能正确地读取文件。


# 尝试读取一个包含非ASCII字符的文件,但没有指定正确的编码格式try:    with open('file.txt', 'r') as file:        content = file.read()except UnicodeDecodeError:    print("UnicodeDecodeError occurred!")
复制代码


这段代码会捕获UnicodeDecodeError并打印一个错误消息。


文件异常处理:确保代码的健壮性


在文件操作中,我们可能会遇到各种异常情况,例如文件不存在、没有读取/写入权限等。我们可以使用 Python 的异常处理机制来捕获这些异常并作出相应的处理。


try:    with open('nonexistent_file.txt', 'r') as file:        content = file.read()except FileNotFoundError:    print('File does not exist!')except PermissionError:    print('No permission to read the file!')
复制代码


这段代码会捕获FileNotFoundErrorPermissionError,并分别打印出相应的错误消息。


使用pickle进行对象序列化和反序列化


Python 的pickle模块提供了将对象转换为一种可以存储到文件或在网络上传输的格式(这个过程称为序列化),以及从这种格式重新构造对象(这个过程称为反序列化)的功能。这是一种非常方便的方式来保存和加载 Python 对象。


import pickle
data = { 'name': 'John', 'age': 30, 'pets': ['cat', 'dog']}
# 序列化并保存到文件with open('data.pkl', 'wb') as file: pickle.dump(data, file)
# 从文件加载并反序列化with open('data.pkl', 'rb') as file: loaded_data = pickle.load(file)
print(loaded_data)
复制代码


运行这段代码,你会看到以下输出:


{'name': 'John', 'age': 30, 'pets': ['cat', 'dog']}
复制代码


这就是原始的data字典对象。


文件路径处理


在处理文件路径时,Python 的os.path模块提供了一系列函数来解析、构造和修改文件路径。这些函数都是跨平台的,因此无论你的程序运行在 Windows、macOS 还是 Linux 上,都可以安全地使用它们。


import os
# 获取文件的绝对路径

abs_path = os.path.abspath('file.txt')print(f'Absolute path: {abs_path}')
# 获取文件所在的目录dir_name = os.path.dirname(abs_path)print(f'Directory: {dir_name}')
# 获取文件的基本名和扩展名base_name = os.path.basename(abs_path)print(f'Base name: {base_name}')root, ext = os.path.splitext(base_name)print(f'Root: {root}, Extension: {ext}')
复制代码


假设file.txt位于/home/user/documents/目录下,运行这段代码会输出:


Absolute path: /home/user/documents/file.txtDirectory: /home/user/documentsBase name: file.txtRoot: file, Extension: .txt
复制代码


One More Thing: 文件遍历和搜索


Python 的os模块提供了一个os.walk()函数,这是一个简单易用但强大的工具,用于在目录树中生成文件名。结合fnmatch模块,我们可以实现对文件的模式匹配搜索。


import osimport fnmatch
def find(pattern, path): result = [] for root, dirs, files in os.walk(path): for name in fnmatch.filter(files, pattern): result.append(os.path.join(root, name)) return result
# 查找当前目录及其所有子目录中的所有.txt文件print(find('*.txt', '.'))
复制代码


假设当前目录及其子目录下有file1.txtfile2.txtsub/file3.txt三个文件,运行这段代码会输出:


['./file1.txt', './file2.txt', './sub/file3.txt']
复制代码


我们希望你能从这篇博客中学到 Python 文件操作的各种技巧,并能在你的 Python 编程之旅中发挥作用。如果你有任何问题或想法,欢迎留言交流。


文章转载自:python全景系列

原文链接:https://www.cnblogs.com/xfuture/p/17474169.html

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
掌握Python文件操作:从基础到高阶的全方位探索_Python_快乐非自愿限量之名_InfoQ写作社区