Используя python, как прочитать файл, начиная с седьмой строки? - PullRequest
15 голосов
/ 01 февраля 2011

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

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?

Ответы [ 10 ]

28 голосов
/ 01 февраля 2011
with open('dwn.txt') as f:
    for i in xrange(6):
        f.next()
    for line in f:
        process(line)
8 голосов
/ 01 февраля 2011

Itertools ответ!

from itertools import islice

with open('foo') as f:
    for line in islice(f, 6, None):
        print line
5 голосов
/ 01 февраля 2011
with open('test.txt', 'r') as fo:
   for i in xrange(6):
       fo.next()
   for line in fo:
       print "%s" % line.strip()
3 голосов
/ 29 августа 2018

Python 3:

with open("file.txt","r") as f:
    for i in range(6):
        f.readline()
    for line in f:
        # process lines 7-end
3 голосов
/ 02 февраля 2011

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

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' (это универсальная поддержка новой строки, включенная по умолчанию), то есть в цепочках есть только '\ n' chunk , даже если было '\ r \ n' в файле.

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

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

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

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

1 голос
/ 26 октября 2015

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

Вы можете напрямую использовать команду read(), если вам известна позиция символа pos разделительного (часть заголовка от интересующей части) перевода строки, например \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:]
0 голосов
/ 01 февраля 2011

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

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

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

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

0 голосов
/ 01 февраля 2011
#!/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)
0 голосов
/ 01 февраля 2011

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

f = open('dwn.txt', 'rb')
fileAsList = f.readlines()
fileAsList[0] #first line
fileAsList[1] #second line
0 голосов
/ 01 февраля 2011

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

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