С помощью python, как читать файл, начинающийся с седьмой строки?

У меня есть структура текстового файла как:

date
downland

user 

date data1 date2
201102 foo bar 200 50
201101 foo bar 300 35

Итак, первые шесть строк файла не нужны. Имя файла: dnw.txt

f = open('dwn.txt', 'rb')

Как "разбить" этот файл, начиная с строки 7, до EOF?

Ответ 1

with open('dwn.txt') as f:
    for i in xrange(6):
        f.next()
    for line in f:
        process(line)

Ответ 2

Ответы Itertools!

from itertools import islice

with open('foo') as f:
    for line in islice(f, 6, None):
        print line

Ответ 3

with open('test.txt', 'r') as fo:
   for i in xrange(6):
       fo.next()
   for line in fo:
       print "%s" % line.strip()

Ответ 4

На самом деле, чтобы точно ответить на вопрос, как было написано

How do I "split" this file starting at line 7 to EOF?

вы можете сделать

:

если файл невелик:

with open('dwn.txt','rb+') as f:
    for i in xrange(6):
        print f.readline()
    content = f.read()
    f.seek(0,0)
    f.write(content)
    f.truncate()

если файл очень большой

with open('dwn.txt','rb+') as ahead, open('dwn.txt','rb+') as back:
    for i in xrange(6):
        print ahead.readline()

    x = 100000
    chunk = ahead.read(x)
    while chunk:
        print repr(chunk)
        back.write(chunk)
        chunk = ahead.read(x)
    back.truncate()

Функция truncate() необходима, чтобы задать EOF. Без выполнения truncate() хвост файла, соответствующий смещению 6 строк, останется.

.

Файл должен быть открыт в двоичном режиме, чтобы предотвратить возникновение каких-либо проблем.

Когда Python читает '\ r\n', он преобразует их в '\n' (что включена поддержка Universal Newline по умолчанию), то есть скажем, что в цепочке chunk есть только '\n', даже если в файле есть '\ r\n'.

Если файл находится из Macintosh, он содержит только CR = '\ r' новые строки перед обработкой, но они будут изменены на '\n' или '\ r\n' (согласно платформе) во время перезаписи на машине, отличной от Macintosh.

Если это файл из источника Linux, он содержит только строки LF = '\n', которые в ОС Windows будут изменены на '\ r\n' (я не знаю, для файла Linux, обработанного на Macintosh). Причина в том, что ОС Windows записывает '\ r\n' все, что было заказано для записи, '\n' или '\ r' или '\ r\n'. Следовательно, будет записано больше символов, чем чтение, а затем смещение между указателями файлов вперед и назад уменьшится и вызовет беспорядочную переписывание.

В источниках HTML есть также различные строки новой строки.

Поэтому всегда желательно открывать файлы в двоичном режиме, когда они обрабатываются так.

Ответ 5

Альтернативная версия

Вы можете использовать команду read(), если вы знаете позицию символа pos разрыва строки (часть заголовка из части интереса), например. a \n, в тексте, в котором вы хотите разбить свой текст:

with open('input.txt', 'r') as txt_in:
    txt_in.seek(pos)
    second_half = txt_in.read()

Если вас интересуют обе половины, вы также можете исследовать следующий метод:

with open('input.txt', 'r') as txt_in:
    all_contents = txt_in.read()
first_half = all_contents[:pos]
second_half = all_contents[pos:]

Ответ 6

Вы можете прочитать весь файл в виде массива/списка, а затем просто начать с индекса, соответствующего строке, которую вы хотите начать читать.

f = open('dwn.txt', 'rb')
fileAsList = f.readlines()
fileAsList[0] #first line
fileAsList[1] #second line

Ответ 7

#!/usr/bin/python

with open('dnw.txt', 'r') as f:
    lines_7_through_end = f.readlines()[6:]

print "Lines 7+:"
i = 7;
for line in lines_7_through_end:
    print "    Line %s: %s" % (i, line)
    i+=1

Печать

Линии 7 +:

  Line 7: 201102 foo bar 200 50

  Line 8: 201101 foo bar 300 35

Edit:

Чтобы перестроить dwn.txt без первых шести строк, сделайте это после указанного выше кода:

with open('dnw.txt', 'w') as f:
    for line in lines_7_through_end:
        f.write(line)

Ответ 8

Просто выполните f.readline() шесть раз. Игнорируйте возвращаемое значение.

Ответ 9

Решения с readlines() на мой взгляд неудовлетворительны, потому что readlines() читает весь файл. Пользователь должен будет снова прочитать строки (в файле или в подготовленном списке), чтобы обработать то, что он хочет, в то время как это могло быть сделано, не прочитав строки интерлайн уже в первый раз. Более того, если файл большой, память взвешивается содержимым файла, а инструкция for line in file была бы легче.

Выполнение повторения readline() может быть выполнено следующим образом

nb = 6
exec( nb * 'f.readline()\n')

Этот короткий фрагмент кода и nb программно настраивается