我查看了Python文档提供的信息,但我仍然有点困惑.有人可以发布编写新文件的示例代码,然后使用pickle将字典转储到其中吗?
很抱歉,我无法用更简单的示例重现错误,而且我的代码太复杂而无法发布.如果我在IPython shell而不是常规Python中运行程序,那么事情就会很顺利.
我查看了之前关于这个问题的一些注意事项.它们都是由在类函数中定义的pool to call函数引起的.但对我来说情况并非如此.
Exception in thread Thread-3:
Traceback (most recent call last):
File "/usr/lib64/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.7/threading.py", line 505, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 313, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Run Code Online (Sandbox Code Playgroud)
我将不胜感激任何帮助.
更新:我挑选的功能是在模块的顶层定义的.虽然它调用包含嵌套函数的函数.即f()要求g()调用h()具有嵌套函数i(),和我打电话pool.apply_async(f).f(),g(),h()都在顶层定义.我用这个模式尝试了更简单的例子,但它确实有效.
我正在使用python3.3并且在尝试挑选一个简单的字典时遇到了一个神秘的错误.
这是代码:
import os
import pickle
from pickle import *
os.chdir('c:/Python26/progfiles/')
def storvars(vdict):
f = open('varstor.txt','w')
pickle.dump(vdict,f,)
f.close()
return
mydict = {'name':'john','gender':'male','age':'45'}
storvars(mydict)
Run Code Online (Sandbox Code Playgroud)
我得到:
Traceback (most recent call last):
File "C:/Python26/test18.py", line 31, in <module>
storvars(mydict)
File "C:/Python26/test18.py", line 14, in storvars
pickle.dump(vdict,f,)
TypeError: must be str, not bytes
Run Code Online (Sandbox Code Playgroud) 我想使用multiprocessing的Pool.map()功能,同时划分出工作.当我使用以下代码时,它工作正常:
import multiprocessing
def f(x):
return x*x
def go():
pool = multiprocessing.Pool(processes=4)
print pool.map(f, range(10))
if __name__== '__main__' :
go()
Run Code Online (Sandbox Code Playgroud)
但是,当我在面向对象的方法中使用它时,它不起作用.它给出的错误信息是:
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup
__builtin__.instancemethod failed
Run Code Online (Sandbox Code Playgroud)
当以下是我的主程序时会发生这种情况:
import someClass
if __name__== '__main__' :
sc = someClass.someClass()
sc.go()
Run Code Online (Sandbox Code Playgroud)
以下是我的someClass课程:
import multiprocessing
class someClass(object):
def __init__(self):
pass
def f(self, x):
return x*x
def go(self):
pool = multiprocessing.Pool(processes=4)
print pool.map(self.f, range(10))
Run Code Online (Sandbox Code Playgroud)
任何人都知道问题可能是什么,或者一个简单的方法呢?
我创建了一个像这样的对象:
company1.name = 'banana'
company1.value = 40
Run Code Online (Sandbox Code Playgroud)
我想保存这个对象.我怎样才能做到这一点?
当我运行类似的东西:
from multiprocessing import Pool
p = Pool(5)
def f(x):
return x*x
p.map(f, [1,2,3])
Run Code Online (Sandbox Code Playgroud)
它工作正常.但是,将此作为类的函数:
class calculate(object):
def run(self):
def f(x):
return x*x
p = Pool()
return p.map(f, [1,2,3])
cl = calculate()
print cl.run()
Run Code Online (Sandbox Code Playgroud)
给我以下错误:
Exception in thread Thread-1:
Traceback (most recent call last):
File "/sw/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/sw/lib/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/sw/lib/python2.6/multiprocessing/pool.py", line 225, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Run Code Online (Sandbox Code Playgroud)
我看过Alex Martelli的一篇文章处理同样的问题,但它不够明确.
我习惯使用.csv文件将数据输入和输出Python,但是存在明显的挑战.关于在json或pck文件中存储字典(或字典集)的简单方法的任何建议?例如:
data = {}
data ['key1'] = "keyinfo"
data ['key2'] = "keyinfo2"
Run Code Online (Sandbox Code Playgroud)
我想知道如何保存它,然后如何加载它.
我正在尝试创建类实例的JSON字符串表示并且有困难.假设这个类是这样构建的:
class testclass:
value1 = "a"
value2 = "b"
Run Code Online (Sandbox Code Playgroud)
对json.dumps的调用是这样的:
t = testclass()
json.dumps(t)
Run Code Online (Sandbox Code Playgroud)
它失败并且告诉我测试类不是JSON可序列化的.
TypeError: <__main__.testclass object at 0x000000000227A400> is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用pickle模块:
t = testclass()
print(pickle.dumps(t, pickle.HIGHEST_PROTOCOL))
Run Code Online (Sandbox Code Playgroud)
它提供类实例信息,但不提供类实例的序列化内容.
b'\x80\x03c__main__\ntestclass\nq\x00)\x81q\x01}q\x02b.'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我试图加载链接的MNIST数据集在这里使用该程序在Python 3.2:
import pickle
import gzip
import numpy
with gzip.open('mnist.pkl.gz', 'rb') as f:
l = list(pickle.load(f))
print(l)
Run Code Online (Sandbox Code Playgroud)
不幸的是,它给了我错误:
Traceback (most recent call last):
File "mnist.py", line 7, in <module>
train_set, valid_set, test_set = pickle.load(f)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
然后我尝试在Python 2.7中解码pickle文件,并重新编码.所以,我在Python 2.7中运行了这个程序:
import pickle
import gzip
import numpy
with gzip.open('mnist.pkl.gz', 'rb') as f:
train_set, valid_set, test_set = pickle.load(f)
# Printing out the three objects reveals that they are
# …Run Code Online (Sandbox Code Playgroud) 我看过pickle文档,但我不明白pickle在哪里有用.
泡菜有哪些常见的用例?
pickle ×10
python ×10
dictionary ×2
json ×2
python-3.x ×2
save ×2
object ×1
pool ×1
use-case ×1