8)用Python读写文件

理解阅读和写文本到文件(Python 2.4)时,我遇到了一些大脑故障。

# The string, which has an a-acute in it.
ss = u'Capitxe1n'
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()
'Capitxc3xa1nn'

所以我在文件f2中输入Capitxc3xa1n到我最喜欢的编辑器中。

然后:

>>> open('f1').read()
'Capitxc3xa1nn'
>>> open('f2').read()
'Capitxc3xa1nn'
>>> open('f1').read().decode('utf8')
u'Capitxe1nn'
>>> open('f2').read().decode('utf8')
u'Capitxc3xa1nn'

我在这里不了解什么? 显然,我有一些重要的魔法(或者说是有意义的),我错过了。 一个人输入到文本文件中以获得适当的转换?

如果你真的无法让Python识别它,那么当它来自外部时,我真正无法理解的是UTF-8表示的意义。 也许我应该只是JSON转储字符串,并使用它,因为它有一个asciiable表示! 更重要的是,当从一个文件进入时,Python会识别并解码这个Unicode对象的ASCII表示吗? 如果是这样,我怎么得到它?

>>> print simplejson.dumps(ss)
'"Capitu00e1n"'
>>> print >> file('f3','w'), simplejson.dumps(ss)
>>> simplejson.load(open('f3'))
u'Capitxe1n'

在符号中

u'Capitxe1nn'

“ xe1”只代表一个字节。 “ x”告诉你“e1”是十六进制的。 当你写

Capitxc3xa1n

进入你的文件,你有“ xc3”。 这些是4个字节,在你的代码中你可以读到所有的字节。 当你显示它们时你可以看到:

>>> open('f2').read()
'Capitxc3xa1nn'

您可以看到反斜杠被反斜杠转义。 所以你的字符串中有四个字节:“”,“x”,“c”和“3”。

编辑:

正如其他人在他们的答案中指出的,你应该在编辑器中输入字符,然后你的编辑器应该处理到UTF-8的转换并保存。

如果你实际上有这种格式的字符串,你可以使用string_escape编解码器将它解码为一个普通的字符串:

In [15]: print 'Capitxc3xa1nn'.decode('string_escape')
Capitán

结果是以UTF-8编码的字符串,其中重音字符由在原始字符串中写入xc3xa1的两个字节表示。 如果你想要一个Unicode字符串,你必须用UTF-8再次解码。

编辑:你的文件中没有UTF-8。 要真正看到它的外观如何:

s = u'Capitxe1nn'
sutf8 = s.encode('UTF-8')
open('utf-8.out', 'w').write(sutf8)

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


我没有弄乱编码和解码方法,而是更容易在打开文件时指定编码。 io模块(在Python 2.6中添加)提供了一个io.open函数,它有一个编码参数。

使用io模块中的open方法。

>>>import io
>>>f = io.open("test", mode="r", encoding="utf-8")

然后在调用f的read()函数后,返回一个编码的Unicode对象。

>>>f.read()
u'Capitxe1lnn'

请注意,在Python 3中, io.read函数是内置read函数的别名。 内置的read函数仅支持Python 3中的编码参数,而不支持Python 2。

编辑:以前这个答案建议编解码器模块。 编译码器模块在混合read()readline()时会导致问题,所以现在这个答案建议使用io模块。

使用编解码器模块中的打开方法。

>>>import codecs
>>>f = codecs.open("test", "r", "utf-8")

然后在调用f的read()函数后,返回一个编码的Unicode对象。

>>>f.read()
u'Capitxe1lnn'

如果你知道一个文件的编码,使用编解码器包将不那么令人困惑。

请参阅http://docs.python.org/library/codecs.html#codecs.open


所以,我找到了我正在寻找的解决方案,它是:

print open('f2').read().decode('string-escape').decode("utf-8")

有一些不常用的编解码器在这里很有用。 这个特定的读取允许从Python内部采用UTF-8表示法,将它们复制到ASCII文件中,并将它们读入Unicode。 在“字符串转义”解码下,斜线不会翻倍。

这允许我想象的那种往返行程。

链接地址: http://www.djcxy.com/p/66351.html

上一篇: 8) reading and writing to files in Python

下一篇: Why does cron email me the contents of my script rather than running it?