我只需要读取一个巨大文件的第一行并进行更改。
是否有一个技巧只能更改文件的第一行并使用Python将其另存为另一个文件?我的所有代码都是在python中完成的,可以帮助我保持一致性。
这个想法是不必阅读然后写整个文件。
答案 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)