如何在 Python 3 中从磁盘读取和编辑列表?

Posted

技术标签:

【中文标题】如何在 Python 3 中从磁盘读取和编辑列表?【英文标题】:How to read and edit a list from disk in Python 3? 【发布时间】:2020-10-16 06:41:16 【问题描述】:

我有一个要附加到单独磁盘文件的字典列表。然后,我希望能够读取这个字典项目列表并将它们移动到不同文件中的其他列表。

import os

# List 'x' will auto-populate itself with hundreds of new dictionary items upon run - using x.append('name': f'var', 'job': f'var2') etc.

x = []

i = input('Request: ')

if i == 'add to list':
    with open('example list', 'a') as list:
        list.write(x)
elif i == 'print list':
    with open('example list', 'r') as list:
        list.read(x)
        print(list)

# in this next block, I would like to be able to move an item from the 'example list' list to a different list that is housed in a separate file

elif i == 'move item':
    # 'n' requests an integer value to represent the index in the list
    n = input('Which item do you want to move? ')
    with open('example list', 'r') as list:
        j = list[n]
        # I want to delete 'j' from 'example list' 
    with open('other list', 'a') as other_list:
        # I want to append 'j' to 'other list'
        other_list.write(j)

print('example list')

我一直在阅读和移动这些列表项。我什至无法让它以很好的格式打印“示例列表”。我听说过泡菜模块,但我从未使用过它。我也明白可能需要将这些列表保存为 json 文件,以便能够访问列表项和其中的后续字典键。任何帮助将不胜感激。

【问题讨论】:

我不确定你为什么要执行这么多 I/O 操作,但我建议将其作为第二部分的操作顺序:确定要移动的项目,读取列表,它将被删除从,删除项目(查看delremovepop 关键字),将此列表以编辑的形式写回其文件,读入列表,该项目将被完整添加,将项目附加到列表,通过覆盖过去的版本将完整列表写回文件。 你有几个基本的误解,我想。您只是将列表的文本表示形式写入文本文件。当你阅读它时,它不会是一个列表。请注意,您正在做类似with open('example list', 'r') as list: 之类的事情,但这不会神奇地将文件中的任何内容转换为列表,list 现在将是一个文件对象,名称无关紧要...从根本上说,您正在尝试 序列化 Python 对象。您可以将pickle 用于与任意python 对象一起使用的二进制格式,或者JSON,一种基于文本的格式可以在这里使用。 是否有更简洁的方式来执行 I/O 操作? 是的,抱歉,'list' 可能是一个误导性的变量名,哈哈。那么如何将其转换为 JSON? 【参考方案1】:

我认为您在这里有一个误解因为列表不会将内容转换为列表。这就像一个变量。我已经更改了您的代码的某些部分。我不知道它是否会起作用,因为您没有指定任何输入或输出。看看

if i == 'add to list':
    with open('example list', 'a') as f:
        # append whatever there is in 'x' into 'example list'
        f.write(x)
elif i == 'print list':
    with open('example list', 'r') as f:
        file_content=f.read()
        print(file_content)

# in this next block, I would like to be able to move an item from the 'example list' list to a different list that is housed in a separate file

elif i == 'move item':
    # 'n' requests an integer value to represent the index in the list
    n = input('Which item do you want to move? ')
    with open('example list', 'r') as f:
        # .readlines() would return a list of lines from 'example list'
        file_lines = f.readlines()
        # pop line with index 'n'
        j = file_lines.pop(n)
        # I want to delete 'j' from 'example list' 
    with open('other list', 'a') as other_list:
        # I want to append 'j' to 'other list'
        other_list.write(j)

print('example list')

【讨论】:

谢谢你,这帮助我以一种很好的格式阅读和打印外部文件。现在我将尝试您关于移动项目的建议,很棒的想法。 @MajorTonality 很高兴听到这个消息。如果有帮助,请考虑接受答案。 我尝试了您关于移动列表项的建议。如果我使用“w”而不是“r”,使用“pop”似乎确实有效。但是,我在运行 pop 函数后收到此错误消息 - io.UnsupportedOperation: not readable 如果我不从 'r' 更改为 'w',pop 函数什么也不做。 实际上,经过进一步检查,使用 pop 功能似乎会删除列表中的所有内容,而不仅仅是请求的索引位置。【参考方案2】:

我想通了。使用 json 模块,我能够将列表转储到外部 json 文件:

x = []

with open('json list.json', 'w') as f:
    json.dump(x, f)

然后我可以通过以下方式重新加载数据:

list1 = open('json list', 'r')
listread = list1.read()
data = json.loads(listread)

为了在列表之间移动项目,我使用了这个:

move_item = data[3]
del move_item
json.dumps(data)
move_to = open('other list'. 'a')
move_to.write(move_item)
list1.close()
move_to.close()

加载后,列表和其中的后续字典作为它们各自的对象保持不变,从而允许通过索引或键进行访问。谢谢大家,我综合了大家的建议。

【讨论】:

以上是关于如何在 Python 3 中从磁盘读取和编辑列表?的主要内容,如果未能解决你的问题,请参考以下文章

在 Blender (python) 中从 Windows 剪贴板中读取二进制数据

如何在python中从txt文件中读取数据[重复]

如何在 Python 3 中从字节缓冲区构造内存中的 TarFile 对象?

如何在python中从用户读取数组元素

如何在 Python 中从 Javascript 中读取值

如何在 Python 中从 PN532 读取标签?