Мне нужно прочитать большой файл, строка за строкой. Допустим, файл имеет более 5 ГБ, и мне нужно прочитать каждую строку, но, очевидно, я не хочу использовать, readlines()
потому что это создаст очень большой список в памяти.
Как будет работать код ниже для этого случая? Читает ли xreadlines
сам по себе в память? Нужно ли выражение генератора?
f = (line for line in open("log.txt").xreadlines()) # how much is loaded in memory?
f.next()
Кроме того, что я могу сделать, чтобы прочитать это в обратном порядке, так же, как команда Linux tail
?
Я нашел:
http://code.google.com/p/pytailer/
и
« голова питона, хвост и назад читаются по строкам текстового файла »
Оба работали очень хорошо!
Ответы:
Я представил этот ответ , потому что Кит, в то время как сжато, не закрывает файл явно
источник
for
цикла, который перебирает строки, вы можете использоватьchunk = infile.read(chunksize)
для чтения фрагментов ограниченного размера независимо от их содержимого. Вам придется искать внутри фрагментов новые строки самостоятельно.Все, что вам нужно сделать, это использовать объект файла в качестве итератора.
Еще лучше использовать контекстный менеджер в последних версиях Python.
Это также автоматически закроет файл.
источник
Старый школьный подход:
источник
Вместо этого вам лучше использовать итератор. Соответствующий: http://docs.python.org/library/fileinput.html
Из документов:
Это позволит избежать копирования всего файла в память сразу.
источник
close()
метод возвращенногоFileInput
объекта класса по окончании цикла - поэтому я бы не стал использовать его таким образом. В Python 3.2 они наконец сделалиfileinput
совместимым с протоколом менеджера контекста, который решает эту проблему (но код все равно не был бы написан так, как показано).Вот что вы делаете, если в файле нет новых строк:
источник
Пожалуйста, попробуйте это:
источник
Я не мог поверить, что это может быть так просто, как кажется от ответа @ john-la-rooy. Итак, я воссоздал
cp
команду, используя построчное чтение и запись. Это безумно быстро.источник
readline
стандартизирует окончания строк, это имеет побочный эффект при преобразовании документов с окончаниями строк DOS\r\n
в конец строк Unix\n
. Вся моя причина поиска по этой теме заключалась в том, что мне нужно было преобразовать файл журнала, который получает беспорядок в конце строк (потому что разработчик слепо использовал различные библиотеки .NET). Я был шокирован, обнаружив, что после моего начального теста скорости мне не нужно было возвращаться назад иrstrip
к строкам. Это было уже прекрасно!За последние 6 лет этот блестящий проект прошел долгий путь. Он имеет простой API, охватывающий полезный набор функций панд.
dask.dataframe обеспечивает внутреннее распределение, поддерживает множество параллельных операций и позволяет легко экспортировать фрагменты обратно в панды для операций в памяти.
источник
Вот код для загрузки текстовых файлов любого размера без проблем с памятью. Он поддерживает файлы размером в гигабайты
https://gist.github.com/iyvinjose/e6c1cb2821abd5f01fd1b9065cbc759d
скачайте файл data_loading_utils.py и импортируйте его в свой код
использование
Метод process_lines является функцией обратного вызова. Он будет вызываться для всех строк, причем данные параметров представляют одну строку файла за раз.
Вы можете настроить переменную CHUNK_SIZE в зависимости от конфигурации оборудования вашего компьютера.
источник
Как насчет этого? Разделите ваш файл на куски, а затем прочитайте его построчно, потому что когда вы читаете файл, ваша операционная система будет кэшировать следующую строку. Если вы читаете файл построчно, вы неэффективно используете кэшированную информацию.
Вместо этого разделите файл на куски и загрузите весь кусок в память, а затем выполните обработку.
источник
Спасибо! Недавно я перешел на Python 3 и был разочарован использованием readlines (0) для чтения больших файлов. Это решило проблему. Но чтобы получить каждую строчку, мне пришлось сделать пару дополнительных шагов. Каждой строке предшествовала буква «b», которая, я думаю, была в двоичном формате. Использование «decode (utf-8)» изменило его ascii.
Затем мне пришлось удалить «= \ n» в середине каждой строки.
Затем я разбил строки на новой строке.
Вот код, начинающийся чуть выше «данных печати» в коде Арохи.
источник
Я продемонстрировал подход произвольного доступа с параллельным байтовым уровнем здесь в этом другом вопросе:
Получение количества строк в текстовом файле без readlines
Некоторые из уже предоставленных ответов хороши и лаконичны. Мне нравятся некоторые из них. Но это действительно зависит от того, что вы хотите сделать с данными в файле. В моем случае я просто хотел посчитать строки как можно быстрее для больших текстовых файлов. Мой код может быть изменен, чтобы делать другие вещи, конечно, как любой код.
источник
Лучшее решение, которое я нашел в отношении этого, и я попробовал это на 330 МБ файла.
Где line_length - это количество символов в одной строке. Например, «abcd» имеет длину строки 4.
Я добавил 2 в длину строки, чтобы пропустить символ '\ n' и перейти к следующему символу.
источник
Это может быть полезно, когда вы хотите работать параллельно и читать только фрагменты данных, но сохраняйте их чистыми с новыми строками.
источник
надеюсь это поможет.
источник