2016-10-07 13 views
2

私はシリアライズとデシリアライズしたい辞書を持っているのピクルスとDateTimeオブジェクトをデシリアライズ:私は使用して辞書をシリアライズおよびデシリアライズしてい異なるWindowsのバージョン

dict = { 
    datetime.datetime.strptime('2016-10-01', '%Y-%m-%d'): { 
     'product1': 3300.00, 
    }, 
    datetime.datetime.strptime('2016-10-05', '%Y-%m-%d'): { 
     'product1': 3000.00, 
     'product2': 3000.50 
    }, 
    datetime.datetime.strptime('2016-10-09', '%Y-%m-%d'): { 
     'product1': 2700.00, 
     'product2': 2800.50, 
     'product3': 3600.00 
    }, 
    datetime.datetime.strptime('2016-10-15', '%Y-%m-%d'): { 
     'product1': 2500.00, 
     'product2': 2700.00, 
     'product4': 666.00 
    } 
} 

def get_current_datafile(): 
    with open(name='datafile.raw', mode='rb') as input_handle: 
     input_dict = pickle.loads(input_handle.read()) 
    return input_dict 

def write_datafile(new_dict): 
    with open(name='datafile.raw', mode='wb') as output_handle: 
     pickle.dump(new_dict, output_handle) 

私はそれがうまく動作する一つの環境でシリアル化されたファイルを使用します。しかし、別のマシンでPython環境と同じファイルを逆シリアル化しようとすると、まったく同じように設定されますが、私にはdatetimeモジュールがインストールされていないと主張するトレースバックを与えてしまいます。

Traceback (most recent call last): 
    File "scraper.py", line 92, in <module> 
    Scraper().main() 
    File "scraper.py", line 32, in main 
    input_dict = self.get_current_datafile() 
    File "scraper.py", line 82, in get_current_datafile 
    input_dict = pickle.loads(input_handle.read()) 
    File "Python\lib\pickle.py", line 1388, in loads 
    return Unpickler(file).load() 
    File "Python\lib\pickle.py", line 864, in load 
    dispatch[key](self) 
    File "Python\lib\pickle.py", line 1096, in load_global 
    klass = self.find_class(module, name) 
    File "Python\lib\pickle.py", line 1130, in find_class 
    __import__(module) 
ImportError: No module named datetime 

だけ私の知る環境の違いは、Windows版である - 1台のマシンが稼働している:

  • Python 2.7.12
  • Pickle r. 72223
  • Windows 7 x64

と他の一つが実行されている:

  • Python 2.7.12
  • Pickle r. 72223
  • Windows 10 x64

を質問です:私は一貫してシリアライズとデシリアライズすることができますので、私は自分の環境を設定する必要がありますどのようにそれらの間のファイル?

+0

私が使用した一時的な回避策は、日付を平文の文字列として保存し、逆シリアル化した後にdatetimeでラップすることでした。 – mkierc

答えて

1

私はちょうどこの正確な問題に遭遇しました。問題は、pickleファイルの行末です。 Python 2.7.13では、改行コードだけで保存されます。

2台目のマシンではGITからそれらを取得していましたが、Windows用のTortoise GITでは改行を単に改行から改行/改行に変換していました。

したがって、マシン間で改行が変換されていないことを確認してください。私が改行だけに変換するとすぐに、インポートエラーはなくなりました。

関連する問題