在本篇博客中,我们将全面、深入地探讨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 os
import 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.txt
Directory: /home/user/documents
Base name: file.txt
Root: file, Extension: .txt

One More Thing: 文件遍历和搜索

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

import os
import 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.txt, file2.txt, sub/file3.txt三个文件,运行这段代码会输出:

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

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

如有帮助,请多关注

个人微信公众号:【Python全视角】

TeahLead_KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。

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

  1. python中文件操作相关基础知识

    python中文件操作相关基础知识 文件的概念 1,文件的概念? 文件就是操作系统暴露给用户操作硬盘的快捷方式 , 当我们双击一个文件进行打开时,其实就是把硬盘中的数据加载到了内存中,然后展示给我们 ...

  2. Python基础篇【第2篇】: Python文件操作

    Python文件操作 在Python中一个文件,就是一个操作对象,通过不同属性即可对文件进行各种操作.Python中提供了许多的内置函数和方法能够对文件进行基本操作. Python对文件的操作概括来说 ...

  3. 关于python 文件操作os.fdopen(), os.close(), tempfile.mkstemp()

    嗯.最近在弄的东西也跟这个有关系,由于c基础渣渣.现在基本上都忘记得差不多的情况下,是需要花点功夫才能弄明白. 每个语言都有相关的文件操作. 今天在flask 的例子里看到这样一句话.拉开了文件操作折 ...

  4. python 文件操作 r w a

    python基础-文件操作   一.文件操作 对文件操作的流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件       打开文件时,需要指定文件路径和以何等方式打开文件, ...

  5. 第十二章 Python文件操作【转】

    12.1 open() open()函数作用是打开文件,返回一个文件对象. 用法格式:open(name[, mode[, buffering[,encoding]]]) -> file obj ...

  6. [Python学习笔记][第七章Python文件操作]

    2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...

  7. Python文件操作与函数目录

    文件操作 python文件操作 函数 Python函数学习——初步认识 Python函数学习——作用域与嵌套函数 Python函数学习——匿名函数 python内置函数 Python函数学习——递归 ...

  8. 初学Python——文件操作第二篇

    前言:为什么需要第二篇文件操作?因为第一篇的知识根本不足以支撑基本的需求.下面来一一分析. 一.Python文件操作的特点 首先来类比一下,作为高级编程语言的始祖,C语言如何对文件进行操作? 字符(串 ...

  9. day8.python文件操作

    打开和关闭文件 open函数 用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写. file = open(file_name [, access_ ...

  10. Python之路Python文件操作

    Python之路Python文件操作 一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r&qu ...

随机推荐

  1. 剑指 offer 第 21 天

    第 21 天 位运算(简单) 剑指 Offer 15. 二进制中1的个数 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为 汉明重量). ...

  2. list Api

    类型 名称 void add(String item)将指定的项目添加到滚动列表的末尾. void add(String item, int index)将指定的项目添加到由索引指示的位置的滚动列表中 ...

  3. python之中文符号转英文符号

    maketrans内置方法, 可以将中文符号转换为英文符号.以下代码中,事先定义(中文符号)和其对应的(英文符号),也就是定义中文符号, 也要有对应的英文符号,否则会报错.这个功能其实和替换功能差不多 ...

  4. 异步注解@Async使用及其部分调优

    对于spring异步注解@Async的使用: 对于异步方法调用,从Spring3开始提供了@Async注解,该注解可以被标注在方法上,以便异步地调用该方法.调用者将在调用时立即返回,方法的实际执行将提 ...

  5. [GIT]辨析/区别: git reset HEAD 与 git reset --hard HEAD | 版本回撤

    1 场景1: 撤销到远程仓库或本地仓库的最新最近一次的正式版本 1.1 文由 时常有这样一种场景,不小心改动了部分文件,或修改了部分文件却发现无用,此时可能还没有git push,也可能push了:又 ...

  6. Thread面试题

    面试题目录https://www.cnblogs.com/Kaelthas/p/15005844.html 1.一个Thread对象代表一个线程,同一个线程能否多次启动? 不能,在Thread类中变量 ...

  7. YII2.0的文件上传, 并把文件名称重新编译

    /** *@Action 文件上传示例 *@这里我们演示的是一个YII2.0的文件上传, 并把文件名称重新编译 *@我们上传的是一个叫 photo 的jpg和png格式的文件 */ Controlle ...

  8. 基于Mongodb分布式锁简单实现,解决定时任务并发执行问题

    前言 我们日常开发过程,会有一些定时任务的代码来统计一些系统运行数据,但是我们应用有需要部署多个实例,传统的通过配置文件来控制定时任务是否启动又太过繁琐,而且还经常出错,导致一些异常数据的产生 网上有 ...

  9. node使用react项目启动错误TSError: ⨯ Unable to compile TypeScript:

    1.错误内容 return new TSError(diagnosticText, diagnosticCodes) ^ TSError: ⨯ Unable to compile TypeScript ...

  10. 安装dataX的问题,com.alibaba.datax.common.exception.DataXException: Code:[Common-00], Describe

    文章目录 报错 安装: 解决方法 总结 报错 com.alibaba.datax.common.exception.DataXException: Code:[Common-00], Describe ...