2017-04-13 17 views
0

プールにいくつかのJSONオブジェクトと2つの整数を渡そうとしています。Python TypeError - strの代わりにbytes-likeオブジェクトが必要です

for i in range(0, multiprocessing.cpu_count()-1): 
    fromindex = i * chunklen 
    toindex = (i+1) * chunklen 
    chunkedData.append([data['features'][fromindex:toindex], weekdaytopredict, hourtopredict]) 
chunkedData.append([data['features'][toindex:], weekdaytopredict, hourtopredict]) 
parallelstart = time.time() 
result = (pool.map(parallelUpdateWithDT, chunkedData)) 

dataは、いくつかのポリゴンを含むgeoJSONファイルです。これらのポリゴンを並列処理のために配布したいと思います。私はn/cpu_count()ポリゴンをparallelUpdateWithDT関数に渡します。それはそれをさらに処理する必要があります。私の問題は型エラーです。print(chunkedData)<class 'list'>を返しても、私は次のエラーを受け取ります:TypeError: a bytes-like object is required, not 'str'。私はどこでこれを台無しにしていますか?完全なスタックトレース:

--------------------------------------------------------------------------- 
RemoteTraceback       Traceback (most recent call last) 
RemoteTraceback: 
""" 
Traceback (most recent call last): 
    File "/usr/lib/python3.5/multiprocessing/pool.py", line 119, in worker 
    result = (True, func(*args, **kwds)) 
    File "/usr/lib/python3.5/multiprocessing/pool.py", line 44, in mapstar 
    return list(map(*args)) 
    File "<ipython-input-114-bf56cacb90b9>", line 34, in parallelUpdateWithDT 
    if('rain' in result): 
TypeError: a bytes-like object is required, not 'str' 
""" 

The above exception was the direct cause of the following exception: 

TypeError         Traceback (most recent call last) 
<ipython-input-115-031a5e24ee66> in <module>() 
----> 1 decisionTreePrediciton(3, 5) 

<ipython-input-114-bf56cacb90b9> in decisionTreePrediciton(weekdaytopredict, hourtopredict) 
    15  print (type(chunkedData)) 
    16 
---> 17  result = (pool.map(parallelUpdateWithDT, chunkedData)) 
    18  parallelend = time.time() 
    19 

/usr/lib/python3.5/multiprocessing/pool.py in map(self, func, iterable, chunksize) 
    258   in a list that is returned. 
    259   ''' 
--> 260   return self._map_async(func, iterable, mapstar, chunksize).get() 
    261 
    262  def starmap(self, func, iterable, chunksize=None): 

/usr/lib/python3.5/multiprocessing/pool.py in get(self, timeout) 
    606    return self._value 
    607   else: 
--> 608    raise self._value 
    609 
    610  def _set(self, i, obj): 

chunkedDataのサンプル:

[[[{'geometry': {'coordinates': [[[10.914622377957983, 45.682007076150505], [10.927456267537572, 45.68179119797432], [10.927147329501077, 45.672795442796335], [10.914315493899755, 45.67301125363092], [10.914622377957983, 45.682007076150505]]], 'type': 'Polygon'}, ///////////////////////etc, waaay too big////////////, 'id': 6574, 'properties': {'cellId': 11454}}], 3, 5] 

どのようにこのstrのですか?理解できません。助けてくれてありがとう!

+0

労働者は '結果): 'それは親に伝えられ、何が起こったのかを知らせるためにそこに再提起された。問題はここに掲載されていないワーカーコードにあります。私は 'result'がチャンクにない計算された値だと推測しています。その行のすぐ上に 'print(repr(result))'を追加して、あなたが得るものを見ることができます。しかし、このバグはコードに掲載されていないので、あまり話題にはなりません。 – tdelaney

答えて

3

投稿したコードからはわかりませんが、strinであるかどうかを確認しようとしていると思われます。bytesです。たとえば:

>>> bytes_obj = b'result' 
>>> 'res' in bytes_obj 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: a bytes-like object is required, not 'str' 

これはあなたのコード内のresultはタイプbytesであることを意味します。ここには2つの決議があります。最初はあまりにもバイトオブジェクトに'rain'を作ることです。

if b'rain' in result: 
    ... 

strresultを有効にすることです:

result = result.decode(whatever_codec_it_should_be) 

あなたは、この第二のアプローチを取るつもりなら、あなたは変換する必要がありますstrbytesの頭痛のすべての種類を避けるために可能な限り早い時期にstrの結果になります。通常、あなたがを知っていない場合、あなたは別のコーデックが必要です。ほとんどのものは最近utf-8の仕事をしているので、あなたはその1つを試すことができます...

関連する問題