有时您需要在多个文本文件里批量替换,例如,如果您想更新某些文件以使用美式拼写而不是英式拼写。
在这个快速提示中,我将向您展示一个示例,其中我们有五个拼写错误的文本文件。也就是说,不是写“ World ”,而是写“ Wolrd ”。该示例将向您展示我们如何使用 Python 来更正目录中包含的所有文本文件中该单词的拼写。
让我们开始吧!
1、数据准备
在我们继续这个例子之前,让我们准备我们想要使用的数据(文本文件)。对于本教程,我们将创建一个名为hello的目录,其中将包含不同的文件和子目录,包括名为1.txt、2.txt、3.txt、4.txt和5.txt的文本文件。
虽然我们将用于遍历文件列表的函数将包括目录中的所有文件,但我们可以在代码中添加自己的条件来限制我们要修改的文件。
2、执行
让我们进入有趣的部分。我们需要做的第一件事是读取目录hello的内容。为此,我们可以使用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()
我们还使用mode中的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
模块。
我们将使用该模块中的两个主要功能。第一个是compile()
:
将正则表达式模式编译成正则表达式对象,可以使用它的match()
和search()
方法进行匹配。
第二个是sub()
,用正确的拼写代替错误的拼写。因此,我们将执行以下操作:
regex = re. compile ( 'Wolrd' ) file_text = regex.sub( 'World' , file_text) |
最后,我们希望将替换后的新文本写入我们的文件,如下所示:
file .seek( 0 ) file .write(file_text) |
3、最后
在本节中,让我们看看将在每个文件中查找Wolrd并将其替换为World的整个 Python 脚本的外观:
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 循环对多个文件进行修改变得非常容易。这里要记住的另一个重要部分是使用正则表达式进行模式匹配。
如果您想了解更多关于 Python 循环的信息,请查看Python 循环上的平滑复习。并且,有关正则表达式的更多信息,请查看Python 中的正则表达式。
发表评论