我在理解读写文件(Python 2.4)时遇到了一些大脑故障.

# The string, which has an a-acute in it.
ss = u'Capit\xe1n'
ss8 = ss.encode('utf8')
repr(ss), repr(ss8)

("u'Capit\xe1n'"、"Capit\xc3\xa1n')

print ss, ss8
print >> open('f1','w'), ss8

>>> file('f1').read()
'Capit\xc3\xa1n\n'

所以我在我最喜欢的编辑器f2文件中输入了Capit\xc3\xa1n.

然后:

>>> open('f1').read()
'Capit\xc3\xa1n\n'
>>> open('f2').read()
'Capit\\xc3\\xa1n\n'
>>> open('f1').read().decode('utf8')
u'Capit\xe1n\n'
>>> open('f2').read().decode('utf8')
u'Capit\\xc3\\xa1n\n'

我在这里不明白什么?很明显,我缺少了一些至关重要的魔力(或良好的判断力).一个人在文本文件中键入什么来获得正确的转换?

我在这里真正不明白的是,如果您不能让Python识别来自外部的UTF-8表示,那么UTF-8表示的意义是什么.也许我应该只使用JSON转储字符串,而不是使用它,因为它有一个可asciiable表示!更重要的是,当从文件传入时,Python是否可以识别和解码此Unicode对象的ASCII表示?如果是这样的话,我怎么才能拿到呢?

>>> print simplejson.dumps(ss)
'"Capit\u00e1n"'
>>> print >> file('f3','w'), simplejson.dumps(ss)
>>> simplejson.load(open('f3'))
u'Capit\xe1n'

推荐答案

在符号中

u'Capit\xe1n\n'

"\xe1"只代表一个字节."\x"告诉您"e1"是十六进制的.

Capit\xc3\xa1n

文件中有"\xc3".这是4个字节,在你的代码中你可以全部读取它们.当您显示它们时,可以看到:

>>> open('f2').read()
'Capit\\xc3\\xa1n\n'

您可以看到反斜杠是由反斜杠转义的.因此,字符串中有四个字节:"\"、"x"、"c"和"3".

编辑:

正如其他人在回答中指出的那样,你只需要在编辑器中输入字符,然后编辑器就可以处理到UTF-8的转换并保存它.

如果您确实有此格式的字符串,则可以使用string_escape编解码器将其解码为普通字符串:

In [15]: print 'Capit\\xc3\\xa1n\n'.decode('string_escape')
Capitán

结果是一个以UTF-8编码的字符串,其中重音字符由原始字符串中写入\\xc3\\xa1的两个字节表示.如果您想要使用Unicode字符串,则必须使用UTF-8重新解码.

供您编辑:您的文件中没有UTF-8.要实际查看它的外观,请执行以下操作:

s = u'Capit\xe1n\n'
sutf8 = s.encode('UTF-8')
open('utf-8.out', 'w').write(sutf8)

将文件utf-8.out的内容与使用编辑器保存的文件内容进行比较.

Python相关问答推荐

如何在Python中并行化以下搜索?

如何在python polars中停止otherate(),当使用when()表达式时?

Pandas:将多级列名改为一级

如何在WSL2中更新Python到最新版本(3.12.2)?

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

未调用自定义JSON编码器

如何杀死一个进程,我的Python可执行文件以sudo启动?

在pandas/python中计数嵌套类别

如何在FastAPI中替换Pydantic的constr,以便在BaseModel之外使用?'

如何使用加速广播主进程张量?

如何用FFT确定频变幅值

如何在Python中自动创建数字文件夹和正在进行的文件夹?

浏览超过10k页获取数据,解析:欧洲搜索服务:从欧盟站点收集机会的微小刮刀&

用来自另一个数据框的列特定标量划分Polars数据框中的每一列,

操作布尔值的Series时出现索引问题

如何在Python中解析特定的文本,这些文本包含了同一行中的所有内容,

python3中np. divide(x,y)和x/y有什么区别?'

将数据从一个单元格保存到Jupyter笔记本中的下一个单元格

了解如何让库认识到我具有所需的依赖项

为什么这个正则表达式没有捕获最后一次输入?