我正在使用for循环来读取文件,但我只想读取特定行,比如第26行和第30行。是否有任何内置功能来实现这一目标?
由于
答案 0 :(得分:226)
如果要读取的文件很大,并且您不想一次读取内存中的整个文件:
fp = open("file")
for i, line in enumerate(fp):
if i == 25:
# 26th line
elif i == 29:
# 30th line
elif i > 29:
break
fp.close()
请注意i == n-1
行的n
。
在Python 2.6或更高版本中:
with open("file") as fp:
for i, line in enumerate(fp):
if i == 25:
# 26th line
elif i == 29:
# 30th line
elif i > 29:
break
答案 1 :(得分:133)
快速回答:
f=open('filename')
lines=f.readlines()
print lines[25]
print lines[29]
或:
lines=[25, 29]
i=0
f=open('filename')
for line in f:
if i in lines:
print i
i+=1
有一个更优雅的解决方案,用于提取多行:linecache(由"python: how to jump to a particular line in a huge text file?"提供,以前的stackoverflow.com问题)。
引用上面链接的python文档:
>>> import linecache
>>> linecache.getline('/etc/passwd', 4)
'sys:x:3:3:sys:/dev:/bin/sh\n'
将4
更改为您想要的行号,然后您就可以了。请注意,4将带来第五行,因为计数从零开始。
如果文件可能非常大,并且在读入内存时会导致问题,那么采用@Alok's advice and use enumerate()可能是个好主意。
结束:
fileobject.readlines()
或for line in fileobject
作为小文件的快速解决方案。 linecache
获得更优雅的解决方案,这对于阅读许多文件非常快,可能会反复出现。enumerate()
个文件,这些文件可能非常大,不适合内存。请注意,使用此方法可能会因为按顺序读取文件而变慢。答案 2 :(得分:27)
快速而紧凑的方法可能是:
def picklines(thefile, whatlines):
return [x for i, x in enumerate(thefile) if i in whatlines]
这会接受任何类似打开文件的对象thefile
(无论是从磁盘文件打开,还是通过插件或其他类似文件的流打开调用者)和一组零基于行的索引whatlines
,并返回一个列表,内存占用少,速度合理。如果要返回的行数很大,您可能更喜欢生成器:
def yieldlines(thefile, whatlines):
return (x for i, x in enumerate(thefile) if i in whatlines)
这基本上只适用于循环 - 请注意,唯一的区别来自于在return
语句中使用舍入括号而不是方括号,分别进行列表推导和生成器表达式。
进一步注意,尽管提到了“行”和“文件”,但这些功能很多,很多更通用 - 它们可以在任何迭代上工作,它是一个打开的文件或任何其他文件,根据其渐进项目编号返回项目列表(或生成器)。所以,我建议使用更合适的通用名称; - )。
答案 3 :(得分:25)
为了提供另一种解决方案:
import linecache
linecache.getline('Sample.txt', Number_of_Line)
我希望这很快捷:)
答案 4 :(得分:12)
如果你想要第7行
line = open("file.txt", "r").readlines()[7]
答案 5 :(得分:9)
为了完整起见,这里还有一个选择。
让我们从python docs的定义开始:
切片通常包含序列的一部分的对象。使用下标符号创建切片,[]在给定多个数字时使用数字之间的冒号,例如在variable_name [1:3:5]中。括号(下标)表示法在内部使用切片对象(或者在旧版本中使用__getslice __()和__setslice __())。
虽然切片表示法一般不直接适用于迭代器,但itertools
包中包含替换函数:
from itertools import islice
# print the 100th line
with open('the_file') as lines:
for line in islice(lines, 99, 100):
print line
# print each third line until 100
with open('the_file') as lines:
for line in islice(lines, 0, 100, 3):
print line
该函数的另一个优点是它不会在结束之前读取迭代器。所以你可以做更复杂的事情:
with open('the_file') as lines:
# print the first 100 lines
for line in islice(lines, 100):
print line
# then skip the next 5
for line in islice(lines, 5):
pass
# print the rest
for line in lines:
print line
回答原来的问题:
# how to read lines #26 and #30
In [365]: list(islice(xrange(1,100), 25, 30, 4))
Out[365]: [26, 30]
答案 6 :(得分:8)
快速阅读文件令人难以置信。读取100MB文件只需不到0.1秒(参见我的文章Reading and Writing Files with Python)。因此,您应该完全阅读它,然后使用单行。
这里的大多数答案都没有错,但风格不好。打开文件应始终使用with
,因为它确保文件再次关闭。
所以你应该这样做:
with open("path/to/file.txt") as f:
lines = f.readlines()
print(lines[26]) # or whatever you want to do with this line
print(lines[30]) # or whatever you want to do with this line
如果你碰巧有一个巨大的文件和内存消耗是一个问题,你可以逐行处理它:
with open("path/to/file.txt") as f:
for i, line in enumerate(f):
pass # process line i
答案 7 :(得分:4)
其中一些很可爱,但是可以做得更简单:
start = 0 # some starting index
end = 5000 # some ending index
filename = 'test.txt' # some file we want to use
with open(filename) as fh:
data = fin.readlines()[start:end]
print(data)
这将仅使用列表切片,它会加载整个文件,但是大多数系统会适当地最小化内存使用,它比上面给出的大多数方法都快,并且可以处理我的10G +数据文件。祝你好运!
答案 8 :(得分:3)
您可以进行seek()调用,将您的读头定位到文件中的指定字节。除非您确切地知道在要读取的行之前在文件中写入了多少字节(字符),否则这对您没有帮助。也许您的文件是严格格式化的(每行是X个字节数?)或者,如果您真的想要提高速度,您可以自己计算字符数(记住包括不可见的字符,如换行符)。
否则,您必须阅读所需行之前的每一行,这是根据此处已提出的众多解决方案之一。
答案 9 :(得分:2)
这个怎么样:
>>> with open('a', 'r') as fin: lines = fin.readlines()
>>> for i, line in enumerate(lines):
if i > 30: break
if i == 26: dox()
if i == 30: doy()
答案 10 :(得分:2)
Alok Singhal回答的更好和微小的变化
fp = open("file")
for i, line in enumerate(fp,1):
if i == 26:
# 26th line
elif i == 30:
# 30th line
elif i > 30:
break
fp.close()
答案 11 :(得分:2)
我更喜欢这种方法,因为它更通用,即您可以在f.readlines()
对象的StringIO
结果上使用文件,无论如何:
def read_specific_lines(file, lines_to_read):
"""file is any iterable; lines_to_read is an iterable containing int values"""
lines = set(lines_to_read)
last = max(lines)
for n, line in enumerate(file):
if n + 1 in lines:
yield line
if n + 1 > last:
return
>>> with open(r'c:\temp\words.txt') as f:
[s for s in read_specific_lines(f, [1, 2, 3, 1000])]
['A\n', 'a\n', 'aa\n', 'accordant\n']
答案 12 :(得分:2)
def getitems(iterable, items):
items = list(items) # get a list from any iterable and make our own copy
# since we modify it
if items:
items.sort()
for n, v in enumerate(iterable):
if n == items[0]:
yield v
items.pop(0)
if not items:
break
print list(getitems(open("/usr/share/dict/words"), [25, 29]))
# ['Abelson\n', 'Abernathy\n']
# note that index 25 is the 26th item
答案 13 :(得分:2)
如果您不介意导入,那么fileinput完全符合您的需要(这是您可以读取当前行的行号)
答案 14 :(得分:2)
这是我的小2美分,因为它的价值;)
def indexLines(filename, lines=[2,4,6,8,10,12,3,5,7,1]):
fp = open(filename, "r")
src = fp.readlines()
data = [(index, line) for index, line in enumerate(src) if index in lines]
fp.close()
return data
# Usage below
filename = "C:\\Your\\Path\\And\\Filename.txt"
for line in indexLines(filename): # using default list, specify your own list of lines otherwise
print "Line: %s\nData: %s\n" % (line[0], line[1])
答案 15 :(得分:1)
您可以使用已经提及的语法非常简单地执行此操作,但它是迄今为止最简单的方法:
inputFile = open("lineNumbers.txt", "r")
lines = inputFile.readlines()
print (lines[0])
print (lines[2])
答案 16 :(得分:1)
ax = df.resample(rule='AS').max().plot.bar(xlim=['2017-01-01','2017-03-01'], ylim=[200000,550000])
test.txt是文件名 在test.txt中打印第四行
答案 17 :(得分:1)
如果大型文本文件file
的结构严格(意味着每一行的长度均为l
,则可以用于第n
行)
with open(file) as f:
f.seek(n*l)
line = f.readline() # please notice the s at the end!
last_pos = f.tell()
免责声明:此功能仅适用于长度相同的文件!
答案 18 :(得分:1)
要打印第3行,
line_number = 3
with open(filename,"r") as file:
current_line = 1
for line in file:
if current_line == line_number:
print(file.readline())
break
current_line += 1
原始作者:弗兰克·霍夫曼
答案 19 :(得分:1)
文件对象有一个.readlines()方法,它会为您提供文件内容列表,每个列表项一行。之后,您可以使用常规列表切片技术。
答案 20 :(得分:1)
file = '/path/to/file_to_be_read.txt'
with open(file) as f:
print f.readlines()[26]
print f.readlines()[30]
使用with语句,打开文件,打印第26和30行,然后关闭文件。简单!
答案 21 :(得分:1)
@OP,你可以使用枚举
for n,line in enumerate(open("file")):
if n+1 in [26,30]: # or n in [25,29]
print line.rstrip()
答案 22 :(得分:0)
打印所需的行。 在所需行的上方/下方打印行。
def dline(file,no,add_sub=0):
tf=open(file)
for sno,line in enumerate(tf):
if sno==no-1+add_sub:
print(line)
tf.close()
execute ----> dline(“ D:\ dummy.txt”,6),即dline(“ file path”,line_number,如果要让搜索行的上一行给低1 -1,这是可选的默认值为0)
答案 23 :(得分:0)
在文本文件中打印某些行。创建一个“ lines2print”列表,然后 仅在枚举在lines2print列表中时打印。 要摆脱多余的“ \ n”,请使用line.strip()或line.strip('\ n')。 我只喜欢“列表理解”,并在可以的时候尝试使用。 我喜欢用“ with”方法读取文本文件,以防止 出于任何原因打开文件。
lines2print = [26,30] # can be a big list and order doesn't matter.
with open("filepath", 'r') as fp:
[print(x.strip()) for ei,x in enumerate(fp) if ei in lines2print]
或者如果列表很小,只需在理解中输入list作为列表即可。
with open("filepath", 'r') as fp:
[print(x.strip()) for ei,x in enumerate(fp) if ei in [26,30]]
答案 24 :(得分:0)
如果您想读取特定的行,例如在某个阈值行之后开始的行,则可以使用以下代码,
if (constant($foo) == NULL) {
答案 25 :(得分:-1)
我认为这会起作用
open_file1 = open("E:\\test.txt",'r')
read_it1 = open_file1.read()
myline1 = []
for line1 in read_it1.splitlines():
myline1.append(line1)
print myline1[0]
答案 26 :(得分:-1)
f = open(filename, 'r')
totalLines = len(f.readlines())
f.close()
f = open(filename, 'r')
lineno = 1
while lineno < totalLines:
line = f.readline()
if lineno == 26:
doLine26Commmand(line)
elif lineno == 30:
doLine30Commmand(line)
lineno += 1
f.close()
答案 27 :(得分:-2)
从特定行读取:
parser.add_argument('-t', '--type', help='To download pages/posts',
choices=['pages', 'posts'])