Есть ли способ прочитать файл в цикле в python, используя разделитель, отличный от новой строки
Я обычно читаю файлы вроде этого в Python:
f = open('filename.txt', 'r')
for x in f:
doStuff(x)
f.close()
Однако это разделяет файл по символам новой строки. Теперь у меня есть файл, который имеет всю свою информацию в одной строке (45 000 строк, разделенных запятыми). Хотя файл такого размера тривиально читать, используя что-то вроде
f = open('filename.txt', 'r')
doStuff(f.read())
f.close()
Мне любопытно, если бы для гораздо большего файла, который все в одной строке, можно было бы добиться аналогичного эффекта итерации, как в первом фрагменте кода, но с разбиением на запятую вместо новой строки или любым другим символом?
Ответы
Ответ 1
Следующая функция - довольно простой способ сделать то, что вы хотите:
def file_split(f, delim=',', bufsize=1024):
prev = ''
while True:
s = f.read(bufsize)
if not s:
break
split = s.split(delim)
if len(split) > 1:
yield prev + split[0]
prev = split[-1]
for x in split[1:-1]:
yield x
else:
prev += s
if prev:
yield prev
Вы бы использовали его следующим образом:
for item in file_split(open('filename.txt')):
doStuff(item)
Это должно быть быстрее, чем решение, связанное с EMS, и сэкономит много памяти за чтение всего файла за большие файлы.
Ответ 2
Откройте файл с помощью open()
, затем используйте метод file.read(x)
для чтения (приблизительно) следующих x
байтов из файла. Вы можете продолжать запрашивать блоки из 4096 символов, пока не нажмете конец файла.
Вам нужно будет реализовать разделение самостоятельно - вы можете вдохнуть вдохновение из модуля csv
, но я не думаю, что вы можете использовать его напрямую, потому что он не был предназначен для работы с чрезвычайно длинными линиями.