python写文件处理编码

时间:2016-10-01 14:51:17

标签: python unicode encoding utf-8 character-encoding

我很困惑。我需要帮助!!! 我正在处理一个包含中文字符的文件,例如,我们称之为a.TEST,这就是里面的内容。

你好 中国 Hello China 1 2 3

你不需要了解中文的意思。(其实这是'你好中国')

>>> f=open('wr.TRAIN')
>>> print f.read()
你好 中国 Hello China 1 2 3

>>> f.seek(0)
>>> content = f.readline()
>>> content
'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\xad\xe5\x9b\xbd Hello China 1 2 3\n'
>>> print content
你好 中国 Hello China 1 2 3
>>> type(content)
<type 'str'>
>>> isinstance(content,unicode)
False

第一个问题:为什么当我只输入utf-8时,python shell会给content content,同时print content cmd可以输出我想看的表格吗?

第二个问题unicodestr之间有什么区别? 有人告诉我,encode已转换为unicodestr,但我从Unicode HowTo学到的东西告诉我encodeunicode转换为{{} 1}}

尚未结束! :)

这里是utf-8

test.py

enter image description here

enter image description here

第三个问题:当我#!/usr/bin/python #-*- coding: utf-8 -*- fr = open('a.TEST') fw = open('out.TEST','w') content = fr.readline() content_list = content.split() print content fw.write('{0}'.format(content_list)) fr.close() fw.close() 时,为什么汉字会变成utf-8代码?

我认为.split()会起作用,但事实并非如此。 我不希望写入fw.write('{0}'.format(content_list).decode('utf-8'))的是字符编码形式,我希望它完全是原来的字符(你好)。怎么做?

2 个答案:

答案 0 :(得分:6)

什么是编码

文件由字节组成。您可以使用0到255之间的数字表示每个字节(或以十六进制表示0x00和0xFF)。

文本也写为字节。关于文本编写方式的协议。那是一种编码。最基本的编码是ASCII,其他编码通常基于它。例如,ASCII定义数字65(0x41)代表&#39; A&#39; 66(0x42)代表&#39; B&#39;等

如何表示字符串

在python中,您可以使用数值定义字符串:

>>> '\x41\x42\x43'
'ABC'

'\x41\x42\x43''ABC'完全相同。 Python将始终使用更易读的文本表示形式表示字符串('ABC')。

但是,某些数值不是可打印字符,因此它们将以数字形式表示:

>>> '\x00\x01\x02\x03\x04'
'\x00\x01\x02\x03\x04'

其他角色有别名,可以让您的工作更轻松:

>>> '\x0a\x0d\x09'
'\n\r\t'

不同的编码

ASCII table定义数字0-127的含义,仅包括英文字母。数字128-255未定义。因此,其他编码定义了128-255的含义。还有一些人改变了整个范围的含义0-255。

有许多编码,他们以不同的方式定义128-255。

例如,在windows-1250编码中,字符185(0xB9)为ą,但在iso-8859-2编码中为š

那么,如果你打印\xb9会怎样?这取决于控制台中使用的编码。在我的情况下(我的控制台使用cp852编码)它是:

>>> print '\xb9'
╣

由于这种歧义,字符串'\xb9'永远不会被表示为 '╣'(也不是'ą' ...)。那会隐藏真正的价值。它将表示为数值:

>>> '\xb9'
'\xb9'

此外:

>>> '╣'
'\xb9'

另请参阅我的控制台中问题的字符串:

>>> content = '\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\xad\xe5\x9b\xbd Hello China 1 2 3\n'
>>>
>>> content
'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\xad\xe5\x9b\xbd Hello China 1 2 3\n'
>>>
>>> print content
ńŻáňąŻ ńŞşňŤŻ Hello China 1 2 3

但是如果刚刚在控制台中输入变量会发生什么?

如果变量是没有print的cosole中的enteren,则会打印其表示形式。它与以下内容相同:

>>> print repr(content)
'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\xad\xe5\x9b\xbd Hello China 1 2 3\n'

