在python中使用readline()时,可以指定要读取的行吗?当我运行以下代码时,我得到第1,2,3行,但我想阅读第2,6,10行
def print_a_line(line, f):
print f.readline(line)
current_file = open("file.txt")
for i in range(1, 12):
if(i%4==2):
print_a_line(i, current_file)
答案 0 :(得分:3)
不,你不能这样使用readline。相反,跳过你不想要的线。您必须仔细阅读该文件,因为您无法提前知道在哪里寻找特定的行(除非换行符出现在某个常规偏移量中)。您可以使用枚举来确定您所在的行,因此您只需阅读一次该文件,并且可以在您不关心的位置之后停止。
with open('my_file') as f:
for i, line in enumerate(f, start=1):
if i > 12:
break
if i % 4 == 0:
print(i, line)
如果您知道每一行都是某个字节长度,您可以寻找给定行的特定位置,而不是遍历这些行。
line_len = 20 # bytes
with open('my_file', 'rb') as f:
for i in range(0, 13, 4):
f.seek(i * line_len)
print(f.read(line_len).decode())
答案 1 :(得分:3)
您可以使用itertools中的consume recipe,这是跳过行的最快方法之一:
from itertools import islice
from collections import deque
def consume(iterator, n):
"Advance the iterator n-steps ahead. If n is none, consume entirely."
# Use functions that consume iterators at C speed.
if n is None:
# feed the entire iterator into a zero-length deque
deque(iterator, maxlen=0)
else:
# advance to the empty slice starting at position n
next(islice(iterator, n, n), None)
with open("in.txt") as f:
l = []
sm = 0
for i in (2, 6, 10):
i -= sm
consume(f, i-1)
l.append(next(f, ""))
sm += i
我们只需要减去已经消耗的东西,这样我们就可以保持每条线的匹配。 您可以将代码放在函数中并生成每一行:
def get_lines(fle,*args):
with open(fle) as f:
l, consumed = [], 0
for i in args:
i -= consumed
consume(f, i-1)
yield next(f, "")
consumed += i
使用只需传递文件名和行号:
的test.txt:
1
2
3
4
5
6
7
8
9
10
11
12
输出:
In [4]: list(get_lines("test.txt",2, 6, 10))
Out[4]: ['2\n', '6\n', '10\n']
In [5]: list(get_lines("stderr.txt",3, 5, 12))
Out[5]: ['3\n', '5\n', '12']
如果你只想要一行,你也可以使用linecache:
import linecache
linecache.getline("test.txt",10)
答案 2 :(得分:2)
with open('file.txt', 'r') as f:
next(f)
for line in f:
print(line.rstrip('\n'))
for skip in range(3):
try:
next(f)
except StopIteration:
break
文件:
1
2
3
4
5
6
7
8
9
10
结果:
2
6
10
这适用于脚本或函数,但如果您希望它隐藏交互式shell中的跳过行,则必须将next(f)
调用保存到临时变量。
答案 3 :(得分:1)
始终从第一个字符开始读取文件。读者不了解内容,因此不知道行的开始和结束位置。 readline
只是读取,直到它观察到换行符。
这对任何语言都是如此,不仅仅是Python。如果你想获得第n行,你可以跳过n-1行:
def my_readline(file_path, n):
with open(file_path, "r") as file_handle:
for _ in range(1, n):
file_handle.readline()
return file_handle.readline()
请注意,使用此解决方案,您需要在每个函数调用时打开文件,这会严重降低程序的性能。