我遇到了一个问题,我的Python2.7.3rc2代码在IDE (带有PyDev的Aptana 3)中运行良好,但是当我双击.py文件或尝试从.py命令行运行它时会崩溃。
问题是我试图将包含unicode字符的字符串写到文件中。IDE没有问题,并且正确地用unicode字符写入文件。命令行版本抱怨无法对某些字符进行编码。
问题的根源是: IDE版本与命令行版本有什么不同,其中一个版本正确地写入了unicode文件,而另一个版本则没有?
理想的解决方案应该让命令行版本与IDE版本完全一样工作。
编辑:--对不起,我以为我使用哪个命令将字符串写到文件中,但我对并不熟悉。实际的命令是对使用write()实例化的对象f调用的。我将希望它写入文件的字符串传递给它,该字符串包含unicode字符。
完整的错误消息是:
Traceback (most recent call last):
File "writer.py", line 46, in <module>
write_listings(c, output_path)
File "writer.py", line 33, in write_listings
print name
File "c:\Python27\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 21-26: character maps to <undefined>下面是一个示例字符串:滑鐵盧安大略加拿大
不幸的是,我在创建SSCCE时遇到了困难,因为我不能仅仅将字符串文字放入源代码文件中,而不抱怨我没有声明编码。这是令人沮丧的--当我运行IDE中的所有东西时,这一切都运行得非常好,而现在我正朝着unicode兔子洞前进!
编辑:多亏了Fredrik,我现在能够做一个SSCCE了。下面是:
# -*- coding: utf-8 -*-
str = u'滑鐵盧安大略加拿大'
f = open('test', 'w')
f.write(str)
f.close()此SSCCE在从命令行运行时崩溃,但不在IDE中运行。,为什么?
编辑:我添加了Edward建议的一些额外代码,以验证命令行和版本的版本是否相同。
以下是新代码:
# -*- coding: utf-8 -*-
import sys
print sys.version
print open
print open.__module__
str = u'滑鐵盧安大略加拿大'
f = open('test', 'w')
f.write(str)
f.close()下面是从IDE运行时的输出:
2.7.3rc2 (default, Mar 18 2012, 22:59:27) [MSC v.1500 64 bit (AMD64)]
<built-in function open>
__builtin__下面是从命令行运行时的输出:
2.7.3rc2 (default, Mar 18 2012, 22:59:27) [MSC v.1500 64 bit (AMD64)]
<built-in function open>
__builtin__
Traceback (most recent call last):
File "test.py", line 9, in <module>
f.write(str)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)在我看来,这个问题仍然没有答案,因为我仍然不知道什么会使它在IDE中工作,而不是命令行!
发布于 2012-03-22 13:32:32
正如Fenikso所说,在将字符串写入文件之前,您应该对其进行编码。file.write()本身没有这样做的原因是需要指定要使用哪种编码(utf-8、utf-16等)。有一个python模块"codecs“,它允许您创建知道使用什么编码的流对象,并自动应用它。这就是费尼科在他的第二个例子中所用的。
至于为什么您的代码在IDE中工作,而不是在命令行中工作,我猜您的IDE正在将“默认编码”设置为一些非默认值。尝试在IDE和命令行中运行这两个命令行,看看它是否不同:
>>> import sys
>>> print sys.getdefaultencoding()以下是一些相关信息:http://blog.ianbicking.org/illusive-setdefaultencoding.html
发布于 2012-03-22 13:09:42
在将字符串写入文件之前,应将字符串显式地编码为所需的编码:
f.write(text.encode("cp1250", "replace")) # Czech Windows encoding, use your own或
f.write(text.encode("utf-8", "replace")) # UTF-8还可以使用特定的编码显式打开文件:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import codecs
x = "abcč"
f = codecs.open("test.txt", "w", "utf-8", "replace")
f.write(x)发布于 2012-03-22 13:27:24
每当我需要处理特定的编码时,我都是这样做的。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import codecs
out = codecs.getwriter('utf-8')(sys.stdout)
out.write('some åäö-string')https://stackoverflow.com/questions/9822655
复制相似问题