繁体   English   中英

使用正则表达式替换文件中的单词

[英]Replacing words in file using regex

我有一个包含超过 40k 行的文件,我需要在其中替换单词,使用正则表达式的行。 我不能让它自己工作。 假设文件看起来像:

test >
test >
test >
test >
def start():
        file = input("file: ")
        fread = open(file, "r")
        linelist = fread.readlines()
        fread.close()
        fwrite = open(file, "w")
        line = re.sub(".*(?=>)", " ", str(linelist))
        fwrite.write(line)
        fwrite.close()


start()

但不是删除测试并给我:

>
>
>

它给了我

  >\n']

没有其他线路

linelist是一个list ,您将其转换为字符串,导致re.sub删除 last >\n]之前的所有内容。 当您在列表上运行str时,您会得到例如:

In [1]: str([1, 2])
Out[1]: '[1, 2]'

这是主要问题。 您需要的是遍历列表并分别对每一行进行操作并保存修改后的行。

但是有一个更好的方法是在文件spiltlines上进行拆分以获取单个列表中的所有行; 由于您的文件很大,这将产生巨大的 memory 成本。

另外,我建议您在对文件的每一行进行操作时使用单独的文件进行读取和写入,然后再写回同一个文件。 如果您必须使用相同的文件,我将使用单独的文件,然后在操作完成后将读取文件替换为写入文件( shutil.move )。

所以总的来说,更好的方法是遍历文件 object (因为它是一个迭代器)并执行操作:

with open('input_file') as in_file, open('output_file', 'w') as out_file:
    for line in in_file:
        modified_line = re.sub(r'^.*(?=>)', ' ', line)
        out_file.write(modified_line)

open是一个上下文管理器,因此您可以在其上with statememnt,它具有在文件 object 上调用close的额外好处,因此您无需手动关闭它们。

如果您的模式与示例中显示的方式完全相同,则可以使用str.replace ,无需正则表达式:

modified_line = line.replace('test ', ' ')

在“python 在线正则表达式测试器”中测试您的正则表达式。 RegExp 很容易出错。 这将告诉您是否正确。

如果您只需要 output 而不是 python 脚本,请尝试 notepad++。 它支持正则表达式,可以处理 40,000 行。 许多其他编辑也这样做。 除非必须,否则不要编码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM