有时你需要对多个文本文件进行修改。例如,如果你想更新一些文件,以使用美国的拼写,而不是英国的拼写。
在这个快速提示中,我将向你展示一个例子,我们有五个文本文件拼错了一个单词。也就是说,不是写 "World",而是写 "Wolrd"。这个例子将向你展示我们如何使用 Python 来纠正包含在一个目录中的所有文本文件中这个词的拼写。
让我们开始吧!
数据准备
在我们继续学习这个例子之前,让我们准备一下我们要处理的数据(文本文件)。在本教程中,我们将创建一个名为hello的目录,其中将有不同的文件和子目录,包括名为1.txt、2.txt、3.txt、4.txt和5.txt的文本文件。
虽然我们用来遍历文件列表的函数将包括目录中的所有文件,但我们可以在代码中添加自己的条件,将自己限制在我们想要修改的文件中。
实现方法
让我们进入有趣的部分。我们需要做的第一件事是读取目录hello的内容。为此,我们可以使用 [scandir()](https://docs.python.org/3/library/os.html#os.scandir)方法,如下所示。
import os
directory = os.scandir('hello')
这个方法返回一个迭代器。我们可以用它来创建一个for循环来查看目录中的所有文件。
entries = [it.name for it in directory]
print(entries)
在这种情况下,我们会得到
['.nomedia', '1.txt', '2.txt', '3.txt', '4.txt', '5.txt', 'others']
这表明我们在hello目录下有五个**.txt**文件。然而,它也包含一些其他文件和子目录。
现在我们将循环浏览hello目录下的所有文件。我们可以在for-in 循环的帮助下这样做,同时使用with 语句。这将在我们执行完这个块中的代码后自动释放资源。
with os.scandir('hello') as directory:
for item in directory:
由于我们要在目录中的五个文件中逐一寻找Wolrd,所以在这个阶段,正常的做法是打开并读取每个文件的内容。我们将通过使用is_file() 方法跳过目录,并通过对文件名使用startswith() 方法跳过以. 字符开头的文件。这样我们就可以只读写那些我们真正打算修改的文件。
我们还用open() 方法在r+ 模式下打开文件。这允许我们读取文件内容,然后在进行必要的修改后再写入文件。
if not item.name.startswith('.') and item.is_file():
with open(item, mode="r+") as file:
file_text = file.read()
现在到了一个至关重要的步骤,特别是在谈论模式匹配时,在我们的例子中,搜索Wolrd。这一步使用正则表达式。在 Python 中,为了使用正则表达式,我们将使用 [re](https://docs.python.org/3/library/re.html)模块。
我们将使用这个模块的两个主要函数。第一个是 [compile()](https://docs.python.org/3/library/re.html#re.compile):
而第二个是 [sub()](https://docs.python.org/3/library/re.html#re.compile),用于用正确的拼写替换错误的拼写。因此,我们将做以下工作
regex = re.compile('Wolrd')
file_text = regex.sub('World', file_text)
最后,我们要把替换后的新文本写入我们的文件中,如下所示。
file.seek(0)
file.write(file_text)
把这一切放在一起
在这一节中,让我们看看整个Python脚本的样子,它将在每个文件中寻找Wolrd并将其替换为World。
import os, re
with os.scandir('hello') as directory:
for item in directory:
if not item.name.startswith('.') and item.is_file():
with open(item, mode="r+") as file:
file_text = file.read()
regex = re.compile('Wolrd')
file_text = regex.sub('World', file_text)
file.seek(0)
file.write(file_text)
正如我们所看到的,Python使得使用for循环在多个文件中进行修改变得非常容易。这里要记住的另一个重要部分是使用正则表达式进行模式匹配。