围观大神是如何用Python处理文件的? - Go语言中文社区

围观大神是如何用Python处理文件的?


在这个世界上,人们每天都在用 Python 完成着不同的工作。而文件操作,则是大家最常需要解决的任务之一。使用 Python,你可以轻松为他人生成精美的报表,也可以用短短几行代码快速解析、整理上万份数据文件。

当我们编写与文件相关的代码时,通常会关注这些事情:我的代码是不是足够快?我的代码有没有事半功倍的完成任务? 在这篇文章中,我会与你分享与之相关的几个编程建议。我会向你推荐一个被低估的 Python 标准库模块、演示一个读取大文件的最佳方式、最后再分享我对函数设计的一点思考。

下面,让我们进入第一个“模块安利”时间吧。

注意:因为不同操作系统的文件系统大不相同,本文的主要编写环境为 Mac OS/Linux 系统,其中一些代码可能并不适用于 Windows 系统。

建议一:使用 pathlib 模块

如果你需要在 Python 里进行文件处理,那么标准库中的 os 和 os.path 兄弟俩一定是你无法避开的两个模块。在这两个模块里,有着非常多与文件路径处理、文件读写、文件状态查看相关的工具函数。

让我用一个例子来展示一下它们的使用场景。有一个目录里装了很多数据文件,但是它们的后缀名并不统一,既有 .txt,又有 .csv。我们需要把其中以 .txt 结尾的文件都修改为 .csv 后缀名。

我们可以写出这样一个函数: 

  1. import os  
  2.    import os.path  
  3.    def unify_ext_with_os_path(path):  
  4.        """统一目录下的 .txt 文件名后缀为 .csv  
  5.        """  
  6.        for filename in os.listdir(path):  
  7.            basename, ext = os.path.splitext(filename)  
  8.            if ext == '.txt':  
  9.                abs_filepath = os.path.join(path, filename)  
  10.                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  
  2.    def unify_ext_with_pathlib(path):  
  3.        for fpath in Path(path).glob('*.txt'):  
  4.            fpath.rename(fpath.with_suffix('.csv')) 

和旧代码相比,新函数只需要两行代码就完成了工作。而这两行代码主要做了这么几件事:

  1.  首先使用 Path(path) 将字符串路径转换为 Path 对象
  2.  调用 .glob('*.txt') 对路径下所有内容进行模式匹配并以生成器方式返回,结果仍然是 Path 对象,所以我们可以接着做后面的操作
  3.  使用 .with_suffix('.csv') 直接获取使用新后缀名的文件全路径
  4.  调用 .rename(target) 完成重命名

相比 os 和 os.path,引入 pathlib 模块后的代码明显更精简,也更有整体统一感。所有文件相关的操作都是一站式完成。

其他用法

除此之外,pathlib 模块还提供了很多有趣的用法。比如使用 / 运算符来组合文件路径: 

版权声明:本文来源51CTO,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:http://developer.51cto.com/art/202103/648292.htm
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-16 20:36:27
  • 阅读 ( 624 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