Запись двумерного списка в файл, его чтение и повторное использование сохраненного списка

Я хотел бы записать двумерный массив в текстовый файл Python 3.

например

 My_list = ['Hello', 'World', 0], ['Pretty', 'World', 1], ['Tired', 'World', 2]]

переходя в my_text.txt.

Я пробовал множество подходов, ни один из которых я не могу порекомендовать, так как получаю различные результаты, включая списки из 1 элемента:

["['Hello', 'World', 0], ['Pretty', 'World', 1], ['Tired', 'World', 2]"]

и списки строк:

["[Hello', 'World', 0]", "['Pretty', 'World', 1]", "['Tired', 'World', 2]"]

наряду с другими замечательными результатами. Кто-нибудь знает какой-нибудь простой простой код для этого или учебник? Просто делаю это из любопытства, т. е. и сильно борюсь.

Я хотел бы иметь возможность снова прочитать свой список из файла и снова полностью использовать его как список. например, print(my_list[0][0]) дает 'Hello'

Можете ли вы опубликовать часть кода, который вы пробовали? Тогда мы сможем подсказать вам, где вы могли пойти неправильным путем...

Niels Henkens 18.01.2019 19:59

@LoosaBway «Я хотел бы снова прочитать свой список из файла и снова полностью использовать его как список», проблема в том, что вы просто записываете строковое представление списка в файл и вызываете эту сериализацию. Как предлагают другие ответы здесь, вы должны просто использовать один из встроенных форматов сериализации, JSON, YAML, pickle (еще не упоминается). В противном случае вам придется самостоятельно анализировать строковое представление. Важным моментом является то, что вы сохраняете в файле это не список

juanpa.arrivillaga 18.01.2019 21:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
46
3

Ответы 3

json хорошо сериализует списки/слова/числа/строки:

import json 

My_list = [['Hello', 'World', 0], ['Pretty', 'World', 1], ['Tired', 'World', 2]]

#write to file
with open("data.json", "w") as file:
    json.dump(My_list, file)

#read from file
with open("data.json") as file:
    new_list = json.load(file)

print(new_list)

Результат:

[['Hello', 'World', 0], ['Pretty', 'World', 1], ['Tired', 'World', 2]]

Но поскольку я потратил несколько часов на это упражнение, я думаю (?) Трудность, возникающая из-за тенденции различных инструкций текстового файла Python добавлять речевые метки к тому, что сохраняется/извлекается, я хотел бы решить эту проблему, я думаю, только ради этого.

Loosa Bway 18.01.2019 20:00

Учитывайте также ямл. Требуется установить пйямл (pip install pyyaml).

import yaml

Сохраните объект списка в файл:

my_list = [['Hello', 'World', 0], ['Pretty', 'World', 1], ['Tired', 'World', 2]]

with open('my_list.yml', 'w') as outfile:
    yaml.dump(my_list, outfile, default_flow_style=False)

Выходной файл выглядит следующим образом:

- - Hello
  - World
  - 0
- - Pretty
  - World
  - 1
- - Tired
  - World
  - 2

Чтобы загрузить список обратно:

with open("my_list.yml", 'r') as inputfile:
    my_list_back = yaml.load(inputfile)


To handle directly string you could use the standard library ast.literal_eval, this is a simple example, you can customise further.
import ast

string_list = (str(my_list)) # convert tostring then save it to file
print(string_list.__class__) # it's a string
reconverted_list = ast.literal_eval(string_list) # convert back with ast
print(reconverted_list.__class__) # it's a list

Чем базовое чтение/запись может быть:

with open('my_list.txt', 'w') as file:
    file.write(str(my_list))

with open('my_list.txt', 'r') as file:
    my_list_back = ast.literal_eval(file.read())

Мне бы очень хотелось решить проблему простого использования методов чтения строк и файлов - обработка различных речевых меток кажется такой сложной задачей.

Loosa Bway 18.01.2019 23:00

Я добавил правку в свой пост, если я понимаю, что вы имеете в виду. Вам нужно интерпретировать строку как другой объект (в данном случае список), поэтому вы можете посмотреть на docs.python.org/3/library/ast.html.

iGian 19.01.2019 09:03

Привет кому интересно.

Я хотел сохранить массив в текстовый файл Python и полностью извлечь его, чтобы я мог обращаться ко всем элементам.

Я упорствовал в своей проблеме и решил ее с очень грязным кодом, я уверен.

Код ниже делает то, что я хотел сделать.

Бессмысленное упражнение, но я просто должен был это сделать.

Спасибо за вашу помощь и идеи.

my_list = []
my_list_669 = []

def create_list():
    #Creating the list

    for x in range(5):
        my_list.append(["Hello", "World", x])

    print("my_list = ", my_list)


def save_list_to_file():
    #creating the string

    string_1 = ""

    for item in my_list:
        string = item[0] + "," + item[1] + "," + str(item[2]) + "\n"
        string_1 += string
        #adds records to a string with a line return after each record

    with open('your_file.txt', 'w') as f:
            f.write(string_1)


def recover_list():

    with open('your_file.txt', 'r') as f:
            tiing = f.read().splitlines()
            #splits lines at \n and inserts into array called 'tiing'
            #each item is equivalent to a record

    for items1 in tiing:
        my_list_69 = items1.split(",")
        #splits the array items in ting at "," mark
        #these are now in an array called 'my_list_69'
        #below I access all items from within the list
        #and append them to a temporary sub-list

        sub_list = []
        for items in my_list_69:
            sub_list.append(items)

        my_list_669.append(sub_list)  this reconstructs the list


create_list()
save_list_to_file()
recover_list()

Testing:
print(my_list_669)
print(my_list_669[0])
print(my_list_669[0][2])
for items in my_list_669:
    print(items)

Другие вопросы по теме