在本篇博客中,咱们将全面、深刻地探讨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 pickledata = {    '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 fnmatchdef 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.txt, file2.txt, sub/file3.txt三个文件,运行这段代码会输入:

['./file1.txt', './file2.txt', './sub/file3.txt']

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

如有帮忙,请多关注
集体微信公众号:【Python全视角】
TeahLead_KrisChang,10+年的互联网和人工智能从业教训,10年+技术和业务团队治理教训,同济软件工程本科,复旦工程治理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。