Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python不可生产UnicodeDecodeError_Python_Unicode_Ascii_Decode - Fatal编程技术网

Python不可生产UnicodeDecodeError

Python不可生产UnicodeDecodeError,python,unicode,ascii,decode,Python,Unicode,Ascii,Decode,我试图用Python中的以下命令序列替换Word文件中的子字符串。代码本身工作得非常好——即使是使用完全相同的Word文件,但是当将其嵌入到更大规模的项目结构中时,它会在确切的位置抛出错误。我不知道是什么原因导致了它,因为它似乎与代码无关,对我来说似乎不可生产 旁注:我知道是什么导致了错误,在Word文件中是一个德语的“ü”,但是如果代码独立运行,那么它是必需的,删除它似乎不是正确的解决方案 #foo.py from bar import make_wordm def main(uuid):

我试图用Python中的以下命令序列替换Word文件中的子字符串。代码本身工作得非常好——即使是使用完全相同的Word文件,但是当将其嵌入到更大规模的项目结构中时,它会在确切的位置抛出错误。我不知道是什么原因导致了它,因为它似乎与代码无关,对我来说似乎不可生产

旁注:我知道是什么导致了错误,在Word文件中是一个德语的“ü”,但是如果代码独立运行,那么它是必需的,删除它似乎不是正确的解决方案

#foo.py
from bar import make_wordm
def main(uuid):
    with open('foo.docm', 'w+') as f:
        f.write(make_wordm(uuid=uuid))

main('1cb02f34-b331-4616-8d20-aa1821ef0fbd')
foo.py导入bar.py以执行重载

#bar.py
import tempfile
import shutil
from cStringIO import StringIO
from zipfile import ZipFile, ZipInfo

WORDM_TEMPLATE='./res/template.docm'
MODE_DIRECTORY = 0x10

def zipinfo_contents_replace(zipfile=None, zipinfo=None,
                             search=None, replace=None):
    dirname = tempfile.mkdtemp()
    fname = zipfile.extract(zipinfo, dirname)
    with open(fname, 'r') as fd:
        contents = fd.read().replace(search, replace)
    shutil.rmtree(dirname)
    return contents

def make_wordm(uuid=None, template=WORDM_TEMPLATE):
    with open(template, 'r') as f:
        input_buf = StringIO(f.read())
    output_buf = StringIO()
    output_zip = ZipFile(output_buf, 'w')

    with ZipFile(input_buf, 'r') as doc:
        for entry in doc.filelist:
            if entry.external_attr & MODE_DIRECTORY:
                continue

            contents = zipinfo_contents_replace(zipfile=doc, zipinfo=entry,
                                        search="00000000-0000-0000-0000-000000000000"
                                        , replace=uuid)
            output_zip.writestr(entry, contents)
    output_zip.close()
    return output_buf.getvalue()
在较大规模的上下文中嵌入相同代码时引发以下错误:

ERROR:root:message
Traceback (most recent call last):
  File "FooBar.py", line 402, in foo_bar
    bar = bar_constructor(bar_theme,bar_user,uuid)
  File "FooBar.py", line 187, in bar_constructor
    if(main(uuid)):
  File "FooBar.py", line 158, in main
    f.write(make_wordm(uuid=uuid))
  File "/home/foo/FooBarGen.py", line 57, in make_wordm
    search="00000000-0000-0000-0000-000000000000", replace=uuid)
  File "/home/foo/FooBarGen.py", line 24, in zipinfo_contents_replace
    contents = fd.read().replace(search, replace)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2722: ordinal not in range(128)
INFO:FooBar:None
编辑:进一步检查和调试后,似乎是变量“uuid”导致了问题。当将参数作为全文字符串('1cb02f34-b331-4616-8d20-aa1821ef0fbd')提供时,它不使用从JSON解析的变量,而是工作得非常好

