Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中复制文本文件的最后三行?_Python_List_Text - Fatal编程技术网

在python中复制文本文件的最后三行?

在python中复制文本文件的最后三行?,python,list,text,Python,List,Text,我是python新手,它处理变量和列表中变量数组的方式对我来说非常陌生。我通常会将一个文本文件读入一个向量,然后通过确定向量的大小将最后三个复制到一个新数组/向量中,然后使用for循环将最后三个大小的复制函数循环到一个新数组中 我不明白for循环在python中是如何工作的,所以我不能这样做 到目前为止,我已经: #read text file into line list numberOfLinesInChat = 3 text_file = open(

我是python新手,它处理变量和列表中变量数组的方式对我来说非常陌生。我通常会将一个文本文件读入一个向量,然后通过确定向量的大小将最后三个复制到一个新数组/向量中,然后使用for循环将最后三个大小的复制函数循环到一个新数组中

我不明白for循环在python中是如何工作的,所以我不能这样做

到目前为止,我已经:

    #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@MrDave
collections.deque
can是一种“双端队列”-它还有一个可以放入对象空间的maxsize,以便最早从队列中删除一个新条目。。。。所以给迭代器输入一个迭代器就是这样的…当我把last3写入一个文件时,我必须使用str(last3)或者我得到一个字符串缓冲区错误,但是如果我这样做,我会得到额外的deque和max len字符的负载?如何从last3写入以/n结尾的字符串?