我想使用Python中的shelve模块使用元组(1,2,3)作为键.我可以用词典做到这一点:
d = {}
d[(1,2,3)] = 4
Run Code Online (Sandbox Code Playgroud)
但如果我试着搁置:
s = shelve.open('myshelf')
s[(1,2,3)] = 4
Run Code Online (Sandbox Code Playgroud)
我得到:"TypeError:期望键,字符串或整数对象,发现元组"
有什么建议?
我正在尝试将dict的dict添加到搁置文件中:
>>> d = shelve.open('index.shelve')
>>> d
<shelve.DbfilenameShelf object at 0x21965f0>
>>> print(list(d.keys()))
[]
>>> d['index'] = index
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/bns/rma/local/python/lib/python3.1/shelve.py", line 124, in __setitem__
self.dict[key.encode(self.keyencoding)] = f.getvalue()
_dbm.error: cannot add item to database
Run Code Online (Sandbox Code Playgroud)
索引有点大,但不大。本质上是一个浮点数数组:
>>> len(index)
219
>>> a = [ index[k][k1] for k in index for k1 in index[k] ]
>>> len(a)
59995
>>> all([ type(x) is float for x in a ])
True
Run Code Online (Sandbox Code Playgroud)
这是什么错误?另外,模块或模块文档中是否有我应该寻找有关错误代表什么的更多信息?错误消息不是很有用,至少对我来说是这样:)。
我一直在以这种方式搁置存储大量对象:
以字符串为键,列表为值的字典:
即
data["MITL"] = ["Radio And Television Broadcasting And Communications Equipment", "Communication Equipment"]
Run Code Online (Sandbox Code Playgroud)
或更简洁地:
...
SIXH.L Machine Tools & Accessories,
GOPAIST.BO Steel & Iron,
HERITGFOO.NS Food Wholesale,
MITL Radio And Television Broadcasting And Communications Equipment, Communication Equipment,
MMLP Oil Refining, Marketing, Oil & Gas Pipelines,
SESL.PA Diversified Electronics,
...
<? 30,000 entries>
Run Code Online (Sandbox Code Playgroud)
我从此.db文件中提取并导出到另一个.db文件,因此,行业是关键,列表由股票代号组成。
...
Industrial Electrical Equipment ['PLPC', 'MAG', 'LPTH', 'IIN', 'CUI', 'ULBI', 'APWC', 'CAPC', 'SVT', 'ARTX', 'CPST', 'OSIS', 'LGL', 'BW', 'HPJ', 'AOS', 'FLUX', 'AMSC', 'GTI', 'RTBC', 'AUSI', 'AETI', …Run Code Online (Sandbox Code Playgroud) 在写入搁置对象时,我遇到了一个问题,即无法写入更多记录。我HASH: Out of overflow pages. Increase page size跟随_dbm.error: cannot add item to database。macos Sierra和早期的os x el capitan均出现问题。我使用的是蟒蛇版本的蟒蛇3。相同的代码可以在ubuntu上正常工作。
是否有一些第三方模块可以像搁置一样工作,但实际上可以在OSX上工作?在使其真正起作用之前,这将是一个不错的解决方法。我正在一起工作tinydb,但情况并不完全相同。
我对Perforce的新搁架命令感到非常兴奋.他们说你应该能够将变更清单"重新分配"给其他人,然后他们可以取消搁置.
如何重新分配搁置的变更清单?有没有办法在p4v中执行此操作,或仅在命令行执行此操作?
我有一个很大的python搁置对象(磁盘上有6GB)。我希望能够将其移动到另一台机器上,并且由于架子不是便携式的,因此我想cPickle它。为此,我首先必须将其转换为字典。
出于某种原因,当我执行dict(myShelf)ipython进程时,它会增加高达32GB的内存(我的机器所有内存),然后似乎挂起(或可能需要很长时间)。
有人可以解释吗?也许提供了一种潜在的解决方法?
编辑:使用Python 2.7
我只是按照书中给出的一个例子来说明shelvemacOS High Sierra上的Python 模块.
如下所示,只有两个短串的小元组存储在架子中.正如您在最后一行中看到的那样,生成的文件大小为16兆字节.
当我在macOS High Sierra上尝试使用Homebrew安装的Python版本(3.6.4或2.7.14)时,生成的文件只会变得那么大.如果我在Linux主机上运行它,或者使用预先安装的Python版本(2.7.10)或通过macOS中的官方安装程序安装Python 3.6.4,那么生成的addresses文件只有几千字节,就像其他人报告的一样.在评论中(谢谢!).
~/tmp> rm addresses
~/tmp> python3
Python 3.6.4 (default, Jan 6 2018, 18:43:09)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
[...]
>>> import shelve
>>> book = shelve.open("addresses")
>>> book['flintstone'] = ('fred', '555-1234', '1233 Bedrock Place')
>>> book['rubble'] = ('barney', '555-4321', '1235 Bedrock Place')
>>> book.close()
>>>
~/tmp> ll
total 32768
-rw-r--r-- 1 moritz staff 16M Jan 24 13:05 addresses
Run Code Online (Sandbox Code Playgroud) 我试图将路径导出到系统环境,然后发生了什么:路径用于 BerkleyDB 库(需要搁置 Python 库,没有它我有一个错误:
File "/kplusnfs/script/ns/processes/current/kondor_processes.py", line 214, in load_processes_list_for_hostname
data_file = shelve.open((os.path.join(config.path_to_script, config.shelve_database)))
File "/usr/local/lib/python2.6/shelve.py", line 234, in open
return DbfilenameShelf(filename, flag, protocol, writeback)
File "/usr/local/lib/python2.6/shelve.py", line 218, in __init__
Shelf.__init__(self, anydbm.open(filename, flag), protocol, writeback)
File "/usr/local/lib/python2.6/anydbm.py", line 82, in open
mod = __import__(result)
File "/usr/local/lib/python2.6/dbhash.py", line 8, in <module>
import bsddb
File "/usr/local/lib/python2.6/bsddb/__init__.py", line 64, in <module>
import _bsddb
ImportError: ld.so.1: python: fatal: libdb-4.7.so: open failed: No such file or directory
Run Code Online (Sandbox Code Playgroud)
当我将 export 添加到 .bashrc 行时:
export …Run Code Online (Sandbox Code Playgroud) 我正在使用PyMemoize库来缓存协程。我装饰了协程,但是当 Python 调用它时,我得到:
TypeError: can't pickle coroutine objects
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为PyMemoize内部尝试腌制协程并将其存储在 Redis 中。为此,它使用shelve.Shelf,而后者又使用pickle. 问题是,由于未知的原因,pickle不支持 pickling 协程。
我尝试用它来腌制协程dill并且它有效。我如何知道shelve用作dill序列化后端?
我尝试过猴子补丁shelve,但没有成功(我不知道为什么):
TypeError: can't pickle coroutine objects
Run Code Online (Sandbox Code Playgroud)