2016-10-07 2 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 настроена точно так же, как это не работает, давая мне трассировку, утверждающую, что у меня нет установленного модуля даты и времени, что, конечно же, неверно.

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 - одна машина работает:

  • 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 под окнами сохраняет их с помощью только строки.

На второй машине я извлекал их из GIT, а Tortoise GIT для окон автоматически конвертировал концы строк только от Line Feed до Carriage Return/Line Feed.

Итак, убедитесь, что ваши линии не преобразуются между машинами. Как только я вернусь только к линейным каналам, ошибка импорта исчезла.

Смежные вопросы