5

pickle ファイルからデータをインポートするアプリケーションがあります。Windows では問題なく動作しますが、Mac と Linux の動作は奇妙です。

OS X では、ファイル タイプを *.* に設定しない限り、pickled ファイル (ファイル拡張子 ".char") を選択できません。次に、拡張子が .char のファイルを選択すると、読み込まれず、エラーが発生します

unpickle_file = cPickle.load(char_file) 

ValueError: 文字列を float に変換できませんでした

ただし、.char 拡張子を持たないファイルを作成すると、そのファイルは正常に読み込まれます。

Linux では、「ファイルを開く」ダイアログを使用すると、ファイル拡張子があるかどうかに関係なく、ピクルス化されたファイルが表示されません。ただし、Nautilus や Dolphin の下ではそれらを見ることができます。ただし、それらは単に私のアプリケーションには存在しません。


編集保存コードは次のとおりです。

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()
4

5 に答える 5

10

おそらく、ピクルされたデータの書き込みおよび/または読み取り時に、ファイルをバイナリモードで開いていませんでした。この場合、改行形式の変換が発生し、バイナリ データが破損する可能性があります。

バイナリ モードでファイルを開くには、モード文字列の一部として "b" を指定する必要があります。

char_file = open('pickle.char', 'rb')
于 2008-11-12T12:30:35.480 に答える
9

Adamが述べたように、問題は pickle ファイルの改行形式にある可能性があります。

残念ながら、実際の問題はロードではなく保存時に発生します。バイナリではなくテキストモードのピクルを使用している場合、これは回復可能かもしれません。ファイルをユニバーサル改行モードで開いてみてください。これにより、Python は正しい行末が何であるかを推測します。

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

ただし、バイナリ形式 (cPickle.dump(file, 1)) を使用している場合は、(Windows でロードした場合でも) pickle が回復不可能なほど破損している可能性があります - 運が良く、\r\n 文字が表示されない場合動作する可能性がありますが、これが発生するとすぐにデータが破損する可能性があります。これは、「実際の」 \r\n コードと、\n だけを見て挿入された 1 つのウィンドウを区別する方法がないためです。

複数のプラットフォームで読み込まれるものを処理する最善の方法は、常にバイナリ モードで保存することです。Windows マシンで、ピクルを保存するときに次を使用します。

char_file = open('filename.char','wb')
cPickle.dumps(data, char_file)
于 2008-11-12T12:57:32.367 に答える
4

このエラーが発生する別の方法は、酸洗後に出力ファイルを閉じるのを忘れることです。これにより、後続の unpickle 中にランダムな方法で失敗する不完全なファイルが残る可能性があります。

于 2012-02-20T07:45:18.963 に答える
2
self.file = open(self.file_name, 'w')

次のようにする必要があります。

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

createSaveFile関数で、(テキスト モードではなく) バイナリ モードでファイルを保存します。また、バイナリ モード (rb) でファイルを開くことも確認する必要があります。

バイナリ モードを使用しない場合、Windows はすべての改行を \r\n に変換し、ファイルを効果的に破損します (少なくとも他の OS に関する限り)。

于 2008-11-12T15:46:22.667 に答える
0

dos2unix ツールを使用する

dos2unix pickle.char
于 2014-07-24T01:12:01.147 に答える