读取文件并打印前两行和后两行的脚本

Script to read file and print first two and last two lines of it

我正在编写一个程序,用户在其中输入文件名,然后输入文件并仅打印文件的前 2 行和后 2 行。我已经弄清楚如何打印前两行,并且我尝试打印最后两行但是遇到了问题。谁能解释我做错了什么?

f1 = open(input("Source file name: "))

line1= f1.readline()
line2= f1.readline()
line12= f1.readline()
line13= f1.readline()
print("Output:",line1,line2,line12[-1],line13[-2], sep= "")
f1.close()

文件长 13 行,因此输出应如下所示:

output:
line 1
line 2
line 12
line 13

您正在阅读前 4 行。您需要通读所有内容并只保留最后两个。

此代码通读所有内容,保存最后两行:

line1 = f1.readline()
line2 = f1.readline()

last1, last2 = f1.readline(), f1.readline()
while True:
    line = f1.readline()
    if not line:  # eof
        break
    last1, last2 = line, last1

print("Output:",line1,line2,last2,last1, sep= "")

例如,文件 test.txt:

Line1
line2
Line3
line4
Line5
line6
last line, line 7

你得到:

Output:Line1
line2
line6
last line, line 7

您可以在文件对象迭代器上使用 next() 来获取前两行,然后使用 deque() 作为循环缓冲区来捕获最后两行。这也适用于少于 4 行或没有行的文件!

from collections import deque


with open("test.txt") as f_in:

    print(next(f_in, ""), end="")
    print(next(f_in, ""), end="")

    buffer = deque(maxlen=2)
    for line in f_in:
        buffer.append(line)

    for line in buffer:
        print(line, end="")

text.txt

1
2
3
4
5
6
7
8
9
10

输出:

1
2
9
10

您的 line12line13 是字符串,而不是列表。因此,即使它们具有正确的内容,通过对它们进行索引,您也只会打印一个字符。那肯定不是你想要的。

对于像您所述示例这样的短文件,最简单的方法是将整个文件读入行列表。

with open(input("Source file name: ")) as f1:
    lines = f1.readlines()
print("Output:",lines[0],lines[1],lines[-2],lines[-1], sep= "")

对于较大的文件,该方法会很慢并且可能会使您 运行 内存不足。如果您知道一行的最长长度,您可以寻找接近文件末尾的位置并单独读取文件的最后几行。我不会为此提供代码,因为它不适用于您的情况。

简单的方法!

with open("test.txt") as f:
    lines = f.read().split("\n")
    last1 = lines[len(lines)-1]
    last2 = lines[len(lines)-2]
    first1 = lines[0]
    first2 = lines[1]

详细了解 read and split