python - 使用正则表达式替换文件中的单词
问题描述
我有一个包含超过 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
是 a list
,您将其转换为字符串,导致re.sub
在 last 之前删除所有内容>\n]
。当您str
在列表上运行时,您会得到例如:
In [1]: str([1, 2])
Out[1]: '[1, 2]'
这是主要问题。您需要的是遍历列表并分别对每一行进行操作并保存修改后的行。
但是有一个比spiltlines
文件对象更好的方法来获取单个列表中的所有行;由于您的文件很大,这将产生巨大的内存成本。
另外,我建议您在对文件的每一行进行操作时使用单独的文件进行读取和写入,然后再写回同一个文件。如果您必须使用同一个文件,我会使用单独的文件,然后shutil.move
在操作完成后将读取的文件替换为写入文件。
所以总的来说,更好的方法是遍历文件对象(因为它是一个迭代器)并执行操作:
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,它具有调用close
文件对象的额外好处,因此您无需手动关闭它们。
如果您的模式与示例中显示的方式完全相同,则可以使用str.replace
,而无需正则表达式:
modified_line = line.replace('test ', ' ')
推荐阅读
- r - 根据R中的字母拆分具有不同组合的字符串
- ruby-on-rails - 如何将红宝石中的哈希值相乘?
- laravel - 条件聚合,laravel中的过滤器
- sql - 以特定顺序从多行中删除数量
- botframework - Microsoft Bot Framework 未显示附加文件图标而仅显示名称?
- amazon-s3 - 无法使用 boto3 从 s3 中删除文件
- elasticsearch - java代码中多个where条件的弹性搜索查询
- javascript - 类型“IntrinsicAttributes”(自定义挂钩)上不存在 React 属性
- html - 如何使我的下拉菜单与 display: none 和 display: block 一起使用?
- wpf - 在 Azure 上部署 WPF 和 Squirrel