Как мне прочитать каждую строку файла в Python и сохранить каждую строку как элемент в списке?
Я хочу прочитать файл построчно и добавить каждую строку в конец списка.
with open(filename) as f:
content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content]
file.readlines()
вfor
-loop, сам файл объекта достаточно:lines = [line.rstrip('\n') for line in file]
readlines()
не очень эффективно, так как это может привести к MemoryError . В этом случае лучше перебрать файл, используяfor line in f:
и работая с каждойline
переменной..rstrip()
будет работать немного быстрее, если вы удаляете пробелы с концов линий.with open(filename) as f: content = [i.strip() for i in f.readlines()]
Смотрите вход и выход :
или с удалением символа новой строки:
источник
f.read().splitlines()
, который действительно удаляет новые строкиfor line in open(filename)
безопасным? То есть файл будет автоматически закрыт?lines = [x.rstrip('\n') for x in open('data\hsf.txt','r')]
Если я пишу таким образом, как я могу закрыть файл после прочтения?open
«менеджера контекста» (или какого-либо другого гарантированного способа его закрытия) не является «лучшей практикой», но на самом деле это не один из тех случаев - когда у объекта больше нет ссылок для него будет сборка мусора и закрытие файла, что должно произойти сразу после ошибки или нет, когда обработка списка завершена.Это более явно, чем необходимо, но делает то, что вы хотите.
источник
array
хотя могут быть и другие обстоятельства). Конечно, для больших файлов этот подход может смягчить проблемы.Это даст «массив» строк из файла.
open
возвращает файл, который может быть повторен. Когда вы перебираете файл, вы получаете строки из этого файла.tuple
может взять итератор и создать для вас экземпляр кортежа из предоставленного вами итератора.lines
это кортеж, созданный из строк файла.источник
lines = open(filename).read().split('\n')
вместо этого.lines = open(filename).read().splitlines()
немного чище и считаю, что он также лучше обрабатывает окончания строк DOS.list
занимает на 13,22% больше места, чем atuple
. Результаты приходят отfrom sys import getsizeof as g; i = [None] * 1000; round((g(list(i)) / g(tuple(i)) - 1) * 100, 2)
. Создание atuple
занимает примерно на 4,17% больше времени, чем созданиеlist
(со стандартным отклонением 0,16%). Результаты приходят от бегаfrom timeit import timeit as t; round((t('tuple(i)', 'i = [None] * 1000') / t('list(i)', 'i = [None] * 1000') - 1) * 100, 2)
30 раз. Мое решение предпочитает пространство над скоростью, когда необходимость в изменчивости неизвестна.Если вы хотите
\n
включить:Если вы не хотите, чтобы
\n
включены:источник
В соответствии с Методами Файловых Объектов Питона , самый простой способ преобразовать текстовый файл в
list
:Если вам просто нужно перебрать строки текстового файла, вы можете использовать:
Старый ответ:
Использование
with
иreadlines()
:Если вам не нужно закрывать файл, эта однострочная работа работает:
Традиционный способ:
источник
Вы можете просто сделать следующее, как было предложено:
Обратите внимание, что у этого подхода есть 2 недостатка:
1) Вы храните все строки в памяти. В общем случае это очень плохая идея. Файл может быть очень большим, и вам может не хватить памяти. Даже если он не большой, это просто пустая трата памяти.
2) Это не позволяет обрабатывать каждую строку по мере их чтения. Поэтому, если вы обрабатываете ваши строки после этого, это неэффективно (требуется два прохода, а не один).
Лучший подход для общего случая был бы следующим:
Где вы определяете свою функцию процесса так, как хотите. Например:
(Реализация
Superman
класса оставлена для вас как упражнение).Это будет хорошо работать при любом размере файла, и вы пройдете его всего за 1 проход. Как правило, именно так будут работать универсальные парсеры.
источник
open('file_path', 'r+')
Данные в список
Предположим, что у нас есть текстовый файл с нашими данными, как в следующих строках:
Содержание текстового файла:
python
и в интерпретаторе напишите:Скрипт Python:
Используя append:
Или:
Или:
Или:
вывод:
источник
read().splitlines()
предоставляется вам Python: это простоreadlines()
(что, вероятно, быстрее, так как это менее расточительно).read().splitlines()
иreadlines()
не выдает тот же результат. Вы уверены, что они эквивалентны?strip()
должны бытьrstrip("\n")
или пробелы вокруг строки удаляются. Кроме того,readlines()
в понимании списка нет никакого смысла : лучше просто выполнять итерации по файлу, так как он не тратит время и память, создавая промежуточный список строк.Чтобы прочитать файл в список, вам нужно сделать три вещи:
К счастью, Python делает это очень легко, поэтому самый короткий способ прочитать файл в список:
Однако я добавлю еще несколько объяснений.
Открытие файла
Я предполагаю, что вы хотите открыть определенный файл, и вы не имеете дело непосредственно с дескриптором файла (или с дескриптором файла). Наиболее часто используемая функция для открытия файла в Python -
open
это один обязательный аргумент и два необязательных в Python 2.7:Имя файла должно быть строкой, которая представляет путь к файлу . Например:
Обратите внимание, что необходимо указать расширение файла. Это особенно важно для пользователей Windows, поскольку такие расширения файлов, как
.txt
или.doc
, и т. Д. По умолчанию скрыты при просмотре в проводнике.Второй аргумент -
mode
этоr
по умолчанию, что означает «только для чтения». Это именно то, что вам нужно в вашем случае.Но если вы действительно хотите создать файл и / или записать в файл, вам понадобится другой аргумент. Есть отличный ответ, если вы хотите обзор .
Для чтения файла вы можете опустить
mode
или передать его явно:Оба откроют файл в режиме только для чтения. Если вы хотите прочитать в двоичном файле в Windows, вам нужно использовать режим
rb
:На других платформах
'b'
(двоичный режим) просто игнорируется.Теперь, когда я показал, как с
open
файлом, давайте поговорим о том факте, что вам всегда это нужноclose
снова. В противном случае он будет хранить открытый дескриптор файла до тех пор, пока не завершится процесс (или Python не обработает дескриптор файла).Пока вы можете использовать:
Это не удастся закрыть файл, когда что-то между
open
иclose
выдает исключение. Вы можете избежать этого, используяtry
иfinally
:Однако Python предоставляет контекстные менеджеры, которые имеют более симпатичный синтаксис (но
open
он почти идентичен тому, чтоtry
иfinally
выше):Последний подход - рекомендуемый подход для открытия файла в Python!
Чтение файла
Хорошо, вы открыли файл, теперь как его прочитать?
open
Функция возвращаетfile
объект , и он поддерживает протокол итерации питонов. Каждая итерация даст вам строку:Это напечатает каждую строку файла. Однако обратите внимание, что каждая строка будет содержать символ новой строки
\n
в конце (возможно, вы захотите проверить, построен ли ваш Python с поддержкой универсальной новой строки - в противном случае вы могли бы также использовать\r\n
в Windows или\r
на Mac новые строки). Если вы не хотите, вы можете просто удалить последний символ (или два последних символа в Windows):Но последняя строка не обязательно имеет завершающий символ новой строки, поэтому не стоит ее использовать. Можно проверить, заканчивается ли он завершающим символом новой строки, и, если это так, удалить его:
Но вы можете просто удалить все пробелы (включая
\n
символ) в конце строки , это также удалит все другие конечные пробелы, поэтому вы должны быть осторожны, если они важны:Однако, если строки заканчиваются
\r\n
(Windows, "новые строки"),.rstrip()
это также позаботится о\r
!Хранить содержимое в виде списка
Теперь, когда вы знаете, как открыть файл и прочитать его, пришло время сохранить содержимое в списке. Самый простой вариант - использовать
list
функцию:В случае, если вы хотите убрать завершающие символы новой строки, вы можете использовать вместо этого понимание списка:
Или даже проще:
.readlines()
методfile
объекта по умолчанию возвращаетlist
строку:Это также будет включать в себя завершающие символы новой строки, если вы не хотите их использовать, я бы порекомендовал
[line.rstrip() for line in f]
подход, потому что он избегает хранения двух списков, содержащих все строки в памяти.Есть дополнительная опция для получения желаемого результата, однако она довольно «неоптимальная»:
read
полный файл в строке, а затем разделенный на новые строки:или:
Они позаботятся о конце новой строки, потому что
split
персонаж не включен. Однако они не идеальны, потому что вы сохраняете файл как строку и как список строк в памяти!Резюме
with open(...) as f
при открытии файлов, потому что вам не нужно заботиться о закрытии файла самостоятельно, и он закрывает файл, даже если происходит какое-то исключение.file
объекты поддерживают протокол итерации, поэтому чтение файла построчно так же просто, как иfor line in the_file_object:
.readlines()
но если вы хотите обработать строки перед сохранением их в списке, я бы порекомендовал простое понимание списка.источник
Чистый и Pythonic способ чтения строк файла в список
Прежде всего, вы должны сосредоточиться на том, чтобы открыть свой файл и прочитать его содержимое эффективным и питонным способом. Вот пример того, как я лично НЕ предпочитаю:
Вместо этого я предпочитаю нижеприведенный метод открытия файлов для чтения и записи, поскольку он очень чистый и не требует дополнительного шага закрытия файла после того, как вы его закончили. В приведенном ниже утверждении мы открываем файл для чтения и присваиваем его переменной infile. Как только код в этом операторе закончится, файл будет автоматически закрыт.
Теперь нам нужно сосредоточиться на переносе этих данных в список Python, потому что они итеративны, эффективны и гибки. В вашем случае желаемая цель состоит в том, чтобы перенести каждую строку текстового файла в отдельный элемент. Для этого мы будем использовать метод splitlines () следующим образом:
Конечный продукт:
Тестирование нашего кода:
источник
Представленный в Python 3.4,
pathlib
имеет действительно удобный метод для чтения текста из файлов, а именно:(Этот
splitlines
вызов превращает его из строки, содержащей все содержимое файла, в список строк в файле).pathlib
имеет много удобных удобств.read_text
это красиво и кратко, и вам не нужно беспокоиться об открытии и закрытии файла. Если все, что вам нужно сделать с файлом, это прочитать все сразу, это хороший выбор.источник
Вот еще один вариант, используя списки в файлах;
Это должно быть более эффективным способом, так как большая часть работы выполняется внутри интерпретатора Python.
источник
rstrip()
потенциально удаляет все конечные пробелы, а не только\n
; использовать.rstrip('\n')
.Теперь переменная out - это список (массив) того, что вы хотите. Вы можете сделать:
Или:
Вы получите те же результаты.
источник
Чтение и запись текстовых файлов с помощью Python 2 и Python 3; это работает с Unicode
На что обратить внимание:
with
это так называемый контекстный менеджер . Это гарантирует, что открытый файл снова закрыт..strip()
или.rstrip()
не смогут воспроизвести,lines
поскольку они также удаляют пустое пространство.Общие окончания файлов
.txt
Более продвинутая запись / чтение файлов
Для вашего приложения может быть важно следующее:
Смотрите также: Сравнение форматов сериализации данных
Если вы предпочитаете создавать конфигурационные файлы, вы можете прочитать мою короткую статью Конфигурационные файлы на Python .
источник
Другой вариант
numpy.genfromtxt
, например:Это создаст
data
массив NumPy с таким количеством строк в вашем файле.источник
Если вы хотите прочитать файл из командной строки или из стандартного ввода, вы также можете использовать
fileinput
модуль:Передайте файлы ему так:
Подробнее читайте здесь: http://docs.python.org/2/library/fileinput.html
источник
Самый простой способ сделать это
Простой способ состоит в том, чтобы:
В одной строке это даст:
Тем не менее, это довольно неэффективный способ, поскольку он будет хранить 2 версии контента в памяти (вероятно, не является большой проблемой для небольших файлов, но все же). [Спасибо Марк Эмери].
Есть 2 простых способа:
pathlib
для создания пути для вашего файла, который вы могли бы использовать для других операций в вашей программе:источник
.read().splitlines()
не проще, чем просто звонить.readlines()
. С другой стороны, это неэффективно для памяти; вам не нужно хранить две версии содержимого файла (одну возвращаемую строку.read()
и список возвращаемых строкsplitlines()
) одновременно в памяти.Просто используйте функции splitlines (). Вот пример.
В выводе у вас будет список строк.
источник
.readlines()
. Это помещает две копии содержимого файла в память одновременно (одну как одну огромную строку, одну как список строк).Если вы хотите столкнуться с очень большим / огромным файлом и хотите читать быстрее (представьте, что вы участвуете в конкурсе кодирования Topcoder / Hackerrank), вы можете за один раз прочитать значительно больший кусок строк в буфере памяти, а не просто итерации построчно на уровне файла.
источник
process(line)
это функция, которую вам нужно реализовать для обработки данных. например, вместо этой строки, если вы используетеprint(line)
, она будет печатать каждую строку из lines_buffer.Простейшие способы сделать это с некоторыми дополнительными преимуществами:
или
или
В случае с
set
, мы должны помнить, что у нас не сохранен порядок строк и избавиться от дублированных строк.Ниже я добавил важное дополнение от @MarkAmery :
источник
.close
объект файла и не используетеwith
оператор, в некоторых реализациях Python файл может не закрыться после чтения, и ваш процесс утечет дескриптором открытого файла. В CPython (обычная реализация Python, которую использует большинство людей), это не проблема, поскольку объект file будет сразу же очищен от мусора, и это закроет файл, но, тем не менее, обычно считается, что рекомендуется делать что-то вроде,with open('filename') as f: lines = list(f)
чтобы гарантировать, что файл закрывается независимо от того, какую реализацию Python вы используете.Использовать этот:
data
тип данных и использует значения для получения ndarray. Вы также можете получить список с помощьюarray.tolist()
.источник
pandas.read_csv()
для чтения данных CSV , как это уместно здесь?План и Резюме
С помощью
filename
обработки файла изPath(filename)
объекта или непосредственно с помощьюopen(filename) as f
выполните одно из следующих действий:list(fileinput.input(filename))
with path.open() as f
, позвонитеf.readlines()
list(f)
path.read_text().splitlines()
path.read_text().splitlines(keepends=True)
fileinput.input
илиf
иlist.append
каждую строку по одной за разf
к связанномуlist.extend
методуf
в понимании спискаЯ объясню вариант использования для каждого ниже.
Это отличный вопрос. Во-первых, давайте создадим несколько примеров данных:
Файловые объекты являются ленивыми итераторами, так что просто повторяйте их.
В качестве альтернативы, если у вас есть несколько файлов, используйте
fileinput.input
другой ленивый итератор. Всего одним файлом:или для нескольких файлов передайте ему список имен файлов:
Снова
f
иfileinput.input
выше оба являются / возвращают ленивые итераторы. Вы можете использовать итератор только один раз, поэтому, чтобы обеспечить функциональный код, избегая многословия, я буду использовать немного более краткий,fileinput.input(filename)
где уместно отсюда.Ах, но вы хотите это в списке по какой-то причине? Я бы избежал этого, если это возможно. Но если вы настаиваете ... просто передать результат
fileinput.input(filename)
вlist
:Другой прямой ответ - вызов
f.readlines
, который возвращает содержимое файла (до необязательногоhint
количества символов, чтобы вы могли разбить его на несколько списков таким образом).Вы можете получить к этому файлу объект двумя способами. Один из способов - передать имя файла
open
встроенному:или используя новый объект Path из
pathlib
модуля (который я очень полюбил и буду использовать с этого момента ):list
также будет использовать файловый итератор и возвращать список - довольно прямой метод:Если вы не возражаете прочесть весь текст в память как одну строку перед тем, как разбивать ее, вы можете сделать это как одну строку с
Path
объектом иsplitlines()
строковым методом. По умолчаниюsplitlines
удаляет символы новой строки:Если вы хотите сохранить переводы строк, передайте
keepends=True
:Теперь просить это немного глупо, учитывая, что мы легко продемонстрировали конечный результат несколькими методами. Но вам может понадобиться отфильтровать или обработать строки при составлении списка, поэтому давайте рассмотрим этот запрос.
Использование
list.append
позволит вам фильтровать или работать с каждой строкой, прежде чем добавить ее:Использование
list.extend
будет немного более прямым и, возможно, полезным, если у вас есть существующий список:Или, более идиотски, мы могли бы вместо этого использовать понимание списка, и отображать и фильтровать его, если это желательно:
Или, еще более прямо, чтобы замкнуть круг, просто передайте его списку, чтобы создать новый список напрямую, не работая со строками:
Вывод
Вы видели много способов получить строки из файла в список, но я бы порекомендовал вам избегать материализации больших объемов данных в список и вместо этого использовать ленивую итерацию Python для обработки данных, если это возможно.
То есть предпочитаю
fileinput.input
илиwith path.open() as f
.источник
В случае, если в документе также есть пустые строки, я хотел бы прочитать содержимое и пропустить его,
filter
чтобы предотвратить пустые строковые элементы.источник
Вы также можете использовать команду loadtxt в NumPy. Это проверяет меньше условий, чем genfromtxt, так что это может быть быстрее.
источник
Мне нравится использовать следующее. Чтение строк сразу.
Или используя понимание списка:
источник
readlines()
, что даже влечет за собой потерю памяти. Вы можете просто удалить его, поскольку итерации по (текстовому) файлу дают каждую строку по очереди.with
оператор, чтобы открыть (и неявно закрыть) файл.Я бы попробовал один из следующих методов. Файл примера, который я использую, имеет имя
dummy.txt
. Вы можете найти файл здесь . Я предполагаю, что файл находится в том же каталоге, что и код (вы можете изменить,fpath
чтобы включить правильное имя файла и путь к папке.)В обоих приведенных ниже примерах список, который вы хотите получить
lst
.1.> Первый способ :
2.> Во втором методе можно использовать модуль csv.reader из стандартной библиотеки Python :
Вы можете использовать любой из двух методов. Время, затрачиваемое на создание,
lst
практически одинаково в двух методах.источник
delimiter=' '
аргумент?Вот вспомогательный класс
библиотекиPython (3), который я использую для упрощения файлового ввода-вывода:Затем вы бы использовали
FileIO.lines
функцию, например так:Помните, что параметры
mode
("r"
по умолчанию) иfilter_fn
(проверяет наличие пустых строк по умолчанию) являются необязательными.Вы можете даже удалить методы
read
,write
иdelete
и просто оставитьFileIO.lines
, или даже превратить его в отдельный вызываемый методread_lines
.источник
lines = FileIO.lines(path)
ли это проще, чемwith open(path) as f: lines = f.readlines()
оправдать существование этого помощника? Вы экономите 17 символов на вызов. (И в большинстве случаев по соображениям производительности и памяти вы захотите зацикливаться на файловом объекте напрямую, а не в любом случае читать его строки в списке, так что вам даже не захочется использовать это часто!) часто фанат создания небольших утилитарных функций, но мне кажется, что это просто ненужно создавать новый способ написать что-то, что уже коротко и легко с помощью стандартной библиотеки.Версия командной строки
Бежать с:
источник