Запеченный файл не загружается на Mac / Linux - PullRequest
5 голосов
/ 12 ноября 2008

У меня есть приложение, которое импортирует данные из маринованного файла. Он отлично работает в Windows, но поведение Mac и Linux странное.

В OS X маринованный файл (расширение файла ".char") недоступен как выбор, если я не установил тип файла на *. *. Затем, если я выберу файл с расширением .char, он не загрузится, выдав ошибку

unpickle_file = cPickle.load(char_file) 

ValueError: не удалось преобразовать строку в число с плавающей точкой

Однако, если я создаю файл, который не имеет расширения .char, этот файл загрузится просто отлично.

В Linux, когда я использую диалоговое окно «открытие файла», мои маринованные файлы не видны, независимо от того, имеют ли они расширение файла. Тем не менее, я вижу их под Наутилусом или Дельфином. Они просто не существуют для моего приложения.


Редактировать Вот код сохранения:

def createSaveFile(self):
        """Create the data files to be saved and save them.

        Creates a tuple comprised of a dictionary of general character information
        and the character's skills dictionary."""
        if self.file_name:
            self.save_data = ({'Name':self.charAttribs.name,

              <snip> 

                self.charAttribs.char_skills_dict)
            self.file = open(self.file_name, 'w')
            cPickle.dump(self.save_data, self.file)
        self.file.close()

Вот открытый код:

 def getCharFile(self, event): # wxGlade: CharSheet.<event_handler>
        """Retrieve pickled character file from disk."""
        wildcard = "Character files (*.char) | *.char | All files (*.*) | *.*"        
        openDialog = wx.FileDialog(None, "Choose a character file", os.getcwd(),
        "", wildcard, wx.OPEN | wx.CHANGE_DIR)
        if openDialog.ShowModal() == wx.ID_OK:
            self.path = openDialog.GetPath()
        try:
            char_file =  open(self.path, "r")
            unpickle_file = cPickle.load(char_file)
            char_data, char_skills = unpickle_file
            self.displayCharacter(char_data, char_skills)
        except IOError:
            self.importError = wx.MessageDialog(self, 
            "The character file is not available!",
            "Character Import Error", wx.OK | wx.ICON_ERROR)
            self.importError.ShowModal()
            self.importError.Destroy()
            openDialog.Destroy()

Ответы [ 5 ]

10 голосов
/ 12 ноября 2008

Возможно, вы не открывали файл в двоичном режиме при записи и / или чтении маринованных данных. В этом случае произойдет преобразование формата новой строки, которое может разбить двоичные данные.

Чтобы открыть файл в двоичном режиме, вы должны указать «b» как часть строки режима:

char_file = open('pickle.char', 'rb')
9 голосов
/ 12 ноября 2008

Как упоминалось Адамом , проблема, вероятно, связана с форматом новой строки файла рассола.

К сожалению, настоящая проблема на самом деле вызвана save , а не загрузкой. Это может быть восстановлено, если вы используете текстовые режимы, а не бинарные. Попробуйте открыть файл в универсальном режиме новой строки, что заставит python угадать, что такое правильные окончания строк, например:

char_file=open('filename.char','rU')

Однако, если вы используете двоичный формат (cPickle.dump (file, 1)), у вас может быть невосстановимо испорченный рассол (даже при загрузке в Windows) - если вам повезло и без символов \ r \ n покажите, что это может сработать, но как только это произойдет, вы можете получить поврежденные данные, поскольку нет никакого способа отличить «реальный» код \ r \ n и одно окно вставлено при просмотре только \ n.

Лучший способ обрабатывать вещи, загружаемые на нескольких платформах, - это всегда сохранять в двоичном режиме. На вашем компьютере с Windows при сохранении маринада используйте:

char_file = open('filename.char','wb')
cPickle.dumps(data, char_file)
4 голосов
/ 20 февраля 2012

Другой способ получить эту ошибку - забыть закрыть выходной файл после травления. Это может привести к тому, что неполный файл выйдет из строя случайным образом при последующем извлечении.

2 голосов
/ 12 ноября 2008
self.file = open(self.file_name, 'w')

Должно быть:

self.file = open(self.file_name, 'wb')

В вашей функции createSaveFile, чтобы сохранить файл в двоичном режиме (а не в текстовом режиме). Вы также должны убедиться, что вы открываете файл также в двоичном режиме (rb).

Если вы не используете двоичный режим, Windows преобразует все новые строки в \ r \ n и эффективно повреждает файл (по крайней мере, в отношении других ОС).

0 голосов
/ 24 июля 2014

Используйте инструмент dos2unix

dos2unix pickle.char
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...