首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python unicode在命令行中写入文件崩溃,但在IDE中不写

Python unicode在命令行中写入文件崩溃,但在IDE中不写
EN

Stack Overflow用户
提问于 2012-03-22 12:51:52
回答 3查看 3.6K关注 0票数 2

我遇到了一个问题,我的Python2.7.3rc2代码在IDE (带有PyDev的Aptana 3)中运行良好,但是当我双击.py文件或尝试从.py命令行运行它时会崩溃。

问题是我试图将包含unicode字符的字符串写到文件中。IDE没有问题,并且正确地用unicode字符写入文件。命令行版本抱怨无法对某些字符进行编码。

问题的根源是: IDE版本与命令行版本有什么不同,其中一个版本正确地写入了unicode文件,而另一个版本则没有?

理想的解决方案应该让命令行版本与IDE版本完全一样工作。

编辑:--对不起,我以为我使用哪个命令将字符串写到文件中,但我对并不熟悉。实际的命令是对使用write()实例化的对象f调用的。我将希望它写入文件的字符串传递给它,该字符串包含unicode字符。

完整的错误消息是:

代码语言:javascript
复制
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了。下面是:

代码语言:javascript
复制
# -*- coding: utf-8 -*-
str = u'滑鐵盧安大略加拿大'
f = open('test', 'w')
f.write(str)
f.close()

此SSCCE在从命令行运行时崩溃,但不在IDE中运行。,为什么?

编辑:我添加了Edward建议的一些额外代码,以验证命令行和版本的版本是否相同。

以下是新代码:

代码语言:javascript
复制
# -*- 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运行时的输出:

代码语言:javascript
复制
2.7.3rc2 (default, Mar 18 2012, 22:59:27) [MSC v.1500 64 bit (AMD64)]
<built-in function open>
__builtin__

下面是从命令行运行时的输出:

代码语言:javascript
复制
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中工作,而不是命令行!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-22 13:32:32

正如Fenikso所说,在将字符串写入文件之前,您应该对其进行编码。file.write()本身没有这样做的原因是需要指定要使用哪种编码(utf-8、utf-16等)。有一个python模块"codecs“,它允许您创建知道使用什么编码的流对象,并自动应用它。这就是费尼科在他的第二个例子中所用的。

至于为什么您的代码在IDE中工作,而不是在命令行中工作,我猜您的IDE正在将“默认编码”设置为一些非默认值。尝试在IDE和命令行中运行这两个命令行,看看它是否不同:

代码语言:javascript
复制
>>> import sys
>>> print sys.getdefaultencoding()

以下是一些相关信息:http://blog.ianbicking.org/illusive-setdefaultencoding.html

票数 1
EN

Stack Overflow用户

发布于 2012-03-22 13:09:42

在将字符串写入文件之前,应将字符串显式地编码为所需的编码:

代码语言:javascript
复制
f.write(text.encode("cp1250", "replace")) # Czech Windows encoding, use your own

代码语言:javascript
复制
f.write(text.encode("utf-8", "replace")) # UTF-8

还可以使用特定的编码显式打开文件:

代码语言:javascript
复制
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import codecs

x = "abcč"
f = codecs.open("test.txt", "w", "utf-8", "replace")
f.write(x)
票数 3
EN

Stack Overflow用户

发布于 2012-03-22 13:27:24

每当我需要处理特定的编码时,我都是这样做的。

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import codecs
out = codecs.getwriter('utf-8')(sys.stdout)
out.write('some åäö-string')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9822655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档