将嵌套列表写入文件并在 python 中再次读回

Writing nested lists into file and reading back again in python

我正在练习如何更流畅地使用 python 中的嵌套循环、嵌套列表和 IO 的组合。

为了练习,我尝试将嵌套列表写入文件,然后使用 IO 将文件的内容再次读回屏幕 - 但不幸的是,我 运行陷入困境。

有人可以帮我吗?

我的(有点傻)代码:

row1 = [1, 2, 3]
row2 = [4, 5, 6]
row3 = [7, 8, 9]

matrix = [row1, row2, row3]


def write_data_matrix(filename, in_list):
    outfile = open(filename, "w")

    for listitem in in_list:
        outfile.write(f"{listitem},\n")       #Works
                                          
    outfile.close()

write_data_matrix("matrix.txt", matrix)


def read_file(filename):                              #Does not work as intended
    infile = open(filename, "r")

    for line in infile:
        linje = line.strip("[").strip("]").split(",")
        print(linje)

    infile.close()

read_file("matrix.txt")

我的第一个问题是:

  1. 理想情况下,我想让 write_data_matrix() 函数将内容写入文件,如下所示。谁能帮帮我?
1 2 3
4 5 6
7 8 9

我的第二个问题是:

  1. 如何从如下所示的文件中读取嵌套列表:
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],

并像这样打印到控制台?

1, 2, 3
4, 5, 6
7, 8, 9 

欢迎并非常感谢所有帮助

向努力提高编码能力的菜鸟致以最诚挚的问候:-)

使用这个,'\n'(换行符)需要处理

def read_file(filename):
    infile = open(filename, "r")

    for line in infile:
        #line = line.replace(',','')
        line = line.lstrip("[").rstrip("],\n")
        print(line)

    infile.close()

read_file("matrix.txt")

关于第一部分修改函数-

def write_data_matrix(filename, in_list):
    outfile = open(filename, "w")

    for listitem in in_list:
        outfile.write(f"{' '.join(list(map(str, listitem)))}\n")       #Works
                                          
    outfile.close()

为了得到你想要的结果,你必须修改两个地方的代码:

  1. 代码行:

    outfile.write(f"{listitem},\n")
    

    在每行末尾放置一个多余的逗号。 应该是:

    outfile.write(f"{listitem}\n")
    
  2. 阅读文件时,您尝试去掉括号。但是,右括号 (']') 不是行中的最后一个字符,换行符是。所以行:

     inje = line.strip("[").strip("]").split(",")  
    

    应该是:

     inje = line.strip("\n[]").split(",")
    

现在我们已经让您的代码工作了,让我们稍微讨论一下它背后的概念。您正在尝试做的事情称为序列化和反序列化,即将内存中的对象转换为可以存储在存储设备上的串行表示,然后将存储的数据转换回对象的过程。为此,您创建了自己的(非常合乎逻辑的)序列化方法。但是,您的方法有几个缺点,最大的缺点是缺乏通用性。假设出于某种原因,您要序列化列表列表的列表,或者像您自己创建的完全不同类型的对象,那么您将不得不修改序列化和反序列化函数以适应每种新类型的对象。

正确的做法是使用通常高效且通用的标准序列化方法。两种可能的方法是序列化为 JSON 和序列化为 PICKLE 文件。