Python:在文件的某一行的某个位置更改几个字符

时间:2015-09-04 20:59:20

标签: python file python-3.x line edit

我知道有很多关于编辑文件行的问题,但我的问题非常具体,在两天内我找不到一个问题/答案。

问题

如何将文件中一个特定行的少数(连续)字符 s1 替换为另外几个符合以下条件的字符 s2

  1. 行号始终相同。 (第5号)
  2. s1前面的部分线始终相同。 (因此长度恒定= 18)
  3. s1前面的行部分不会出现在文件的任何其他位置。
  4. s1和s2都不是常数,甚至可以有不同的长度。
  5. s1和s2都可能出现在文件的任何其他位置。
  6. 文件可能很长,所以我不想将整个文件加载到内存中。
  7. 出于与6.相同的原因。我想避免将文件内容复制到新文件中。我只是改变一些字符,所以重写整个文件将是一个很大的开销,不是吗?
  8. 我正在使用Python 3.X。
  9. 到目前为止我发现的大多数类似方法都没有达到6.或7.我找到this(用r+打开文件并在s1之前执行write(s2),但是因为4它对我不起作用。甚至可以在Python中实现我想要的东西或者我必须以某种方式复制我的文件并在此之后修改该行吗?

    背景

    我有一个文本文件,其中包含几行元数据,后跟可能包含大量数据集的文件。元数据包含一行No. of patterns : n,而n是文件中数据集的数量。除此之外,我的脚本应该能够通过附加集合本身并更新n来将附加数据集附加到现有文件。 我希望由我的脚本生成/扩展的这个文件的设计不是我发明的,所以我不能改变它。该文件将作为我未发明的另一个应用程序的输入 - JavaNNS。

2 个答案:

答案 0 :(得分:3)

The answer you linked

  

你只能在最后扩展和截断文件,而不是在头部

有了这个限制,python只反映了我们称之为“文件系统”的数据存储抽象所施加的限制。无论编程语言如何,所有程序在使用文件系统时都受此限制。有些人只是通过在后台重写完整的文件来隐藏用户的这一事实。

如果由于文件的大小而导致更新文件时出现性能问题,那么这种原始文件格式确实存在问题,即使你不是那个被指责的文件格式的问题。 :文件格式似乎不适合用于更改模式数量的文件的就地更新。

如何避免(重新)写入大量数据

如果将使用更新文件(JavaNNS)的程序接受标准输入上的文件内容,请考虑将元数据和模式保存在单独的文件中。像这样,你可以附加模式文件,只重写(希望很小的)元数据文件。然后,只需在一次调用中将两个文件都传输到JavaNNS中:

cat metadata.txt patterns.txt | JavaNNS

如果JavaNNS 接受标准输入所需的文件内容但坚持打开文件本身,您仍然可以使用named pipe并将其作为要打开的文件传递。 (如果JavaNNS对文件进行随机访问而不仅仅是阅读和搜索,这可能不起作用。)

填充

如果你要多次附加到文件中并且文件格式足够灵活以允许一些填充,那么只需填充以为n留出一些空间,在将来的写入中可能会增加位数。像这样,当填充不够大时,你只需要完全重写文件。

答案 1 :(得分:2)

您无法就地编辑,只需为s2更改s1,因为它们可以是不同的长度。您需要写出文件的其余部分,这将使用替换文件更安全。

如果s1和s2保证长度相同,那么你可以在适当的位置进行,例如:该值填充为最大大小s1 / s2:

        self.tableHeight = function() {
            var tableContentOffsetTop = angular.element(document.getElementById("contentTable")).prop("offsetTop"),
                body = document.body,
                html = document.documentElement,
                clientHeight = Math.max(body.scrollHeight,
                                    body.offsetHeight,
                                    html.clientHeight,
                                    html.scrollHeight,
                                    html.offsetHeight);
            return (parseInt(clientHeight, 10) - tableContentOffsetTop);
        };

使用不同的长度,您需要一个不同的文件:

        document.body.scrollHeight = 1000;
        document.body.offsetHeight = 1000;
        document.documentElement.scrollHeight = 1000;
        document.documentElement.clientHeight = 1000;
        document.documentElement.offsetHeight = 1000;
       angular.element(document.getElementById("contentTable")).offSetTop = 250;