Python,UnicodeDecodeError

Python,UnicodeDecodeError,第1张

Python,UnicodeDecodeError

我们无法猜测您想做什么,您的代码中没有什么,“设置许多不同的编解码器”意味着什么,您“字符串”应该为您做什么。

请将您的代码更改为其初始状态,以使其尽可能地反映您要执行的 *** 作,再次运行它,然后编辑问题以提供(1)完整的回溯和错误消息,以及(2)摘录包括脚本中出现在回溯中的最后一条语句(3)对代码要执行的 *** 作的简短描述(4)您正在运行的Python版本。

在详细信息添加到问题后进行编辑:

(0)让我们尝试对失败的语句进行一些转换:

原始语言:

print "Error reading file %s"%u"%s/%s"%(folder, f)

添加空格以减少模糊性:
print "Error reading file %s" % u"%s/%s" % (folder, f)

添加括号以强调评估顺序:
print ("Error reading file %s" % u"%s/%s") % (folder, f)

评估括号中的(常数)表达式:
print u"Error reading file %s/%s" % (folder, f)



那真的是您想要的吗?建议:使用更好的方法构造路径ONCE(请参阅下面的点(2))。

(1)通常,用于

repr(foo)
"%r" %foo
用于诊断。这样,您的诊断代码就不太可能引起异常(如此处所发生的那样),并且可以避免歧义。
print repr(folder),repr(f)
在尝试获取大小,重新运行并报告之前,请插入该语句。

(2)不要通过

u"%s/%s" % (folder, filename)
…使用来建立路径
os.path.join(folder,filename)

(3)别无其他,检查已知问题。为了避免出现未知问题,请执行以下 *** 作:

try:    some_pre()except ReasonForBaleOutError:    continueexcept:     # something's gone wrong, so get diagnostic info    print repr(interesting_datum_1), repr(interesting_datum_2)    # ... and get traceback and error message    raise

一种更复杂的方法是使用日志记录而不是打印,但是与不知道发生了什么相比,上述方法要好得多。

*在rtm(“ os.walk”)之后进行 *进一步的编辑 ,记住旧的图例,然后重新读取代码:

(4)os.walk()遍历整棵树;您无需递归调用它。

(5)如果将unipre字符串传递给os.walk(),结果(路径,文件名)将报告为unipre。您并不需要所有的东西。然后,您只需要选择显示unipre结果的方式即可。

(6)删除其中带有“ $”的路径:您必须就地修改列表,但是这样做很危险。尝试这样的事情:

for i in xrange(len(folders), -1, -1):    if '$' in folders[i]:        del folders[i]

(7)通过结合文件夹名称和文件名称来引用文件。您正在使用ORIGINAL文件夹名称;当您退出递归时,这将不起作用;您需要使用

content[0]
os.walk报告的当前丢弃的值。

(8)您应该使用一些非常简单的方法:

for folder, subfolders, filenames in os.walk(unipred_top_folder):

generator = os.walk(...); try: content =generator.next()
如果您
generator.next()
将来需要这样做,则无需使用etc和BTW ,
exceptStopIteration
而只需使用裸机即可。

(9)如果调用方提供了一个不存在的文件夹,则不会引发异常,它什么也不做。如果提供的文件夹存在但为空,则同上。如果需要区分这两种情况,则需要自己进行额外的测试。

回复来自OP的评论:
“”谢谢,请阅读第一篇文章中显示的信息repr()。我不知道为什么它打印了这么多不同的项目,但看起来它们都有问题。它们之间的共同点是它们是.ink文件。这可能是问题所在吗?此外,在最后一个文件中,Firefox会打印(Modalitrovvisoria),而资源管理器中的真实文件名包含(Modalitàprovvisoria)“”

(10)嗯,这不是“ .INK” .lower(),而是“ .LNK” .lower()…也许您需要更改正在阅读的字体。

(11)“问题”文件名全都以“ .lnk”结尾的事实,可能与os.walk()有关,和/或Windows对这些文件名做了一些特殊处理。

(12)在此重复我用来生成该输出的Python语句,并引入了一些空白:

print repr(    "Error reading file %s"     % u"%s/%s" % (        folder.depre('utf-8','ignore'),        f.depre('utf-8','ignore')        )    )

似乎您尚未阅读,理解或忽略了我在对另一个答案(以及答案的答复)的评论中给您的建议: UTF-8与Windows文件中文件名的上下文无关系统。

