我有一个包含数据的非常长的文件(" text.txt")和一个包含1行的文件,这是text.txt的最后一行。这条单行应该每10分钟覆盖一次(由一个简单的chronjob完成),因为text.txt每10分钟收到一行。
基于我在stackoverflow上找到的其他代码片段,我目前运行此代码:
#!/usr/bin/env python
import os, sys
file = open(sys.argv[1], "r+")
#Move the pointer (similar to a cursor in a text editor) to the end of the file.
file.seek(0, os.SEEK_END)
#This code means the following code skips the very last character in the file -
#i.e. in the case the last line is null we delete the last line
#and the penultimate one
pos = file.tell() - 1
#Read each character in the file one at a time from the penultimate
#character going backwards, searching for a newline character
#If we find a new line, exit the search
while pos > 0 and file.read(1) != "\n":
pos -= 1
file.seek(pos, os.SEEK_SET)
#So long as we're not at the start of the file, delete all the characters ahead of this position
if pos > 0:
file.seek(pos, os.SEEK_SET)
w = open("new.txt",'w')
file.writelines(pos)
w.close()
file.close()
使用此代码我收到错误:
TypeError:writelines()需要一个可迭代的参数
(当然)。使用file.truncate()
时,我可以删除原始文件中的最后一行;但是我想保留它并将最后一行提取到new.txt。但是,在使用file.seek时,我无法理解这是如何工作的。所以我在代码的最后部分需要帮助。
file.readlines()
的 lines[:-1]
无法正常使用这些大文件。
答案 0 :(得分:1)
不确定为什么要打开w
,只关闭它而不做任何事情。如果您希望new.txt
包含file
的所有文字,从pos
开始到结尾,那么如何:
if pos > 0:
file.seek(pos, os.SEEK_SET)
w = open("new.txt",'w')
w.write(file.read())
w.close()
答案 1 :(得分:1)
根据您的代码,1
是一个整数,用于表示文件末尾的第一个pos
的位置。
你无法做到 - \n
,因为writelines需要一个行列表。但是file.writelines(pos)
是一个整数。
您也想写信给pos
,因此您应该使用new.txt
文件来撰写,而不是w
。示例 -
file
答案 2 :(得分:0)
以下方法如何:
max_line_length = 1000
with open(sys.argv[1], "r") as f_long, open('new.txt', 'w') as f_new:
f_long.seek(-max_line_length, os.SEEK_END)
lines = [line for line in f_long.read().split("\n") if len(line)]
f_new.write(lines[-1])
这将寻找几乎文件的末尾并读取文件的剩余部分。然后将其拆分为非空行,最后一个条目写入new.txt
。
答案 3 :(得分:0)
以下是如何将文件的最后两行拖尾到列表中:
import subprocess
output = subprocess.check_output(['tail', '-n 2', '~/path/to/my_file.txt'])
lines = output.split('\n')
现在,您可以从列表lines
中获取所需信息。