【问题标题】:PYTHON readlines()-cannot access lists within a bigger listPYTHON readlines() - 无法访问更大列表中的列表
【发布时间】:2014-04-25 00:23:53
【问题描述】:

我目前正在为学校做一个涉及制作图形编辑器的项目。我处于必须能够保存和重新打开文件的位置。我可以打开文件,但我必须遍历它并重新绘制我保存的所有内容。但是我不确定是否要真正遍历文件,因为当打印我打开的文件时,我会得到一个巨大的列表,其中包含我的所有列表,如下所示:

["['Rectangle', 5.168961201501877, 8.210262828535669, 7.6720901126408005, 6.795994993742178, 'red']['Line', 5.782227784730914, 5.269086357947434, 8.69837296620776, 4.993742177722153, 'red']['Circle', 2.6491232154288933, -0.8552572601656006, 6.687547623119292, 3.1831671475247982, 'red']"]

我不熟悉这个网站,所以请多多包涵。

def open_file(self,cmd):
    filename=input("What is the name of the file? ")
    File= open(filename,'r')
    file= File.readlines()
    print(file)

我之前使用以下方法保存了文件:

file.write(str(l)) 其中 l 是我创建的值列表的名称

我尝试过使用 split() 我尝试使用 for 循环将字符串中的数据保存到列表中 我已经在网上搜索了几个小时以找到某种解释,但我找不到任何解释。

【问题讨论】:

  • 你应该说明你已经尝试过什么,发生了什么,你希望什么。
  • 如何将数据存储在文件中,如何重新加载?我们希望看到您的代码的相关位(删除了不相关的位)。
  • 是否有规定不能使用 JSON 或 pickle?我认为这会解决你所有的问题。
  • @SethMMorton 这是一个初学者的python类,所以我不确定它们是什么,我们还没有讨论过它们

标签: python readlines


【解决方案1】:

您提供的实际上是一个列表,其中一个项目由一个长字符串组成。你能提供你用来生成这个的代码吗?

如果它实际上是一个列表中的一个列表,您可以在另一个 for 循环中使用一个 for 循环来访问每个列表中的每个项目。

假设您的列表是对象 l。

l[0] = ['矩形', 5.168961201501877, 8.210262828535669, 7.6720901126408005, 6.795994993742178, '红色']

和 l[0][0] = '矩形'

for i in l:
    for x in i:

将允许您遍历所有这些。

对于您提供的信息, readlines() 不一定有效,因为没有什么可以在文本中划定新行。您可以使用 for 循环将列表中的每个项目保存为一行,而不是将列表保存为转换后的字符串

for lne in l:
    f.write(lne)

这会将列表中的每个项目写入文件的新行(取决于您的 python 版本,您可能必须使用 f.write(lne+'\n') 来添加新行)。然后,当您打开文件并使用 readlines() 时,它会将每一行作为一个项目附加到列表中。

【讨论】:

    【解决方案2】:

    您显然在读取之前创建的数据时遇到问题。

    你的任务似乎需要

    1) 在编辑器中创建一些几何图形

    2) 将所有几何图形序列化到一个文件中

    以后(在程序重新启动并且所有旧内存内容都消失后:

    3) 从文件中加载几何图形

    4) 在您的程序中重新创建内容(几何图形)

    在第 2 步中,您做了一些事情,您似乎对此感到惊讶。我的建议是使用其他一些序列化选项。 Python 提供了许多,例如

    • pickle - 快速简单,但不能与 Python 程序以外的其他程序互操作
    • JSON - 简单,但可能需要一些编码来进行序列化和加载自定义对象

    使用 JSON 序列化的示例解决方案可能如下所示:

    import json
    
    class Geometry():
        def __init__(self, geotype="Geometry", color="blank", numbers=[]):
            self.geotype = geotype 
            self.color = color
            self.numbers = numbers
    
        def to_list(self):
            return [self.geotype, self.color, self.numbers]
    
        def from_list(self, lst):
            print "lst", lst
            self.geotype, self.color, self.numbers = lst
            return self
    
        def __repr__(self):
            return "<{self.geotype}: {self.color}, {self.numbers}>".format(self=self)
    
    def test_create_save_load_recreate():
        geoms = []
        rect = Geometry("Rectange", "red", [12.34, 45])
        geoms.append(rect)
    
        line = Geometry("Line", "blue", [12.33, 11.33, 55.22, 22,41])
        geoms.append(line)
    
        # now serialize
        fname = "geom.data"
        with open(fname, "w") as f:
            geoms_lst = [geo.to_list() for geo in geoms]
            json.dump(geoms_lst, f)
        # "geom.data are closed noe
        del f
        del geoms
        del rect
        del line
        # after a while
        with open(fname, "r") as f:
            data = json.load(f)
        geoms = [Geometry().from_list(itm) for itm in data]
        print geoms
    

    【讨论】:

    • “pickle - 快速简单,但不能与其他 Python 程序互操作” - 不正确。也许您的意思是不保证在不同的 python 版本之间可以互操作?
    • @SethMMorton “其他 Python 程序”我的意思是“任何用 Python 以外的东西编写的程序”。
    • 啊,你的意思是“than”,而不是“then”。元音的差异使我错误地解释了这句话。
    • 感谢您的帮助! @JanVlcinsky
    • @Deno1133 不客气。如果我的或其他解决方案解决了您的问题,请考虑接受它作为答案。同时,如果您觉得其他答案有用,您可以投票赞成。
    猜你喜欢
    • 2019-10-02
    • 2015-07-14
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 2021-08-21
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多