0

我正在尝试分析名称中包含中文字符的 CSV 文件中的数据(例如“粗体 1 25g”)。我正在使用 Tkinter 来选择这样的文件:

selectedFiles = askopenfilenames(filetypes=[("xlsx","*"),("xls","*")]) # Utilize Tkinker dialog window to choose files
selectedFiles = master.tk.splitlist(selectedFiles) # Create list from files chosen

我试图以这种方式将文件名转换为 unicode:

selectedFiles = [x.decode("utf-8") for x in selectedFiles]

只产生错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xb4 in position 0: ordinal not in range(128)

我还尝试转换文件名,因为文件是使用以下内容创建的:

titles = [x.encode('utf-8') for x in titles]

只收到错误:

IOError: [Errno 22] invalid mode ('wb') or filename: 'C:\...\\data_division_files\\\xe7\xb2\x971 25g.csv'

我也尝试了上述方法的组合,但无济于事。我可以做些什么来允许在 Python 中读取这些文件?

(这个问题虽然相关,但无法解决我的问题:Obtain File size with os.path.getsize() in Python 2.7.5

4

1 回答 1

0

当您调用decode一个unicode对象时,它首先对其进行编码,sys.getdefaultencoding()以便它可以为您解码。这就是为什么即使您在任何地方都没有要求 ASCII,您也会收到有关 ASCII 的错误。

那么,你从哪里得到一个unicode对象?从askopenfilename. 从快速测试来看,它看起来总是unicode在 Windows 上返回值(大概是通过获取 UTF-16 并对其进行解码),而在 POSIX 上它返回一些unicode和一些str(我猜不理会任何适合 7 位的东西ASCII,用你的文件系统编码解码其他任何东西)。如果您尝试打印出 repr 或 type 或任何内容selectedFiles,问题就会很明显。


同时,不encode('utf-8')应该导致任何UnicodeErrors ......但您的文件系统编码可能不是 Windows 上的 UTF-8,因此它可能会导致很多IOError带有 errno 2 的 s(尝试打开不存在的文件,或在不存在的目录中创建文件)、21(试图在 Windows 上打开具有非法文件或目录名称的文件)等。看起来这正是您所看到的。而且真的没有理由这样做;只需将路径名原样传递给open它们就可以了。


所以,基本上,如果你删除了所有的encodedecode调用,你的代码可能就可以工作了。

但是,还有一个更简单的解决方案:只需使用askopenfileorasksaveasfile代替askopenfilenameor asksaveasfilename。让 Tk 弄清楚如何使用它的路径名,然后把文件对象交给你,而不是自己弄乱路径名。

于 2013-10-18T09:11:38.890 回答