在python中更改文件的第一行

时间:2013-02-18 23:31:22

标签: python

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

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

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

7 个答案:

答案 0 :(得分:28)

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

  

请注意,如果[from_file]对象的当前文件位置不为0,   只有从当前文件位置到结尾的内容   文件将被复制。

因此:

import shutil

from_file = open("filename") 
line = from_file.readline()

# make any changes to line here

to_file = open("filename",mode="w")
to_file.write(line)
shutil.copyfileobj(from_file, to_file)

答案 1 :(得分:3)

如果要修改文件的顶行并将其保存在新文件名下,则无法在不迭代整个文件的情况下修改第一行。从好的方面来说,只要你不打印到终端,修改文件的第一行就非常非常快,即使是在大型文件上也很快。

假设您正在使用基于文本的文件(非二进制文件),这应该符合您的需求,并且对大多数应用程序来说效果都不错。

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)

答案 2 :(得分:2)

除非新行与旧行的长度相同,否则您无法执行此操作。如果是,您可以通过mmap解决此问题。

答案 3 :(得分:2)

sh模块为我工作:

import sh

first = "new string"
sh.sed("-i", "1s/.*/" + first + "/", "file.x")

答案 4 :(得分:0)

一种替代解决方案,不需要迭代不感兴趣的行。

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()

答案 5 :(得分: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

答案 6 :(得分:0)

以下是“ Nacho”答案的有效示例:

import subprocess

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

subprocess.call(cmd)