在python中复制文本文件的最后三行?
我是python新手,它处理变量和列表中变量数组的方式对我来说非常陌生。我通常会将一个文本文件读入一个向量,然后通过确定向量的大小将最后三个复制到一个新数组/向量中,然后使用for循环将最后三个大小的复制函数循环到一个新数组中 我不明白for循环在python中是如何工作的,所以我不能这样做 到目前为止,我已经:在python中复制文本文件的最后三行?,python,list,text,Python,List,Text,我是python新手,它处理变量和列表中变量数组的方式对我来说非常陌生。我通常会将一个文本文件读入一个向量,然后通过确定向量的大小将最后三个复制到一个新数组/向量中,然后使用for循环将最后三个大小的复制函数循环到一个新数组中 我不明白for循环在python中是如何工作的,所以我不能这样做 到目前为止,我已经: #read text file into line list numberOfLinesInChat = 3 text_file = open(
#read text file into line list
numberOfLinesInChat = 3
text_file = open("Output.txt", "r")
lines = text_file.readlines()
text_file.close()
writeLines = []
if len(lines) > numberOfLinesInChat:
i = 0
while ((numberOfLinesInChat-i) >= 0):
writeLine[i] = lines[(len(lines)-(numberOfLinesInChat-i))]
i+= 1
#write what people say to text file
text_file = open("Output.txt", "w")
text_file.write(writeLines)
text_file.close()
首先要回答你的问题,我的建议是你有一个索引错误,你应该用writeLine.append()替换writeLine[i]行。之后,还应执行循环以写入输出:
text_file = open("Output.txt", "w")
for row in writeLine :
text_file.write(row)
text_file.close()
我可以推荐一种更具蟒蛇风格的写作方式吗?具体如下:
with open("Input.txt") as f_in, open("Output.txt", "w") as f_out :
for row in f_in.readlines()[-3:] :
f_out.write(row)
只要您可以在内存中保存所有文件行,就可以对行列表进行切片以获取最后的x项。请参阅并搜索“切片表示法”
def get_chat_lines(file_path, num_chat_lines):
with open(file_path) as src:
lines = src.readlines()
return lines[-num_chat_lines:]
>>> lines = get_chat_lines('Output.txt', 3)
>>> print(lines)
... ['line n-3\n', 'line n-2\n', 'line n-1']
一种可能的解决办法:
lines = [ l for l in open("Output.txt")]
file = open('Output.txt', 'w')
file.write(lines[-3:0])
file.close()
要高效地获取文件的最后三行,请使用
deque
:
from collections import deque
with open('somefile') as fin:
last3 = deque(fin, 3)
这样可以节省将整个文件读入内存的时间,从而切掉您实际上不想要的内容
为了反映您的意见,您的完整代码如下:
from collections import deque
with open('somefile') as fin, open('outputfile', 'w') as fout:
fout.writelines(deque(fin, 3))
如果您不知道python语法,这可能会更清楚一些 lst_lines=lines.split() 这将创建一个包含文本文件中所有行的列表 然后,对于最后一行,您可以执行以下操作: 最后一条=第一条线[-1] secondLAst=lst_线[-2] 等列表和字符串索引可以从'-'结尾处访问 或者,您可以使用以下方法循环浏览并打印特定内容: 开始=开始行,停止=结束位置,步骤=增量依据。 对于范围内的i(开始、停止-1、步骤): string=lst_行[i]
然后将它们写入一个文件
print>>我的文件“\n”.join(第[-3:]行)
Joran的评论只适用于比Python 3旧的版本。因此,一种更具Python风格的方法是。。。什么都没有?哈哈。我一直在努力为代码做一个好的缩进。还有一点:如果少于三行,就没有pb,代码将只写所需的行。我无法理解下面的示例。我想读下面的三行,然后在同一个文件中添加一行,然后重新写入它们,我不确定input.txt会出现在哪里。为了给你一些问题的背景,额外的一行是由IRC chat提供的,我基本上想要一个文本文件,更新后只包含最后4行IRC chat。对不起,请用somefile替换Input.txt。与…有关的。。。强制在blocl的出口处关闭这两个文件。readlines()返回从某个文件中读取的所有行,并截断为最后三行[-3:]。最后,结果列表上的循环正在写入输出文件中的每一行。哇!我不知道这个把戏。它是如何在内部工作的?读者是否逐行阅读,只保留最后三行?我的意思是,我可能会在更详细的模式下编写:line=[]行中的行:line.append(row)line=行[-3:]这看起来不错,如果文件包含的行数少于3行,它会工作吗?@Zac如果没有3行,您将得到remainder@MrDavecollections.deque
can是一种“双端队列”-它还有一个可以放入对象空间的maxsize,以便最早从队列中删除一个新条目。。。。所以给迭代器输入一个迭代器就是这样的…当我把last3写入一个文件时,我必须使用str(last3)或者我得到一个字符串缓冲区错误,但是如果我这样做,我会得到额外的deque和max len字符的负载?如何从last3写入以/n结尾的字符串?