【发布时间】:2014-11-02 19:01:40
【问题描述】:
我最近将我的 PyQt4 应用程序从 Python 2.7 迁移到了 Python 3.4。但我注意到我的 QDirIterator 返回错误解码的非scii 文件路径。我正在使用 API v2,所以 QString 直接被翻译成 python str 对象。但是翻译后的文件路径是错误的。
即
Right paths are (from python os module):
D:\Dropbox\MP3\Chinaski\2002 - Originál\01 - Můj svět.mp3
D:\Dropbox\MP3\Chinaski\2002 - Originál\02 - Veselý turista.mp3
D:\Dropbox\MP3\Chinaski\2002 - Originál\03 - Láskopad.mp3
D:\Dropbox\MP3\Chinaski\2002 - Originál\04 - Hurá do Chebu.mp3
D:\Dropbox\MP3\Chinaski\2002 - Originál\05 - Kytarista.mp3
D:\Dropbox\MP3\Chinaski\2002 - Originál\06 - Žil byl....mp3
D:\Dropbox\MP3\Chinaski\2002 - Originál\07 - Lidi choděj do práce.mp3
D:\Dropbox\MP3\Chinaski\2002 - Originál\08 - Dobrák od Kosti.mp3
D:\Dropbox\MP3\Chinaski\2002 - Originál\09 - Umělci z Prahy.mp3
D:\Dropbox\MP3\Chinaski\2002 - Originál\10 - Šangri-la.mp3
D:\Dropbox\MP3\Chinaski\2002 - Originál\11 - Dál....mp3
D:\Dropbox\MP3\Chinaski\2002 - Originál\12 - Neříkej,že ne.mp3
D:\Dropbox\MP3\Chinaski\2002 - Originál\13 - Tahle láska skončila.mp3
But QDirIterator returns (ignore slashes .. / or \ doesn't matter)
D:/Dropbox/MP3/Chinaski/2002 - Originál/01 - Moj svt.mp3
D:/Dropbox/MP3/Chinaski/2002 - Originál/02 - Veselý turista.mp3
D:/Dropbox/MP3/Chinaski/2002 - Originál/03 - Láskopad.mp3
D:/Dropbox/MP3/Chinaski/2002 - Originál/04 - Hurá do Chebu.mp3
D:/Dropbox/MP3/Chinaski/2002 - Originál/05 - Kytarista.mp3
D:/Dropbox/MP3/Chinaski/2002 - Originál/06 - }il byl....mp3
D:/Dropbox/MP3/Chinaski/2002 - Originál/07 - Lidi chodj do práce.mp3
D:/Dropbox/MP3/Chinaski/2002 - Originál/08 - Dobrák od Kosti.mp3
D:/Dropbox/MP3/Chinaski/2002 - Originál/09 - Umlci z Prahy.mp3
D:/Dropbox/MP3/Chinaski/2002 - Originál/10 - `angri-la.mp3
D:/Dropbox/MP3/Chinaski/2002 - Originál/11 - Dál....mp3
D:/Dropbox/MP3/Chinaski/2002 - Originál/12 - NeYíkej,~e ne.mp3
ila.mp3
同样的 QFile 工作返回废话:
ff = QFile("D:\\Dropbox\\MP3\\Chinaski\\2002 - Originál\\06 - Žil byl....mp3")
print(ff.fileName())
print(ff.fileName().encode())
> D:/Dropbox/MP3/Chinaski/2002 - Originál/06 - }il byl....mp3
> b'D:/Dropbox/MP3/Chinaski/2002 - Origin\xc3\xa1l/06 - }il byl....mp3'
# expected this byte path
print(b'D:/Dropbox/MP3/Chinaski/2002 - Origin\xc3\xa1l/06 - \xc5\xbdil byl....mp3'.decode())
> D:/Dropbox/MP3/Chinaski/2002 - Originál/06 - Žil byl....mp3
现在呢?我用 .encode 和 .decode 做了一些恶作剧,但即显然超过 8 位的 char 'Ž' 被转换为 '}',所以正确的信息已经丢失。这里发生了一些不好的事情。
- Windows 8.1 x64
- Python 3.4.2 x32
- PyQt4-4.11.2-gpl-Py3.4-Qt4.8.6-x32.exe
由于 Python 2.7 的 unicode 噩梦,我已将代码移植到 Python 3。有人知道吗?
编辑1:
这是原始代码片段:
@pyqtSlot(str)
def scanFiles(self, targetDir):
"""
Thread worker! Called asynchronously from main thread.
The final data are sent to media parser in another thread.
@type targetDir: str
"""
# if target dir is already a file
if targetDir.endswith(self.fileNamesFilter):
logger.debug("Scanned target dir is a file.")
self.parseDataSignal.emit([targetDir])
self.parseDataSignal.emit([]) # end flag for media parser
return
flags = QDirIterator.Subdirectories | QDirIterator.FollowSymlinks if self.followSym else QDirIterator.Subdirectories
dirIter = QDirIterator(targetDir, flags)
result = []
n = 0
logger.debug("Dir iterator initialized, starting recursive search and parsing.")
while dirIter.hasNext():
path = dirIter.next()
if path.endswith(self.fileNamesFilter): # little bit slower than using regex (few ms), but more readable
result.append(path)
n += 1
if n == self.SEND_LIMIT:
self.parseDataSignal.emit(result)
n = 0
result = []
if result:
self.parseDataSignal.emit(result)
logger.debug("Recursive search finished, sending finish_parser flag.")
self.parseDataSignal.emit([])
【问题讨论】:
标签: python-3.x unicode qt4 pyqt4