读取文件并打印前两行和后两行的脚本
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
您的 line12
和 line13
是字符串,而不是列表。因此,即使它们具有正确的内容,通过对它们进行索引,您也只会打印一个字符。那肯定不是你想要的。
对于像您所述示例这样的短文件,最简单的方法是将整个文件读入行列表。
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]
我正在编写一个程序,用户在其中输入文件名,然后输入文件并仅打印文件的前 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
您的 line12
和 line13
是字符串,而不是列表。因此,即使它们具有正确的内容,通过对它们进行索引,您也只会打印一个字符。那肯定不是你想要的。
对于像您所述示例这样的短文件,最简单的方法是将整个文件读入行列表。
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]