我只需要读取一个大文件的第一行并进行更改。
是否有只更改文件的第一行并使用 Python 将其保存为另一个文件的技巧?我所有的代码都是用 Python 完成的,可以帮助我保持一致性。
这个想法是不必读取然后写入整个文件。
我只需要读取一个大文件的第一行并进行更改。
是否有只更改文件的第一行并使用 Python 将其保存为另一个文件的技巧?我所有的代码都是用 Python 完成的,可以帮助我保持一致性。
这个想法是不必读取然后写入整个文件。
shutil.copyfileobj()
应该比逐行运行快得多。来自文档的注释:
注意如果[from_file]对象的当前文件位置不为0,则只会复制从当前文件位置到文件末尾的内容。
因此:
from_file.readline() # and discard
to_file.write(replacement_line)
shutil.copyfileobj(from_file, to_file)
如果要修改文件的第一行并将其保存为新文件名,则不可能简单地修改第一行而不迭代整个文件。从好的方面来说,只要你不打印到终端,修改文件的第一行是非常非常快的,即使在非常大的文件上也是如此。
假设您正在使用基于文本的文件(不是二进制文件),这应该满足您的需求并且对于大多数应用程序来说表现得足够好。
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)
不需要遍历不感兴趣的行的替代解决方案。
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()
除非新行与旧行长度相同,否则不能这样做。如果是,您可以通过mmap解决此问题。
该sh
模块对我有用:
import sh
first = "new string"
sh.sed("-i", "1s/.*/" + first + "/", "file.x")
我将使用的解决方案是使用创建一个缺少旧第一行的文件
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
这是“Nacho”答案的工作示例:
import subprocess
cmd = ['sed', '-i', '-e', '1,1s/.*/' + new_line + '/g', 'filename.txt']
subprocess.call(cmd)