如何将嵌套列表写回文本文件,以便每行有一个列表?

时间:2017-09-23 01:22:54

标签: python python-3.x list readlines

问题:

如何将嵌套列表从变量写入文本文件,以便嵌套列表中的每个列表都写入自己的行?

需要将列表编译回文本文件,格式与使用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]]

存储在上述变量中​​的信息格式无关紧要。现在使用一些list tools编辑存储在变量中的列表。编辑完成后,包含已编辑列表的变量将再次写回同一文本文件,并使用新的更改数据覆盖所有数据,如下所示:

['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”的变量中,然后正在使用一些list tools首选项进行编辑。

有关上述代码的更多信息,请点击此处:

How do I read a file line-by-line into a list?

读取和写入文件的不完整代码示例

这是一个不完整且不起作用的编码示例,说明了应该对列表进行的操作。

# 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]

1 个答案:

答案 0 :(得分:0)

输入文件为:

['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第三方模块。