Python 直接使用保存在辅助文件中的列表

Python 直接使用保存在辅助文件中的列表,python,Python,有没有一种方法可以将列表保存在辅助文件中,然后直接操作它,而不必下载、操作它,然后重写文件 也就是说,我希望能够这样做,例如: L = open('file') L.append(0) L.close() 正确的方法是什么?有专门的课程吗 我使用shelve(基于pickle的库)解决了这个问题,如下所示: import shelve f = shelve.open('list.db',writeback=True) f['0'] = the list I want L = f['0']

有没有一种方法可以将列表保存在辅助文件中,然后直接操作它,而不必下载、操作它,然后重写文件

也就是说,我希望能够这样做,例如:

L = open('file')
L.append(0)
L.close()
正确的方法是什么?有专门的课程吗


我使用
shelve
(基于
pickle
的库)解决了这个问题,如下所示:

import shelve

f = shelve.open('list.db',writeback=True)
f['0'] = the list I want
L = f['0']

Manipulate L however I want

f.close()

这可能非常不安全,但它是有效的:

class Open(list):
    def __init__(self, fname):
        list.__init__(self, [])
        self.fname = fname
        with open(fname) as f:
            self.extend(eval(f.read()))

    def close(self):
        with open(self.fname, "w") as f:
            f.write(str(self))
用法:

L = Open("test.txt")
L.append(0)
L.close()
Open
的行为类似于普通的
列表
,可以将自身保存到文件中,并使用一个文件构建自身


这将执行文件的内容,就像它是Python代码一样,因此,如果读取了任何恶意代码,它将执行其操作,请注意这一点。无论如何,从不受信任的来源读取数据总是很危险的。

根据您所做的操作,您可以将列表中的每个元素保存在文件的一行中,这样可以方便地将新内容附加到文件中

>>> with open("test file.txt") as file:
        [int(line) for line in file]


[1, 2, 3, 4, 5, 6]
>>> 
我们说这是你的原始文件

>>> data = [1,2,3]
>>> with open("test file.txt","w") as file:
        file.write("\n".join(map(str,data)))


5
>>>
这是您想要添加的新内容,然后您只需要在附加模式(“a”)下打开文件

现在该文件包含两个数据,您可以随时恢复这些数据,例如

>>> with open("test file.txt") as file:
        [int(line) for line in file]


[1, 2, 3, 4, 5, 6]
>>> 

如果将数据放入文件中并希望进行修改,则任何更改数据长度的操作都需要读取和写回文件的其余部分。(如果长度保持完全相同,则可以在位修改文件的某些部分,并且可以在结尾追加或从结尾截断。)

因此,如果您正在寻找一种将数据集保存在文件中而不是将其加载到内存中的方法,那么普通文件不会剪切它。这两个列表都不是一个经过修改的列表,因为它必须被完整地读入和写回。如果这是您的目标,我建议使用一个数据库,例如
sqlite3
,它完全满足您的需要:它将您的数据存储在一个文件中,并为您处理修改

import sqlite3    
conn = sqlite3.connect('file.db')
c = conn.cursor()
c.execute("INSERT INTO mytable VALUES ('a', 'b', 'c')")
...
有关如何使用它的详细信息,请查看

如果您的数据没有太多的结构,您可能更喜欢,这是一个用于管理键值对的“密钥存储”数据库:

with dbm.open('file.dbm', 'c') as db:   # Open db, creating if necessary
    db['hello'] = 'Hello, world!'

我打算建议使用pickle
https://docs.python.org/3/library/pickle.html#examples
但操作文件的要求直接阻止了我的回答,你能详细解释一下你为什么要强制执行这个要求吗?@DRC这样做看起来比把列表保存到一个文件中,然后从文件中读取、在脚本中更改并重写文件更直接。因此,我只是想知道是否有办法做到这一点。如果您正在写入的数据不是琐碎的,那么您最终将拥有您的序列化格式,并且必须维护它,如果列表适合内存,那么使用pickle可以更简单。当您更新列表时,您正在写入内存,因此您无论如何都必须重写该文件。@DRC我很抱歉,但我不理解你的评论……这甚至没有解决OP问题的要求,我缺少什么?@DanielRobert Nicoud,我刚刚复制了你在问题中显示的几乎完全相同的语法,现在有什么问题?@DanielRobert Nicoud,无论如何,不可能直接操纵文件中的列表,无需下载、操作它,然后重写文件。当你操作一个普通的列表时,你实际上是在操作它占用的内存。谢谢。我看到的问题是,无法直接从列表中弹出元素…直接不,使用此选项,您需要制作文件的副本,同时忽略弹出元素,删除原始元素并将副本重命名为原始元素。。。因此,也许alexis建议的数据库方法更适合该用例