【问题标题】:Writing nested lists into file and reading back again in python将嵌套列表写入文件并在 python 中再次读取
【发布时间】:2021-09-18 18:03:44
【问题描述】:

我正在练习如何更流畅地使用 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 

欢迎并强烈感谢所有帮助

向试图更好地编码的菜鸟致以最诚挚的问候:-)

【问题讨论】:

标签: python io nested-loops nested-lists file-writing


【解决方案1】:

使用This,需要处理'\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()

【讨论】:

  • 啊哈!我不知道 lstrip() 和 rstrip() 是一回事 :-) 感谢您帮助我!非常感谢!
【解决方案2】:

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

  1. 代码行:

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

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

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

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

    应该是:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 2012-12-01
    • 2015-10-31
    • 1970-01-01
    • 2018-08-10
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多