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?