edit2:我必须添加
uuid=uuid.encode('utf-8','ignore')
,现在它工作得非常好。

更改这行:

with open(fname, 'r') as fd:
为此:

with open(fname, 'r', encoding='latin1') as fd:

ascii编码可以处理介于0和127之间(含0和127)的字符代码。您的文件包含字符代码0xc3,超出范围。您需要选择不同的编解码器。

过去我一直遇到特殊字符的问题,我都是通过读取时解码为Unicode,然后写入文件时编码为utf-8来解决的

我希望这对你也有用

对于我的解决方案,我一直在使用我在本演示中发现的内容

所以我会用这个:

def to_unicode_or_bust(obj, encoding='utf-8'):
    if isinstance(obj, basestring):
        if not isinstance(obj, unicode):
            obj = unicode(obj, encoding)
    return obj
然后在代码上:

contents = to_unicode_or_bust(fd.read().replace(search, replace))
然后在写入时将编码设置回utf-8

output_zip.writestr(entry, contents.encode('utf-8'))

我没有复制你的问题,所以这只是一个建议。希望它能工作

问题是Unicode和字节字符串的混合。Python2“有益地”尝试从一个转换到另一个,但默认使用
ascii
编解码器

下面是一个例子:

>>> 'aeioü'.replace('a','b')  # all byte strings
'beio\xfc'
>>> 'aeioü'.replace(u'a','b') # one Unicode string and it converts...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 4: ordinal not in range(128)
请注意,
编码
应与您正在读取的文件的实际编码相匹配。这是你必须决定的

正如您在编辑中所发现的,一个快捷方式是将UUID从JSON编码回字节字符串,但是使用Unicode处理文本应该是目标


Python3通过默认设置字符串为Unicode来清理这个过程,并删除与字节/Unicode字符串之间的隐式转换。

谢谢!这是Python3的吗?获取
“encoding”是此函数的无效关键字参数。除此之外,为什么在专门使用代码段时不会抛出UnicodeDecodeError?编辑:要使用Python2.7中的编码选项,请使用io.open-我仍然得到
unicodeincodeerror:“ascii”编解码器无法对2721-2722位置的字符进行编码:序号不在范围内(128)
即使使用
contents=fd.read().decode(“拉丁文1”).encode(“utf8”).replace(搜索,替换)
也会引发相同的错误。不管怎么说,这似乎并不能解决为什么会发生这种情况,因为代码片段是独立工作的。谢谢你的建议,但是我仍然得到
UnicodeDecodeError:“ascii”编解码器无法解码2722位置的字节0xc3:序号不在范围(128)
。不幸的是,此解决方法试图解决一个本来不应该存在的问题。您是否也可以尝试:
contents=to\u unicode\u或\u bust(fd.read())。替换(搜索,替换)
感谢您的努力<代码>UnicodeEncodeError:“ascii”编解码器无法对2722位置的字符u'\xfc'进行编码:序号不在范围(128)
我在Stackoverflow上尝试了所有编码/解码过程。老实说,我真的不认为这是解决办法,因为我不清楚为什么会首先抛出错误,因为代码段是有效的。这不可能是编码/解码问题以外的其他问题,因为删除会使整个过程正常,对吗?不知道你是否在Windows系统上,如果我是你,你可能会得到我会在所有读取中解码,在所有写入中编码。删除“ü”使整个项目在更大的项目中工作,是的-但是在一个较小的项目中保留“ü”并以独占方式运行相同的代码同样有效,并且不会引发编码/解码错误。我在UNIX上,但是你链接的帖子还是很有趣的!在打开的
中,您没有指定编码。如果它在某个时候起作用,并不意味着它是正确的。Python咒语:“显式优于隐式”。注意:大型框架可以激活“locales”,因此它可以改变本地部分(以及ev.translate也包括tring)的行为
with io.open(fname, 'r', encoding='utf8') as fd:
    contents = fd.read().replace(search, replace)