有没有办法将列表保存在辅助文件中然后直接操作它,而不必下载,操作它,然后重写文件?
即,我希望能够做到,例如像这样的东西:
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()
答案 0 :(得分:1)
如果将数据放入文件中并且想要进行修改,则任何更改数据长度的操作都需要您读取和写回文件的其余部分。 (如果长度保持完全相同,你可以修改文件的某些部分,你可以在末尾追加或从末尾截断。)
因此,如果您正在寻找一种方法将数据集保存在文件中而不是将其加载到内存中,那么普通文件就不会削减它。也不是一个腌制清单,因为它必须被读入并完整地写回来。如果这是您的目标,我建议您使用sqlite3
这样的数据库,它可以完全满足您的需求:它将您的数据存储在一个文件中,并为您处理修改。
import sqlite3
conn = sqlite3.connect('file.db')
c = conn.cursor()
c.execute("INSERT INTO mytable VALUES ('a', 'b', 'c')")
...
查看sqlite documentation以了解有关如何使用它的详细信息。
如果您的数据结构不多,您可能更喜欢dbm
,这是一个"密钥库"用于管理键值对的数据库:
with dbm.open('file.dbm', 'c') as db: # Open db, creating if necessary
db['hello'] = 'Hello, world!'
答案 1 :(得分:0)
根据您的操作,您可以将列表中的每个元素保存在文件的一行中,从而可以轻松地将新内容添加到文件中,例如
让我们说这是你的原始文件
>>> data = [1,2,3]
>>> with open("test file.txt","w") as file:
file.write("\n".join(map(str,data)))
5
>>>
这是你要添加的新内容,然后你只需要以附加模式打开文件(“a”)
>>> new_data = [4,5,6]
>>> with open("test file.txt","a") as file:
file.write("\n")
file.write("\n".join(map(str,new_data)))
1
5
>>>
现在该文件包含两个数据,您可以随时恢复这些数据,例如
>>> with open("test file.txt") as file:
[int(line) for line in file]
[1, 2, 3, 4, 5, 6]
>>>
答案 2 :(得分:-1)
这可能非常不安全,但它有效:
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
的行为类似于普通的list
,可以将自己保存到文件中并使用一个文件自行构建。
这将执行文件的内容,就像它是Python代码一样,所以如果读取任何恶意代码,它就会做到这一点,请注意这一点。无论如何,从不受信任的来源读取数据总是很危险。