我使用for循环来读取文件,但我只想读取特定的行,比如第26行和第30行。是否有任何内置功能来实现这一点?


当前回答

简单的回答是:

f=open('filename')
lines=f.readlines()
print lines[25]
print lines[29]

or:

lines=[25, 29]
i=0
f=open('filename')
for line in f:
    if i in lines:
        print i
    i+=1

有一个更优雅的解决方案来提取许多行:linecache(由“python:如何跳转到一个巨大文本文件中的特定行?”提供,这是stackoverflow.com之前的一个问题)。

引用上面链接的python文档:

>>> import linecache
>>> linecache.getline('/etc/passwd', 4)
'sys:x:3:3:sys:/dev:/bin/sh\n'

将4更改为您想要的行号,然后就开始了。注意,4将带来第五行,因为计数是从零开始的。

如果文件非常大,并且在读入内存时会出现问题,那么接受@Alok的建议并使用enumerate()可能是个好主意。

结论:

使用fileobject.readlines()或fileobject中的for line作为小文件的快速解决方案。 使用linecache作为一个更优雅的解决方案,它将非常快地读取许多文件,可能是重复的。 采纳@Alok的建议,使用enumerate()来处理可能非常大的文件,并且不适合内存。注意,使用此方法可能会变慢,因为文件是按顺序读取的。

其他回答

如果你不介意导入,那么fileinput确实是你需要的(这是你可以读取当前行的行号)

这是我的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])

如果你想看第7行

line = open("file.txt", "r").readlines()[7]
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

我更喜欢这种方法,因为它更通用,即你可以在文件上使用它,在f.r edlines()的结果上,在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']