在这个世界上, 人们每天都在用 Python 完成着不同的工作. 而文件操作, 则是大家最常需要解决的任务之一. 使用 Python, 你可以轻松为他人生成精美的报表, 也可以用短短几行代码快速解析, 整理上万份数据文件.
当我们编写与文件相关的代码时, 通常会关注这些事情: 我的代码是不是足够快? 我的代码有没有事半功倍的完成任务? 在这篇文章中, 我会与你分享与之相关的几个编程建议. 我会向你推荐一个被低估的 Python 标准库模块, 演示一个读取大文件的最佳方式, 最后再分享我对函数设计的一点思考.
下面, 让我们进入第一个 "模块安利" 时间吧.
注意: 因为不同操作系统的文件系统大不相同, 本文的主要编写环境为 Mac OS/Linux 系统, 其中一些代码可能并不适用于 Windows 系统.
建议一: 使用 pathlib 模块
如果你需要在 Python 里进行文件处理, 那么标准库中的 os 和 os.path 兄弟俩一定是你无法避开的两个模块. 在这两个模块里, 有着非常多与文件路径处理, 文件读写, 文件状态查看相关的工具函数.
让我用一个例子来展示一下它们的使用场景. 有一个目录里装了很多数据文件, 但是它们的后缀名并不统一, 既有 .txt, 又有 .CSV. 我们需要把其中以 .txt 结尾的文件都修改为 .CSV 后缀名.
我们可以写出这样一个函数:
在学习过程中有什么不懂得可以加我的
python 学习交流扣扣 qun,784758214
群里有不错的学习视频教程, 开发工具与电子书籍.
与你分享 python 企业当下人才需求及怎么从零基础学习好 python, 和学习什么内容
- 1. `import os`
- 2. `import os.path`
- 5. `def unify_ext_with_os_path(path):`
- 6. `""" 统一目录下的 .txt 文件名后缀为 .csv`
- 7. `"""`
- 8. `for filename in os.listdir(path):`
- 9. `basename, ext = os.path.splitext(filename)`
- 10. `if ext == '.txt':`
- 11. `abs_filepath = os.path.join(path, filename)`
- 12. `os.rename(abs_filepath, os.path.join(path, f'{basename}.csv'))`
让我们看看, 上面的代码一共用到了哪些与文件处理相关的函数:
os.listdir(path): 列出 path 目录下的所有文件 (含文件夹)
os.path.splitext(filename): 切分文件名里面的基础名称和后缀部分
os.path.join(path,filename): 组合需要操作的文件名为绝对路径
os.rename(...): 重命名某个文件
上面的函数虽然可以完成需求, 但说句实话, 即使在写了很多年 Python 代码后, 我依然觉得: 这些函数不光很难记, 而且最终的成品代码也不怎么讨人喜欢.
使用 pathlib 模块改写代码
为了让文件处理变得更简单, Python 在 3.4 版本引入了一个新的标准库模块: pathlib. 它基于面向对象思想设计, 封装了非常多与文件操作相关的功能. 如果使用它来改写上面的代码, 结果会大不相同.
使用 pathlib 模块后的代码:
- 1. `from pathlib import Path`
- 3. `def unify_ext_with_pathlib(path):`
- 4. `for fpath in Path(path).glob('*.txt'):`
- 5. `fpath.rename(fpath.with_suffix('.csv'))`
和旧代码相比, 新函数只需要两行代码就完成了工作. 而这两行代码主要做了这么几件事:
首先使用 Path(path) 将字符串路径转换为 Path 对象
调用 .glob('*.txt') 对路径下所有内容进行模式匹配并以生成器方式返回, 结果仍然是 Path 对象, 所以我们可以接着做后面的操作
使用 .with_suffix('.csv') 直接获取使用新后缀名的文件全路径
调用 .rename(target) 完成重命名
相比 os 和 os.path, 引入 pathlib 模块后的代码明显更精简, 也更有整体统一感. 所有文件相关的操作都是一站式完成.
其他用法
除此之外, pathlib 模块还提供了很多有趣的用法. 比如使用 / 运算符来组合文件路径:
1. `#
来源: http://www.bubuko.com/infodetail-3211463.html