В качестве сериализованных структур данных программисты на Python активно используют массивы, списки и словари. Хранение этих структур данных постоянно требует файл или базу данных для работы с ними. Эта статья рассказывает, как печатать список в файл и как считать его обратно в память.
Чтобы записать данные в файл и считать их из файла, язык программирования Python предлагает стандартные методы write() and read() для работы с одиночными строками, а также writelines() и readlines() для работы с множеством строк. Более того, модули pickle и json module предоставляют разумные способы работы с сериализованными наборами данных.
Использование методов read и write
Основные методы отлично работают с символами (строками). Построчное сохранение списка в файл listfile.txt работает следующим образом:
В строке 6 listitem дополнен символом разрыва строки «
», во-первых, и сохранён в выходном файле, во-вторых. Как прочесть список полностью из файла listfile.txt обратно в память, покажет следующий код на Python:
Имейте в виду, что вам понадобится удалить перенос строки в самом её конце. Здесь нам помогает то, что Python позволяет применять списочные операции к строкам. В строке 8 кода выше удаление сделано просто как операция над самой строкой, что сохраняет всё, кроме последнего элемента. Он содержит символ «
», обозначающий перенос строки в системах UNIX/Linux.
Использование методов writelines и readlines
Как упомянуто в начале этой статьи, Python также содержит два метода writelines() и readlines() , чтобы писать и читать множество строк за один шаг соответственно. Напечатать весь список в файл или на диск поможет следующий код на Python:
Прочитать весь список из файла на диске поможет следующий код на Python:
Код выше показывает более традиционный подход, взятый из других языков программирования. Чтобы написать его в более «питоньем» стиле, посмотрим на код ниже:
Открыв файл listfile.txt в строке 5, полностью переделываем список в строке 6. Сначала читаем содержимое файла через readlines() . Затем в цикле for удаляем окончание из каждой строки с помощью метода rstrip() . В конце добавляем строку к списку мест как новый элемент. По сравнению с прошлым листингом код получился более компактным, но его может быть сложнее прочесть начинающим программистам на Python.
Использование модуля pickle
Другие методы, объяснённые до сих пор, хранят список в читаемом для человека формате. В случае, когда это не нужно, вам может пригодиться модуль pickle. Его метод dump() эффективно хранит список в виде двоичного потока данных. В строке 7 (в коде ниже) выходной файл listfile.data открыт для записи в двоичном режиме («wb»). В строке 9 список хранится в открытом файле с использованием метода dump() .
На следующем шаге мы читаем список из файла. Сначала открываем выходной файл listfile.data для чтения в двоичном режиме («rb») в строке 4. Потом загружаем список мест из файла, применяя метод load() .
Эти два примера показывают использование строк. Кстати, pickle работает со всеми видами объектов языка Python, такими как строки, числа, определённые в самом коде структуры, а также любые другие встроенные структуры данных Python.
Использование формата JSON
Используемый pickle формат двоичных данных специфичен для Python. Чтобы улучшить взаимодействие между различными программами, JavaScript Object Notation (JSON) предлагает лёгкую в использовании и читаемую для человека схему, и поэтому стал очень популярным.
Следующий пример показывает, как печатать список из элементов различных типов в выходной файл с помощью модуля json. В строке 4 определён основной список. Имея открытым файлом для записи в строке 7, метод dump() хранит основной список в файле, используя JSON.
Читать содержимое выходноо файла обратно в память так же просто, как записывать данные. Соответствующий dump() метод называется load() и работает следующим образом:
Вывод
Методы, показаные выше, разнятся от простой записи/чтенияя данных до сброса/загрузки через двоичные потоки с помощью pickle и JSON. Это значительно упрощает хранение списка и чтение его обратно в память.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Здравствуйте! Подскажите пожалуйста, как записать многомерный список в файл, а затем читать его по частям. При этом, нужно получать именно массив, а не текстовую строчку. Поясню на примере, который похож на мою задачу.
Есть список:
Хочется в цикле (for i in (1000000):) записывать такой картеж(или массив — не принципиально), как «с» в файл. Затем нужно будет читать из этого файла строчку с нужным номером. При этом, принципиально важно получить именно список с числами, который потом будет обрабатываться, как список.
Например:
Как это можно сделать с наименьшими потерями в производительности?
4 Answers
И всё бы было хорошо, если бы не проблема с зачиткой из файла. Ломаю голову, как зачитать не все строчки подряд, а только с нужным номером. Т.е. нужно набрать новый массив из строчек с определёнными номерами. Строчки идут не по порядку… Так что ещё думаю. Вопрос пока решен не полностью
В комментариях код выглядит не очень, так что напишу в ответе.
Тут мы создаём многомерный массив:
Тут мы его записываем в файл:
Тут мы читаем многомерный массив из файла и выводим некоторые значения:
P.S. Познакомьтесь с индексацией
UPD
Последний апдейт и последний ответ. Если в файле лежат массивы, которые нужно собрать в многомерный, это можно сделать так:
А так можно преобразовать сколькоугодномерный массив в одномерный (это так, на всякий и на будущее):
1) читать данные из файла — дорогостоящая по времени операция, по этому лучше читать все в переменную и работать уже с ней.
2) если объем данных не позволяет держать их в памяти, то помещать все данные в один файл, тоже плохая идея.
Например, при чтении сотой строки файла, необходимо предварительно считать предыдущие 99 строк.
Те при каждом обращении к файлу будет считыватся «лишняя» информация(строки с меньшими индексами)
3) чтобы избежать излишнего считывания(как в п2) и не держать данные в памяти(как в п1),
можно, например, данные помещать в разные файлы, а не в разные строки одного файла.
Для этой цели воспользоватся pickle
+ класс DataFile , который обеспечивает функционал чтения и записи в файл с конкретным индексом.
Чтобы к DataFile можно было обратится с помощью оператора [] нужно определить методы
__setitem__
__getitem__
Добрый день. Вашу задачу можно решить, приведя список с строке:
Также подойдёт использование функции repr():
Чтобы работать с файлами, нужно их открыть. Если файл не существует, он будет создан (только если файл открыт не на чтение). Сделать это можно двумя способами:
Такой формат работы с файлом автоматически не закрывает его, поэтому после работы с ним, его нужно закрыть:
А такой формат работы автоматически закрывает файлы и позволяет открывать несколько файлов сразу:
Получить потом индексацию, конечно, будет невозможно. Да и, вообще, лучше для работы с данными использовать специализированные библиотеки типа pandas и формат данных типа csv или json. Но если так хочется работать с базовыми инструментами, то могу предложить такой вариант на запись:
Таким образом на каждой новой строке мы запишем:
Потом,подавая строки на ввод, мы можем восстановить исходный массив, применяя к ним функцию split(‘ ‘) и получая из каждой строки массив вида:
Ну а далее уже дело за малым: верно собрать массив, обращаясь к элементам массива каждой строки.
Высокоуровневый язык программирования Python 3 предоставляет своим пользователям массу полезных средств для взаимодействия с текстовыми файлами. Встроенные методы платформы позволяют не только создавать документы для хранения строковой информации, но и читать из них данные, а также записывать, удалять и всячески манипулировать их содержимым.
Создание, открытие и закрытие файла
Работа с любым текстовым файлом в Python начинается с вызова специальной функции open, которая принимает в качестве параметров путь к объекту на компьютере и режим обработки. Путь к документу можно указать как абсолютный (адрес расположения на жестком диске ПК), так и как относительный (координаты относительно папки проекта). Выбирая нужный режим обработки файла, следует учитывать его назначение (“w” для записи, “r” для чтения данных). Следующий пример показывает простое взаимодействие с текстовым документом.
Как можно заметить, функция open принимает относительный путь файла и открывает его для записи. Если в папке с исходным кодом документа с аналогичным именем и расширением .txt не существует, метод open создает его самостоятельно, после чего открывает для него нужный режим обработки. Выполнив все необходимые действия с переменной file, которая ссылается на реальный файл, следует вручную закрыть его, чтобы избежать потери информации. Данную задачу выполняет метод close, если вызвать его при помощи оператора доступа (точки).
Выполнить точно такие же действия, но без необходимости вручную закрывать файл, вполне возможно благодаря связке операторов with as. Для этого необходимо поместить метод open сразу после ключевого слова with, а переменную, которая будет ссылаться на файл, прописать за конструкцией as. Ниже располагается пример открытия документа с помощью with as.
Оба примера небольших программ демонстрируют работу с test.txt, который генерируется в каталоге с исходным кодом. В качестве режима обработки для него выбирается запись данных. После этого при помощи метода write в него заносится строка “hello world”. Завершается код в обоих случаях закрытием текстового файла test.txt методом close или автоматически.
Запись построчно
Чтобы быстро записать информацию в текстовый файл, достаточно открыть его в программе, написанной на языке Python, после чего воспользоваться функцией write через переменную, которая ссылается на документ.
В Python запись в файл построчно осуществляется с помощью записи нужной строки с последующей записью символа перевода строки ‘
’. Рассмотрим пример записи списка поэлементно. Каждый элемент будет записан в новой строке:
Приведенный выше пример небольшой программы показывает создание небольшого массива lines, который содержит три строковых элемента: “first”, “second” и “third”. За счет функции open и связки операторов with as происходит открытие текстового файла test.txt в корневом каталоге жесткого диска D. В цикле мы проходим по всем элементам списка и с помощью команды write их записываем. Чтобы каждая запись была с новой строки, добавляем символ перевода строки.
Так же можно воспользоваться функцией writelines. Если мы передадим в качестве ее параметра список, то она запишет элементы друг за другом в одну строку. Но можно поступить следующим образом: в качестве параметра передать генератор следующим образом.
Этот пример отличается от предыдущего тем, что вызывается метод writelines, который принимает в качестве аргумента генератор. Для разделения элементов последовательности тут применяется “
”, благодаря чему каждое слово в документе будет находиться в отдельной строке.
Чтение построчно
Прочитать содержимое текстового файла построчно в языке Python очень просто, поскольку в этом прекрасно помогает цикл for. Но для начала все же необходимо открыть документ, как и в предыдущем случае, при помощи open и with as. Однако на этот раз следует указать другой режим обработки файла, выбрав для него “r” для получения доступа к чтению данных.
В этом примере показывается открытие файла test.txt, в котором уже содержится небольшой массив строк, записанный ранее. Построчное чтение информации из файла производится в цикле for. Каждая итерация выводит сведения из новой строки (line) при помощи функции print. Все элементы отображаются на экране построчно, как и были ранее помещены в test.txt.
Количество строк
Возможности языка Python позволяют производить и куда более сложные виды программных операций с внутренним содержимым текстовых файлов. Например, если требуется определить в Python количество строк в файле, можно открыть файл и в цикле посчитать количество занятых в нем строк. В этом поможет предварительно объявленная переменная count, в которую перед применением нужно записать 0, а затем прибавлять по единице с каждой новой строкой.
Приведенный выше пример демонстрирует работу счетчика count. Для взаимодействия с ним следует открыть текстовый файл в режиме чтения, а затем инкрементировать в каждом новом шаге цикла for объявленную ранее числовую переменную, которая затем выводится в print.
Можно поступить и другим способом. Прочитать файл в список с помощью readlines. А после этого с помощью функции len определить размер списка. Это и будет количество строк.
Поиск строки
Чтобы с помощью Python найти строку в текстовом файле, стоит прибегнуть к помощи встроенного метода readlines, который позволяет автоматически считывать внутреннее содержимое файла. Как и раньше, для начала необходимо открыть test.txt для чтения, чтобы затем поместить данные из него в специальный массив lines. Встроенный метод index позволяет найти номер элемента в последовательности, просто передав ему нужный объект, например, строку “second”.
Поскольку в test.txt все элементы располагаются в отдельных строках, к строке, которую стоит передать методу index в качестве аргумента, необходимо прибавить конструкцию “
”.
Удаление строки
Чтобы в Python удалить ненужную строку из файла, следует воспользоваться сразу двумя режимами обработки файлов: чтение и запись. Для начала необходимо открыть test.txt для чтения, чтобы поместить информацию из него в отдельный массив lines. Далее потребуется удалить один из элементов последовательности при помощи оператора del, указав ему индекс нужной строки в квадратных скобках. Массив объектов, который получился в итоге, необходимо поместить в исходный текстовый файл, однако на этот раз открыть его надо в режиме записи.
Приведенный выше пример небольшой программы демонстрирует удаление строки из файла. В данном случае используются методы readlines и writelines, позволяющие считывать массив строк из документа и записывать его туда же, разделяя отдельные элементы списка.
Таким образом, можно достаточно легко взаимодействовать с содержимым текстовых файлов, пользуясь языком программирования Python 3. Его встроенные функции позволяют записывать данные в документ и считывать их в удобном для пользователя виде. При помощи средств по расширенной работе с файлами, можно управлять ими на куда более продвинутом уровне.