33

我只需要读取一个大文件的第一行并进行更改。

是否有只更改文件的第一行并使用 Python 将其保存为另一个文件的技巧?我所有的代码都是用 Python 完成的,可以帮助我保持一致性。

这个想法是不必读取然后写入整个文件。

4

7 回答 7

37

shutil.copyfileobj()应该比逐行运行快得多。来自文档的注释:

注意如果[from_file]对象的当前文件位置不为0,则只会复制从当前文件位置到文件末尾的内容。

因此:

from_file.readline() # and discard
to_file.write(replacement_line)
shutil.copyfileobj(from_file, to_file)
于 2013-02-18T23:45:32.987 回答
4

如果要修改文件的第一行并将其保存为新文件名,则不可能简单地修改第一行而不迭代整个文件。从好的方面来说,只要你不打印到终端,修改文件的第一行是非常非常快的,即使在非常大的文件上也是如此。

假设您正在使用基于文本的文件(不是二进制文件),这应该满足您的需求并且对于大多数应用程序来说表现得足够好。

import os
newline = os.linesep # Defines the newline based on your OS.

source_fp = open('source-filename', 'r')
target_fp = open('target-filename', 'w')
first_row = True
for row in source_fp:
    if first_row:
        row = 'the first row now says this.'
        first_row = False
    target_fp.write(row + newline)
于 2013-02-18T23:37:04.363 回答
3

不需要遍历不感兴趣的行的替代解决方案。

def replace_first_line( src_filename, target_filename, replacement_line):
    f = open(src_filename)
    first_line, remainder = f.readline(), f.read()
    t = open(target_filename,"w")
    t.write(replacement_line + "\n")
    t.write(remainder)
    t.close()
于 2013-02-18T23:51:03.683 回答
2

除非新行与旧行长度相同,否则不能这样做。如果是,您可以通过mmap解决此问题。

于 2013-02-18T23:34:03.687 回答
2

sh模块对我有用:

import sh

first = "new string"
sh.sed("-i", "1s/.*/" + first + "/", "file.x")
于 2018-01-26T02:34:36.497 回答
0

我将使用的解决方案是使用创建一个缺少旧第一行的文件

from_file.readline() # and discard shutil.copyfileobj(from_file, tail_file)

然后用新的第一行创建一个文件

然后使用以下内容连接 newfirstline 文件和 tail_file

for f in ['newfirstline.txt','tail_file.txt']:
with open(f,'rb') as fd:
    shutil.copyfileobj(fd, wfd, 1024*1024*10
于 2017-01-19T11:06:41.907 回答
0

这是“Nacho”答案的工作示例:

import subprocess

cmd = ['sed', '-i', '-e', '1,1s/.*/' + new_line + '/g', 'filename.txt']

subprocess.call(cmd)
于 2020-07-21T09:58:25.770 回答