Чтение только определенных строк - PullRequest
182 голосов
/ 17 января 2010

Я использую цикл for для чтения файла, но я хочу читать только определенные строки, скажем строки № 26 и № 30. Есть ли встроенная функция для достижения этой цели?

Спасибо

Ответы [ 25 ]

2 голосов
/ 19 января 2010

Вот мои маленькие 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])
2 голосов
/ 17 января 2010
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
2 голосов
/ 17 января 2010

Если вы не возражаете против импорта, то fileinput делает именно то, что вам нужно (это вы можете прочитать номер текущей строки)

2 голосов
/ 15 декабря 2015

Лучшее и незначительное изменение для ответа Алока Сингхала

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()
2 голосов
/ 17 января 2010

Я предпочитаю этот подход, потому что он более универсален, то есть вы можете использовать его в файле, в результате 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']
1 голос
/ 17 мая 2015
file = '/path/to/file_to_be_read.txt'
with open(file) as f:
    print f.readlines()[26]
    print f.readlines()[30]

Используя оператор with, он открывает файл, печатает строки 26 и 30, а затем закрывает файл. Простой! * * 1002

1 голос
/ 18 января 2010

@ OP, вы можете использовать перечисление

for n,line in enumerate(open("file")):
    if n+1 in [26,30]: # or n in [25,29] 
       print line.rstrip()
1 голос
/ 14 декабря 2018

Довольно быстро и точно.

Для печати определенных строк в текстовом файле. Создайте список "lines2print", а затем просто печатайте, когда перечисление находится "в" списке lines2print. Чтобы избавиться от лишних '\ n', используйте line.strip () или line.strip ('\ n'). Мне просто нравится «понимание списка» и я стараюсь использовать, когда могу. Мне нравится метод «с» для чтения текстовых файлов, чтобы предотвратить оставив файл открытым по любой причине.

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]

или, если список маленький, просто введите список как список в понимание.

with open("filepath", 'r') as fp:
    [print(x.strip()) for ei,x in enumerate(fp) if ei in [26,30]]
1 голос
/ 30 сентября 2018

Если ваш большой текстовый файл 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()

Отказ от ответственности Это работает только для файлов одинаковой длины!

1 голос
/ 17 января 2010

Файловые объекты имеют метод .readlines (), который выдаст вам список содержимого файла, по одной строке на элемент списка. После этого вы можете просто использовать обычные методы нарезки списка.

http://docs.python.org/library/stdtypes.html#file.readlines

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...