【问题标题】:How to find and replace a string in python with a large data set如何使用大型数据集在python中查找和替换字符串
【发布时间】:2019-10-11 21:17:07
【问题描述】:

我正在尝试更改大约 4GB 的大文件的分隔符。分隔符当前为“#|#”,我希望分隔符为“|”。

我尝试进行替换和查找,但由于文件很大,我的计算机没有足够的内存来完成代码。我想知道是否有一种方法可以逐行读取文件以节省内存。

text = open("C:\\test.txt", "r")
text = ''.join([i for i in text]).replace("#|#", "|")
x = open("C:\\test.txt","w")
x.writelines(text)
x.close()

这是文件当前的样子:

场#|#场#|#场#|#

我希望它看起来像

字段 |领域 |字段 |

【问题讨论】:

  • fileinput 模块允许您迭代文件(类似于open)并就地编辑它们。

标签: python delimiter large-files


【解决方案1】:

当然可以逐行编写。 事实上,一般来说,文件处理在使用文件对象作为上下文管理器和行迭代器的更惯用的方式中更实用:

import shutil

with open("C:\\test.txt", "r") as long_file, \
     open("C:\\test_replaced.tmp", "w") as replacement:
    for line in long_file:
        replacement.write(line.replace("#|#", "|"))

shutil.move("C:\\test_replaced.tmp", "C:\\test.txt")

只要您可以将临时文件写入磁盘而不会造成麻烦,此方法就可以使用。 我没有一个好的、简洁的解决方案,使用标准库对文件进行就地更改,但这应该比迭代同一个文件两次并将整个内容读入内存要快得多,内存效率也更高。

【讨论】:

  • 这明显更快,并且不会耗尽我所有的内存。谢谢!!
  • 你也应该尝试@b_c 的解决方案,使用文件输入。我从来没有听说过这是标准库的一部分,但它看起来很酷,而且如果它有效,比我自己的解决方案要好得多。
【解决方案2】:

尝试使用generator,而不是将整个文件读入内存:

text = open("C:\\test.txt", "r")
text = ''.join((i for i in text)).replace("#|#", "|")
x = open("C:\\test.txt","w")
x.writelines(text)
x.close()

(i for i in text) 语法允许在将所有行加载到内存时延迟生成行,而不是 [i for i in text]

【讨论】:

  • 这个生成器无效,因为 join 方法必须完全遍历它来构造结果字符串。 OPs 列表也是可变的,因此通过引用传递,因此在参数传递期间也没有任何好处。
  • 同意。因此,无需使用列表推导,而是在生成的行上循环修改它们,并将它们写入某个文件。
  • 但是为此,您要么需要一个临时文件,要么打开同一个文件以进行读写,然后寻找,这样两个指针就不会彼此滑落。这对于基于行的 I/O 操作来说并不容易。我还测试了您当前基于生成器的解决方案,它似乎与基于 OP 列表的解决方案一样慢。
  • 我同意,你的回答更好
猜你喜欢
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多