文件批量处理
我很常会批量处理一些文件,比如在 莫烦 Python 这个网站从 morvanzhou.github.io 迁移到 这里的时候, 我要重构所有的底层架构,从一个静态网页做成动态网页。其中有一个重要步骤就是批量处理所有的文件, 将指向 morvanzhou.github.io 的文本全部改成 mofanpy.com。
这节内容,我们就以这个为例,复现一下当时我处的困境,看我怎么用 Python 帮我自动化解决这个困境。
这一节主要涉及到的功能:
- 找到所有文件
os.listdir()
os.path.join()
- 找到文件特定字段
re.findall()
os.path.join()
- 替换
os.path.join()
re.sub()
string.startswith()
我遇到的问题¶
具体来说,这个问题就是要将所有 莫烦 Python 的教学内容,批量将里面提到的 morvanzhou.github.io 改成 mofanpy.com。 如果你不会 Python,或者其他的语言,那你就只能手动,一个个打开这些文件,然后编辑替换所有有问题的文本。
偶尔一两个文件这么处理还好,但是当时我的教程有 3-400 个,处理两天都处理不过来啊。 所以我只能求救我的 Python,让它帮我做这件事。
初步思考¶
首先需要简化问题,简化出来的话,其实就是要有三个步骤。
- 遍历所有的文本文件
- 找到文件中特定字段
- 替换掉这个特定字段
好,明白了这三步,我们就来分别用 python 和之前教学中的内容,解决这个问题吧。我在下面设计具体知识内容的时候,会引用到以前的教学,你可以当做回顾。 你就当做你在解决问题的时候,去搜索引擎上做的那些搜索行为就好了。
找到所有文件¶
怎么用 python 找到某个目录下的所有文件呢?其实我们在 os教学 中就已经提到过, 而且我们还能用 os 库做很多额外的处理。还不了解 os 的同学去这个链接 看看吧。
运行上面的代码,你可以看出,我们在 files
目录下,有很多个文本文件,我们成功的发现了这些文件。 下一步,我们需要能够打开这些文件,看到里面的内容。
找到文件特定字段¶
能看到文件名还不够,因为我们不知道每个文件中是什么内容,所以我们先写一个读取文件内容的功能,然后分别打开看看里面写了些什么,分析一下要怎么处理后面的步骤。 这里,我们就需要用到一个 for 循环来遍历所有的文件,并依次展示了。如果你还想回顾一下 for 循环的教程,请看到这里。 另外,我们还需要会使用 open 函数来打开文件,不然你都没打开,怎么知道里面有什么呢?读写文件的使用请看到这个教程。
很好,现在是能把所有的文件都读出来显示了,我们看到不同文件中有不同的文本,那么我们怎么定位到特定的网址文本呢? 这时,之前提到正则表达式的教程就能来拯救你了。
正则是一个非常有用,而且非常常用的技术。帮你找到混乱文本当中符合特定模式的文本。比如我要在一大串文本中找到一个网址。
牛逼,在这么复杂的情况下,这么多干扰项的情况下,mofanpy.com 这个字段都被你找到了。那我们就再进行下一步, 怎么将这个找到的文字替换掉。
替换¶
上面我们在演示正则的时候是指一个匹配的演示,现在我们要正式进入最惊心动魄的时刻了,项目的成功与否,都看这一步的处理了。 上面我们已经可以找到并读出所有的文件内容了,现在我们有两个方案,你看看你会选择哪个?
- 在原文本上替换,并覆盖原文本的内容;
- 复制出一个新的文件,将原文本替换过的文字拷贝到新文件中,原文件不改变。
其实最终怎么做,取决于你的这个文件处理系统需要怎么做。其实两种做法都是可以的,但是在你测试和验证程序的阶段,我建议你还是将改动过的文件,写入一个新的文件中, 不然原文件被覆盖了,你就改不回来了。
运行完上面的代码后,我们再从新文件中读出来看看内容有没有改好,验证一下。
这就完美了,我们不仅找到了要修改的,而且还修改了需要被修改的,并保存到了另一个地方,为后续操作留下空间。 这次的任务就圆满完成了。
总结¶
虽然这个任务十分简单,但是也蕴含着一些对项目的思考,包括如何定位问题,分析问题,并拆解问题,解决问题。 有了上一个没啥用计算器
的项目,和这个项目, 你对用 Python 做项目应该是有了一个深度的理解。
好嘞,到目前这个阶段,你已经可以撒手去完成一些简单的项目了,后续的教学将更加集中在提升能力的方面,也会更加精彩。