我们对文件夹和f到底指的是什么感兴趣。您试图通过使用UTF-8对其进行解码,从而践踏了所有证据。您已经使用“忽略”选项使混淆变得更加复杂。如果您使用了“替换”选项,则会看到“((Modalit
ufffdrovvisoria)””。“忽略”选项在调试中没有位置。

在任何情况下,某些文件名都有某种错误,但使用“ ignore”选项似乎不会丢失字符(或看上去不会被篡改),这一事实是可疑的。

print repr(folder), repr(f)
您不理解“”“的哪一部分插入语句”“”?您需要做的就是这样:

print "Some meaningful text" # "error reading file" isn'tprint "folder:", repr(folder)print "f:", repr(f)

(13)根据回溯判断,您似乎还在代码的其他地方引入了UTF-8:

self.exploreRec(("%s/%s"%(folder,f)).enpre("utf-8"), treshold)

我想指出的是,您仍然不知道folder和f是指str对象还是unipre对象,两个答案表明它们很可能是str对象,因此为什么要引入blahbah.enpre()?

一个更一般的观点:在更改脚本之前,尝试了解您的问题所在。尝试尝试每条建议并加上几乎为零的有效调试技术并不是解决问题的办法。

(14)当您再次运行脚本时,您可能希望通过在C:的某个子集上运行来减少输出的数量,尤其是如果您按照我最初的建议对所有文件名进行调试打印,不仅是错误的错误(知道非错误的错误看起来可能有助于理解问题)。

回应Bryan McLemore的“清理”功能:

(15)这是一个带注释的交互式会话,它说明os.walk()和非ASCII文件名实际发生的情况:

C:junkterabytest>dir[snip] Directory of C:junkterabytest20/11/2009  01:28 PM    <DIR>          .20/11/2009  01:28 PM    <DIR>          ..20/11/2009  11:48 AM    <DIR>          empty20/11/2009  01:26 PM     11 Hašek.txt20/11/2009  01:31 PM  1,419 tbyte1.py29/12/2007  09:33 AM      9 Ð.txt    3 File(s)          1,439 bytes[snip]C:junkterabytest>python26pythonPython 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] onwin32Type "help", "copyright", "credits" or "license" for more information.>>> from pprint import pprint as pp>>> import os

os.walk(unipre_string)->产生unipre对象

>>> pp(list(os.walk(ur"c:junkterabytest")))[(u'c:\junk\terabytest',  [u'empty'],  [u'Hau0161ek.txt', u'tbyte1.py', u'xd0.txt']), (u'c:\junk\terabytest\empty', [], [])]

os.walk(str_string)->产生str对象

>>> pp(list(os.walk(r"c:junkterabytest")))[('c:\junk\terabytest',  ['empty'],  ['Hax9aek.txt', 'tbyte1.py', 'xd0.txt']), ('c:\junk\terabytest\empty', [], [])]

cp1252是我希望在系统上使用的编码…

>>> u'u0161'.enpre('cp1252')'x9a'>>> 'Hax9aek'.depre('cp1252')u'Hau0161ek'

如预期那样,使用UTF-8解码str无法正常工作

>>> 'Hax9aek'.depre('utf8')Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "C:python26libencodingsutf_8.py", line 16, in depre    return precs.utf_8_depre(input, errors, True)UnipreDepreError: 'utf8' prec can't depre byte 0x9a in position 2: unexpected pre byte

可以使用latin1解码任何随机字节串,而不会出错

>>> 'Hax9aek'.depre('latin1')u'Hax9aek'

但是U + 009A是控制字符(单字符输入),即无意义的乱码;绝对与正确答案无关

>>> unipredata.name(u'u0161')'LATIN SMALL LETTER S WITH CARON'>>>

(16)该示例显示了在默认字符集中可以表示该字符的情况;如果不是,会发生什么?这是一个包含CJK表意文字的文件名示例(这次使用IDLE),在我的默认字符集中肯定无法表示这些文件:

IDLE 2.6.4      >>> import os>>> from pprint import pprint as pp

repr(Unipre结果)看起来不错

>>> pp(list(os.walk(ur"c:junkterabytestchinese")))[(u'c:\junk\terabytest\chinese', [], [u'nihaou4f60u597d.txt'])]

并且Unipre在IDLE中显示得很好:

>>> print list(os.walk(ur"c:junkterabytestchinese"))[0][2][0]nihao你好.txt

str结果显然是通过使用.enpre(无论如何,“替换”)产生的-并不是很有用,例如,您不能通过将其作为文件名传递来打开文件。

>>> pp(list(os.walk(r"c:junkterabytestchinese")))[('c:\junk\terabytest\chinese', [], ['nihao??.txt'])]

因此得出的结论是,为了获得最佳结果,应该将一个unipre字符串传递给os.walk(),并处理任何显示问题。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5631354.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存