什么是Unicode?

Unicode table旨在定义世界上所有角色的数字表示形式。它实际上可以这样做,因为它不限于256个值(或实际上任何其他限制)。这不是编码,而是数字到字符的通用映射。

例如,unicode定义数字353(0x0161)是字符š。无论您使用何种语言环境和编码,这都是正确的。该字符可以任何支持š的编码存储在文件(或内存)中。

什么是UTF-8?

编码unicode字符时,可以使用任何编码,但并非所有编码都支持所有字符。

例如,š(unicode 0x0161)可以在iso-8869-2中编码为0xB9,但它根本不能在iso-8869-1中编码。

因此,为了能够编码任何东西,您需要一个支持每个 unicode字符的编码。 UTF-8是其中一种编码,但还有其他编码:

>>> u'\u0161'.encode('utf-7')
'+AWE-'
>>> u'\u0161'.encode('utf-8')
'\xc5\xa1'
>>> u'\u0161'.encode('utf-16le')
'a\x01'
>>> u'\u0161'.encode('utf-16be')
'\x01a'
>>> u'\u0161'.encode('utf-32le')
'a\x01\x00\x00'
>>> u'\u0161'.encode('utf-32be')
'\x00\x00\x01a'

utf-8的优点是整个ASCII范围不变,只要使用ASCII,每个字符只使用一个字节:

>>> u'abcdefg'.encode('utf-8')
'abcdefg'
<2> Python 2中的Unicode

重要:这非常适合Python 2. Python 3不同。

str个对象(字节串)不同,unicode个对象是unicode字符串。

可以使用所选编码将str编码为str,或以所选编码从u进行解码。

在开头报价之前使用\uHEX指定unicode字符串。内部字符使用当前编码进行解释,或者可以使用数字格式>>> u'ABCD' u'ABCD' >>> >>> u'\u0041\u0042\u0043' u'ABC' >>> u'šâů' u'\u0161\xe2\u016f'

指定
contents

现在答案

第一个问题

  • repr(contents)打印print contents
  • contents打印str

第二个问题

UTF-8 字符串是字节字符串(unicode)。您可以通过编码>>> u'\u0161'.encode('utf-8') '\xc5\xa1' >>> '\xc5\xa1'.decode('utf-8') u'\u0161'

来获取它们
encode

是的,unicodestr转换为strcontent_list可以是utf-8,但不一定是。

第三个问题

A) &#34;为什么中文字符在我执行.split()时会变成utf-8代码?&#34;

他们一直都是utf-8。

B) &#34;我认为fw.write(&#39; {0}&#39; .format(content_list).decode(&#39; utf- 8&#39;))将工作&#34;

repr不是字符串。这是一个清单。当列表转换为字符串时,它会使用repr来完成,>>> 'a \n a \n a' 'a \n a \n a' >>> print 'a \n a \n a' a a a >>> print ['a \n a \n a'] ['a \n a \n a'] 也会完成所有内容的{{1}}。

例如:

{{1}}

最后一个打印的repr(list),其中包含repr(str)。

答案 1 :(得分:1)

一开始,只有英文字符,人们不满意。

然后他们想要展示世界上的每一个角色。但是有问题。一个字节只能代表255个字符。只是没有足够的地方来容纳它们。

然后人们决定用两个字节代表一个字符。并称之为“utf8&#39;。

无论你写什么字符,它都以字节形式存储。

在Python中,没有这样的数据类型称为&#39; unicode&#39;,只是&#39; str&#39;。并且&#39; unicode&#39;是一个&#39; str的编码系统。

&#39; \ xe4 \ xbd \ xa0 \ xe5 \ xa5 \ xbd \ xe4 \ xb8 \ xad \ xe5 \ x9b \ xbd&#39;是&#34;你好中国&#34;的字节形式。 没有指定编码系统就无法显示。

我想你可以责怪linux / unix。 Python没有问题显示&#39; utf-8&#39;人物,而“猫”#39;不能。