Ответ 1
with open('dwn.txt') as f:
for i in xrange(6):
f.next()
for line in f:
process(line)
У меня есть структура текстового файла как:
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?
with open('dwn.txt') as f:
for i in xrange(6):
f.next()
for line in f:
process(line)
Ответы Itertools!
from itertools import islice
with open('foo') as f:
for line in islice(f, 6, None):
print line
with open('test.txt', 'r') as fo:
for i in xrange(6):
fo.next()
for line in fo:
print "%s" % line.strip()
На самом деле, чтобы точно ответить на вопрос, как было написано
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 есть также различные строки новой строки.
Поэтому всегда желательно открывать файлы в двоичном режиме, когда они обрабатываются так.
Вы можете использовать команду 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:]
Вы можете прочитать весь файл в виде массива/списка, а затем просто начать с индекса, соответствующего строке, которую вы хотите начать читать.
f = open('dwn.txt', 'rb')
fileAsList = f.readlines()
fileAsList[0] #first line
fileAsList[1] #second line
#!/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)
Просто выполните f.readline() шесть раз. Игнорируйте возвращаемое значение.
Решения с readlines() на мой взгляд неудовлетворительны, потому что readlines() читает весь файл. Пользователь должен будет снова прочитать строки (в файле или в подготовленном списке), чтобы обработать то, что он хочет, в то время как это могло быть сделано, не прочитав строки интерлайн уже в первый раз. Более того, если файл большой, память взвешивается содержимым файла, а инструкция for line in file
была бы легче.
Выполнение повторения readline() может быть выполнено следующим образом
nb = 6
exec( nb * 'f.readline()\n')
Этот короткий фрагмент кода и nb программно настраивается