Python 如何将utf-8字符(';\xe7\x8e\xa9';)作为中文字符写入另一个文件?

Python 如何将utf-8字符(';\xe7\x8e\xa9';)作为中文字符写入另一个文件?,python,encoding,utf-8,character-encoding,Python,Encoding,Utf 8,Character Encoding,我从数据库中得到了一些字符串,看起来像'\xe7\x8e\xa9' 我想是utf-8。我可以通过以下方式打印出来: print '\xe7\x8e\xa9' 玩 问题是,我需要将它们作为汉字写入另一个文件(例如。玩) 以及其他字母数字数据 我尝试了编码,解码,但没有得到我希望的结果 以下是我的尝试: f = open('a','w') name = u.name #.encode('utf8') # I commented it to get raw f.write('\t$$%r$$man

我从数据库中得到了一些字符串,看起来像
'\xe7\x8e\xa9'

我想是utf-8。我可以通过以下方式打印出来:

print '\xe7\x8e\xa9'
玩
问题是,我需要将它们作为汉字写入另一个文件(例如。玩) 以及其他字母数字数据

我尝试了
编码
解码
,但没有得到我希望的结果

以下是我的尝试:

f = open('a','w')
name = u.name #.encode('utf8')  # I commented it to get raw
f.write('\t$$%r$$many_other_data' % name) 
f.close()
当我用vim7.4打开输出文件时:

 `$$u'\u7aef\u5e84\u7684\u9a6c\u6b47\u5c14$$many_other_data'`
文件是字节。不能在其中存储字符

一种特别常见的编码是ASCII,它和所有不同的unicode编码一样

字节本身是无意义的(作为文本),没有相关的编码赋予它们意义


您需要使用与编写文件时使用的编码相同的编辑器或查看器来查看文件。

由于您有字节,您需要知道您的编码。有多种方法可以将字节转换为unicode(
str.decode
),这取决于字节的编码方式

您无法从字节本身获取此信息,必须有人告诉您编码

不过,有时你可以做出有根据的猜测:

>>> import chardet
>>> s = '\xe7\x8e\xa9'
>>> chardet.detect(s)
{'confidence': 0.505, 'encoding': 'utf-8'}
>>> s.decode(chardet.detect(s)['encoding'])
u'\u73a9'
>>> print _
玩
现在,您应该在任何字符串进入python程序后立即将其从db转换为unicode,这样您的代码就可以完全使用unicode,而不是字节

然后,您可以这样编写文件:

import io
with io.open('/tmp/myfile.txt', 'wb', encoding='utf-8') as f:
    f.write(u'\u73a9')
    f.write('\n')
    f.write('random other data 12345...')

下面是我的代码示例:

with open('foo', 'w+') as f:
    f.write('\xe7\x8e\xa9')
foo
文件a中:

但是,我用utf-8编码打开了
foo
,所以它显示的是中文字符而不是Unicode值

我已经用vim和gedit对它进行了测试,效果很好

也许您应该提供输出文件的类型,这样我们可以更具体一些

编辑

我现在看到问题了。您在编写字符串时使用了
%r
标志。您应该使用
%s
(并再次启用编码)

下面是一个工作示例:

>>> a = u'\u7aef\u5e84\u7684\u9a6c\u6b47\u5c14'
>>> f = open('tmp', 'w')
>>> a = a.encode('utf-8')
>>> f.write('\t$$%r$$other_data\n'%a)
>>> f.write('\t$$%s$$other_data\n'%a)
>>> f.close
结果如下:

    $$'\xe7\xab\xaf\xe5\xba\x84\xe7\x9a\x84\xe9\xa9\xac\xe6\xad\x87\xe5\xb0\x94'$$other_data
    $$端庄的马歇尔$$other_data
请准备好参考%r和%s之间的差异


希望有帮助。

当从文本编辑器打开时,它们的原始形式是完全一样的,还是在阅读后使用
\uuu repr\uuuu
方法时它们看起来是一样的?还有,这是Python 2还是Python 3?u'\u5916\u5411\u7684\u95ea\u7535'可以转换成中文并作为中文写入另一个文件吗?这是unicode。我声明了#编码:utf-8在我的进程py文件开始时。但是我在输出文件中仍然得到了“\xe7\x8e\xa9”。我使用了write方法。似乎我将这些\xe7内容转换为普通字符串?我完全困惑了。我已经更新了我的问题,是否有您需要的信息?