Как записать вложенный список обратно в текстовый файл, чтобы в каждой строке был один список?

Вопрос:

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

Список нужен для компиляции обратно в текстовый файл в точно таком же формате, каким он был до вытягивания функцией f.readfiles().

Также принимаются решения, отличные от решений на основе переменных, и решения с несколькими переменными. csv module тоже вариант, но лучше сначала изучить логику без него.

Введение в проблему

Предположим, что есть text file, который содержит list в каждой строке, например:

['some_text','foo', some_int]
['some_text','foo', some_int]
['some_text','foo', some_int]
...

Каждый список содержит несколько пунктов. Все строки должны быть read из текстового файла в один большой вложенный список и сохранены в variable следующим образом:

variable = [['some_text','foo', some_int],
            ['some_text','foo', some_int],
            ['some_text','foo', some_int]]

Формат информации, хранящейся в переменной выше, не имеет значения. Список, сохраненный в переменной, теперь редактируется с помощью некоторых инструментов списка. Когда редактирование завершено, переменная, содержащая отредактированный список, снова записывается обратно в тот же текстовый файл, перезаписывая все данные новыми измененными данными, например:

['some_text','bar', some_int]
['edited_tx','foo', some_int]
['some_text','foo', edtd_int]
...

Чтение строк

Мне удалось прочитать строки с этим кодом:

with open("my_lists.txt") as f:
    listed_text = f.readlines()

Весь текст внутри текстового файла теперь хранится в переменной с именем listed_text, которая к тому времени редактируется с некоторыми список инструментов предпочтительнее.

Подробнее о приведенном выше коде здесь:

Как прочитать строку файла построчно в список?

Неполный пример кода для чтения и записи файла

Это неполный и нерабочий пример кода того, что нужно было сделать со списками.

# Let us open 'my_lists.txt' and read lines
# into a variable as a list.


def open_file():
    with open("my_lists.txt") as f:
        listed_text = f.readlines()
    list_item_editor(listed_text)

# Now let us replace 'foo' every index(1) in
# nested lists with word 'bar' with
# this imaginary editor 'list_item_editor()'.


def list_item_editor(argument):
    edited_list = []
    for item in nested_list:
        nested_list[item][i] = "bar"
    ...
    ...
    write_file(edited_list)

# Now we write the edited list back to 'my_lists.txt'
# by replacing the whole contents with new edited list.


def write_file(arg):
    with open("my_lists.txt", "w") as write_file:
        write_file.write(arg)

Предпочтительный выход

Это пример предпочтительного вывода. Каждый элемент (список) внутри вложенного списка записывается в отдельную строку. Метка новой строки \n не видна внутри текстового файла.

# This is text_file.txt containing edited lists
# New line inserted after every list

['some_text','bar', some_int]
['edited_tx','foo', some_int]
['some_text','foo', edtd_int]
['some_text','bar', some_int]
['edited_tx','foo', some_int]
['some_text','foo', edtd_int]
['some_text','bar', some_int]
['edited_tx','foo', some_int]
['some_text','foo', edtd_int]

person Kasperi Koski    schedule 23.09.2017    source источник
comment
Я не совсем уверен, хотите ли вы, чтобы файл содержал буквально: ['some_text','bar',some_int], или это просто пример, но на самом деле вы хотите ['some_text','bar',1]. Или, в частности, если вы запустите x=1 ; variable=[['foo','bar',x]], что именно вы хотите, чтобы ваш файл содержал?   -  person viraptor    schedule 23.09.2017
comment
Вы действительно хотите, чтобы файл выглядел как формат списка Python? Проще просто использовать модуль csv и иметь строки типа some_text,bar,5 в файле.   -  person Mark Tolonen    schedule 23.09.2017
comment
@MarkTolonen Я изучаю этот модуль csv, но мне бы очень хотелось изучить и этот модуль.   -  person Kasperi Koski    schedule 23.09.2017
comment
@viraptor Да, извините, аргументы 'some_text', 'bar' и some_int были просто примерами. Значение каждого индекса может быть каким угодно.   -  person Kasperi Koski    schedule 23.09.2017


Ответы (1)


С входным файлом:

['some_text','foo', 1]
['some_text','foo', 2]
['some_text','foo', 3]

Это будет читать/редактировать/записывать файл:

import ast

with open('input.txt') as f:
    data = [ast.literal_eval(line) for line in f]

print(data)

data[0][1] = 'bar'
data[-1][-1] = 5

print(data)

with open('output.txt','w') as f:
    for line in data:
        f.write(str(line) + '\n')

Но запись списков Python в виде текста в файл — не лучший способ сделать это. Лучше использовать модуль csv, если вы хотите изменить входной файл на это:

some_text,foo,1
some_text,foo,2
some_text,foo,3

И используйте этот код:

import csv

with open('input.txt',newline='') as f:
    r = csv.reader(f)
    data = list(r)

print(data)

# Note, with csv, all columns are read as strings,
# so to do calculations convert:
data = [[a,b,int(c)] for a,b,c in data]

print(data)

data[0][1] = 'bar'
data[-1][-1] += 2

print(data)

with open('output.txt','w',newline='') as f:
    w = csv.writer(f)
    w.writerows(data)

Также обратите внимание на сторонний модуль pandas.

person Mark Tolonen    schedule 23.09.2017
comment
Спасибо, @Марк Толонен! Я посмотрю на это! - person Kasperi Koski; 23.09.2017
comment
Пожалуйста! Не стесняйтесь принять ответ, если он полезен, и/или проголосовать за него. Это способ поблагодарить на ТАК :^) - person Mark Tolonen; 23.09.2017