【问题标题】:How to find and replace a certain part of a file?如何查找和替换文件的某个部分?
【发布时间】:2014-07-01 21:40:04
【问题描述】:

我有一个非常庞大的主文件,需要提取其中的一部分以便对其进行编辑。 (在这里想想 100k+ 行。)我已经有一个脚本可以从文件中取出部分内容,比如说我有

module 1
  module a
    module aa
    module bb
  module b
    module cc
    module dd

然后我运行脚本并删除一个,我得到了

module a
  module aa
  module bb

我想知道在对它进行更改后如何将模块 a 及其所有子模块添加回文件中。

与此类似:python replace section of text with only knowing the begining and last word 除了如何在该点重新添加文本。

【问题讨论】:

  • 如果一个人不知道整个问题,这比建议更难。至于建议,既然您已经有一个贯穿该文件的脚本,请创建一个新文件并在其中转储数据。如果不需要编辑某些内容,请将其转储。如果需要编辑某些内容,请进行编辑然后转储它。您应该留下一个包含所有更改的文件...

标签: python


【解决方案1】:

没有“插入文件”之类的东西。这并不是因为 python 太笨而不能包含它,而是因为文件系统中的文件是有组织的,因此唯一简单的插入操作是:

  • 用 n 字节的(其他)数据替换 n 字节
  • 将数据附加到文件末尾

我假设您不想将完整的文件加载到内存中(如果您的文件不是太大,这确实是一种选择)但您想对该文件进行操作。那么如果你想用一些其他数据替换文件中的字节n..p,步骤是:

  • 将字节 0..n-1 从原始文件复制到临时文件
  • 附加新数据(替换 n..p 之间的数据)
  • 将字节 p+1..(end) 从原始文件复制到临时文件
  • 将临时文件重命名为与原始文件相同的名称

最后一步通常确保更改是原子的,即,如果这在某个时候崩溃,您将拥有原始文件或新文件的完整名称。


当涉及到这个的python实现时,“从文件复制到文件”操作应该分块完成。如果你的内存不足,你需要重复使用readwrite 命令,并使用合适的块大小(例如,一次 10 MB)。

(如果您逐行处理文件,则无需任何额外的努力,如 Byron Coetsee 的评论中所建议的那样。)

【讨论】:

  • 我没有任何内存限制,所以我应该能够一次处理整个文件。感谢您的回答!
  • 那么最简单的方法就是将整个文件读入内存,并使用内存中的字符串进行操作。一个有用的技巧可能是为您的文件制作一个片段列表,然后最后加入它。例如"".join([original[:n], newdata, original[p+1:](好吧,只有三个部分:original[:n] + newdata + original[p+1:] 更容易阅读)。
猜你喜欢
  • 2016-08-12
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 2017-09-12
  • 1970-01-01
相关资源
最近更新 更多