我在http://code.google.com/p/filecache/写了一些搁置的单元测试,python 2保存了shelve.open()中我指定的文件名,但在python 3中我得到了3个不同的文件"bak", "dat"和"dir".所以在测试开始之前我想删除这些文件,但我不知道我是否对它们的文件名或扩展名有任何保证.
如果我知道它的名字,我怎么能擦掉货架呢?
我已经设置了一个模拟操作系统的Python脚本.它有一个命令提示符和一个虚拟文件系统.我正在使用shelve模块来模拟文件系统,它是多维的,以支持目录层次结构.但是,我无法实现'cd'命令.我不知道如何进出目录,即使我在第一次启动程序时创建了一小组目录.这是我的代码:
import shelve
fs = shelve.open('filesystem.fs')
directory = 'root'
raw_dir = None
est_dir = None
def install(fs):
fs['System'] = {}
fs['Users'] = {}
username = raw_input('What do you want your username to be? ')
fs['Users'][username] = {}
try:
test = fs['runbefore']
del test
except:
fs['runbefore'] = None
install(fs)
def ls(args):
print 'Contents of directory', directory + ':'
if raw_dir:
for i in fs[raw_dir[0]][raw_dir[1]][raw_dir[2]][raw_dir[3]]:
print i
else:
for i in fs:
print i
def cd(args):
if len(args.split()) > 1:
if args.split()[1] …
Run Code Online (Sandbox Code Playgroud) 我正在使用TFS 2010.我必须检查在签入之前被其他开发人员搁置的代码.我们如何才能在TFS2010中执行此操作,以便我可以进行更改和审核.谢谢!
该shelve
模块在anydbm
模块顶部实现.此模块充当4种不同特定DBM实现的外观,它将按以下顺序选择创建新数据库时可用的第一个模块:
dbhash
(已弃用但仍是anydbm
首选).这是bsddb
模块的代理,.open()
真的bsddb.hashopen()
gdbm,GNU DBM库的Python模块,提供的功能比dbm
模块在与同一个库一起使用时提供的功能更多.
dbm,一个使用ndbm
BSD DB和GNU DBM库的代理模块(在编译Python时选择).
dumbdbm,一个纯python实现.
但是在我的系统中,虽然我dbhash
出于某种原因我希望它只是用它来创建数据库dumbdbm
.
我怎样才能做到这一点?
该shelve
模块的文档根据限制做出以下声明:
搁置模块不支持对搁置对象的并发读/写访问。(多个同时读取访问是安全的。)
据我所知,这意味着只要我不尝试让多个进程一次写入单个架子,我就应该清楚。使用同一个架子作为只读缓存的多个进程应该是安全的。对?
显然不是。经过一番挣扎,我最终得到了一个测试用例,该用例在从架子上异步读取时似乎表现出一些非常糟糕的行为。以下脚本:
Shelf
并用"i" : 2*i
fori
从 1 到 10填充它。生成进程以从架子文件中检索每个键的值,并报告是否检索到值。
import multiprocessing
import shelve
SHELF_FILE = 'test.shlf'
def store(key, obj):
db = shelve.open(SHELF_FILE, 'w')
db[key] = obj
db.close()
def load(key):
try:
db = shelve.open(SHELF_FILE, 'r')
n = db.get(key)
if n is not None:
print('Got result {} for key {}'.format(n, key))
else:
print('NO RESULT for key {}'.format(key))
except Exception as e:
print('ERROR on key {}: {}'.format(key, e)) …
Run Code Online (Sandbox Code Playgroud)我正在从基因组FASTA文件创建序列的搁置文件:
# Import necessary libraries
import shelve
from Bio import SeqIO
# Create dictionary of genomic sequences
genome = {}
with open("Mus_musculus.GRCm38.dna.primary_assembly.fa") as handle:
for record in SeqIO.parse(handle, "fasta"):
genome[str(record.id)] = str(record.seq)
# Shelve genome sequences
myShelve = shelve.open("Mus_musculus.GRCm38.dna.primary_assembly.db")
myShelve.update(genome)
myShelve.close()
Run Code Online (Sandbox Code Playgroud)
该文件本身是2.6Gb,但是当我试图搁置它时,正在生成一个> 100Gb的文件,而且我的计算机将抛出一些关于内存不足和启动磁盘已满的投诉.这似乎只发生在我尝试在OSX Yosemite下运行时,在Ubuntu上它按预期工作.有什么建议为什么这不起作用?我正在使用Python 3.4.2
我正在使用搁置模块来保存一些数据.我的shelve对象的键值是设置对象.
酸洗片段:
import shelve
other_links = {
'Blue Estate The Game, 72': 'https://store.steampowered.com/account/ackgift/A5e5AB6C5050A331B?redeemer=esmcfofp%40skinsgifts.com',
'Hope Lake, 75': 'https://store.steampowered.com/account/ackgift/70E2E6Ce9F1733265?redeemer=esmcfofp%40skinsgifts.com',
'Forget Me Not: My Organic Garden, 74': 'https://store.steampowered.com/account/ackwift/A14373949D126B37?redeemer=esmcfofp%40skinsgifts.com',
'Until I Have You, 74': 'https://store.steampowered.com/account/ackgift/69030w5ECB8D0F07F?redeemer=esmcfofp%40skinsgifts.com',
'Lex Mortis, 74': 'https://store.steampowered.com/account/ackgift/2760w1D8B48EB3601?redeemer=esmcfofp%40skinsgifts.com',
'I am Bread, 72': 'https://store.steampowered.com/account/ackgift/1CEC5e2D2BEF20C41?redeemer=esmcfofp%40skinsgifts.com',
'Lumini, 72': 'https://store.steampowered.com/account/ackgift/472F108Aw0609C215?redeemer=esmcfofp%40skinsgifts.com'
}
links = shelve.open('links', writeback = True)
for key, value in other_links.items():
db_value = links.get(key)
if not db_value:
db_value = set()
db_value.add(value)
links[key] = db_value
links.close()
Run Code Online (Sandbox Code Playgroud)
在几次转储之后,引发了EOFError异常:
Exception in thread Thread-3:
Traceback (most recent call last):
File …
Run Code Online (Sandbox Code Playgroud) 我一直在使用Python的shelve
模块(在OSX 10.9.5上使用Python 3.4)将一堆字典保存到文件中.每个key
都是一个int(例如,"84554"
)的字符串,每个都是一些字符串的value
字典.
没有键被使用两次,我知道所有可能键的总超集.我将这些键值对添加到shelf
via线程中,每次运行时都会添加哪些键/值(这是预期的).
我遇到的问题是使用shelve
's 可迭代/可见的键shelf.keys()
数以及唯一键的数量key in shelf.keys()
不同.
这是我的代码.我首先初始化和加载ids
,这是所有可能的键的列表.
import shelve
from custom_code import *
MAIN_PATH = "/Users/myname/project_path/src/"
ids = list(set(load_list(MAIN_PATH + "id_list.pkl")))
c = c2 = 0
good_keys = []
bad_keys = []
Run Code Online (Sandbox Code Playgroud)
然后我打开架子,计算我迭代的所有键数db.keys()
,将"好"键添加到列表中.
db = shelve.open(MAIN_PATH + "first_3")
for k in db.keys():
c2+=1
good_keys+=[k]
Run Code Online (Sandbox Code Playgroud)
然后,我检查每个可能的钥匙,看它是否在架子上,检查架子上是否存在,并做同样的事情.
for j in set(ids):
if j in db.keys():
c+=1
bad_keys+=[j]
Run Code Online (Sandbox Code Playgroud)
两个计数器,c
并且 …
shelve
只读模式坏了吗?文档说该flag
参数的工作原理如中所述,dbm.open
所以我认为如果我以读取模式打开,我不应该能够更改搁置对象。
这里的页面似乎还建议修改以只读方式打开的搁置对象应该引发异常。但我仍然可以执行以下操作:
\n\nPython 3.7.2 (default, Dec 29 2018, 06:19:36) \n[GCC 7.3.0] :: Anaconda, Inc. on linux\nType "help", "copyright", "credits" or "license" for more information.\n>>> import shelve\n>>> with shelve.open(\'testdata\') as shelf:\n... shelf[\'two\'] = 2222\n... shelf[\'one\'] = 1111\n... \n
Run Code Online (Sandbox Code Playgroud)\n\n接下来我将用 和 打开它flag=\'r\'
,只是writeback=False
为了确定一下。但我可以修改对象。
>>> with shelve.open(\'testdata\', flag=\'r\', writeback=False) as shelf:\n... for k, v in shelf.items():\n... print(\'Key: \', k, \' Value: \', v)\n... shelf[\'two\'] = 1111\n... shelf[\'one\'] = 2222\n... \nKey: …
Run Code Online (Sandbox Code Playgroud) 那么 中 所做的一切都可以用和shelve
单独完成吗?dbm
pickle
shelve ×10
python ×9
python-3.x ×3
dbm ×2
pickle ×2
database ×1
dictionary ×1
filesystems ×1
persistence ×1
python-3.7 ×1
tfs ×1
unix ×1