1

我有python函数的问题os.path.isdir

当我尝试使用它时,我得到:UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 36: ordinal not in range(128)

我已经在文件的标题中放置了编码“戳记”#!/usr/bin/env python # coding: utf-8

我还使用了相当适当的字符串解码,可以获取 utf-8 符号(我通过 QT QLineEdit 加载它们——但这并不重要)。

tmp_filepath = u''
tmp_filepath = tmp_filepath.decode('utf-8')
tmp_filepath += QtGui.QFileDialog.getExistingDirectory(self,"Choose directory",self.directorypath,QtGui.QFileDialog.ShowDirsOnly)

我尝试使用时出现问题:os.path.isdir(tmp_filepath)

我读过这可能是由错误的 python 版本(非 utf-8)引起的,但我找不到有关此的其他信息。我在 Linux Ubuntu 10.04 上使用 python 2.6.5。

4

2 回答 2

3

isdir 想要将其参数转换为字节序列 (str),因为底层文件系统使用字节序列作为文件名。如果您提供一个字符串(unicode),它必须以某种方式对其进行编码。

它使用与打印命令相同的编码规则。尝试 print tmp_filepath ,您可能会得到相同的异常。

要解决这个问题,(a) 设置您的语言环境(例如环境中的 LANG=en_US.utf-8)或 (b) 将 tmp_filename.encode('utf-8') 传递给 isdir 和 mkdir。

我推荐(一)。

于 2013-03-27T13:33:17.330 回答
0

Qt 返回一个 QString 对象 - 你必须将它转换为 Python unicode 并将其编码为 utf-8:

 tmp_filepath = unicode(tmp_filepath)
 os.path.isdir(tmp_filepath.encode("utf-8"))

此外,在今天继续您的编程之前,请务必阅读http://www.joelonsoftware.com/articles/Unicode.html 。

或者,如果您不必与 Python 中的其他文本变量进行互操作,QString 对象.toUtf8本身提供了一个方法:

os.path.isdir(tmp_filepath.toUtf8()) 
于 2013-03-27T13:25:05.527 回答