处理编码的python写文件
我很困惑。我需要帮助!!! 我正在处理一个包含中文字符的文件,例如,让我们称之为.TEST,下面是其中的内容处理编码的python写文件,python,unicode,encoding,utf-8,character-encoding,Python,Unicode,Encoding,Utf 8,Character Encoding,我很困惑。我需要帮助!!! 我正在处理一个包含中文字符的文件,例如,让我们称之为.TEST,下面是其中的内容 你好 中国 Hello China 1 2 3 你不需要理解中国人的意思,实际上是“你好,中国” >>> f=open('wr.TRAIN') >>> print f.read() 你好 中国 Hello China 1 2 3 >>> f.seek(0) >>> content = f.readline() &
你好 中国 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码。拆分
我还以为fw.write'{0}'。formatcontent_list.decode'utf-8'可以工作,但不行。
我不想要写出来的东西。测试是字符编码形式,我希望它和原来的字符完全一样(你好). 怎么做?一开始,只有英文字符,人们并不满意 然后他们想显示世界上的每一个字符。但有一个问题。一个字节只能代表255个字符。根本没有足够的地方容纳它们 然后人们决定用两个字节来表示一个字符,并称之为“utf8” 不管你写什么字符,它都是以字节形式存储的 在Python中,没有称为“unicode”的数据类型,只有“str”。而“unicode”是“str”的编码系统 “\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\xad\xe5\x9b\xbd”是你好 中国. 如果未指定编码系统,则无法显示
我想你可能会责怪linux/unix。Python显示“utf-8”字符没有问题,而“cat”则没有问题。一开始,只有英文字符,人们对此并不满意 然后他们想显示世界上的每一个字符。但有一个问题。一个字节只能代表255个字符。根本没有足够的地方容纳它们 然后人们决定用两个字节来表示一个字符,并称之为“utf8” 不管你写什么字符,它都是以字节形式存储的 在Python中,没有称为“unicode”的数据类型,只有“str”。而“unicode”是“str”的编码系统 “\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\xad\xe5\x9b\xbd”是你好 中国. 如果未指定编码系统,则无法显示 我想你可能会责怪linux/unix。Python显示“utf-8”字符没有问题,而“cat”则没有问题。什么是编码 文件由字节组成。您可以用十六进制的0到255或0x00到0xFF之间的数字表示每个字节 文本也以字节形式写入。对文本的写入方式存在一致意见。这是一种编码。最基本的编码是ASCII,其他编码通常基于此。例如,ASCII定义数字65 0x41表示“A”,66 0x42表示“B”等 字符串是如何表示的 在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'
不同编码
定义数字0-127的含义,仅包括英文字母。数字128-255未定义。因此,其他编码定义128-255的含义。但其他编码会更改整个范围0-255的含义
有许多编码,它们以不同的方式定义128-255
例如,字符185 0xB9在windows-1250编码中是ą,但在iso-8859-2编码中是ą
那么,如果打印\xb9会发生什么?这取决于控制台中使用的编码。在我的情况下,我的控制台使用cp852编码,它是:
>>> print '\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
但是,如果只是在控制台中输入变量,会发生什么呢
在cosole中输入变量而不打印时,将打印其表示形式,如下所示:
>>> print repr(content)
'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\xad\xe5\x9b\xbd Hello China 1 2 3\n'
什么是Unicode?
旨在定义世界上所有字符的数字表示形式以及更多。它实际上可以做到这一点,因为它实际上不限于256个值或任何其他限制。这不是编码,而是数字到字符的通用映射
例如,unicode将数字353 0x0161定义为字符š。无论您使用的区域设置和编码如何,这都是正确的。该字符可以以支持š的任何编码存储在文件或内存中
什么是UTF-8?
编码unicode字符时,可以使用任何编码,但并非所有编码都支持所有字符
例如,šunicode 0x0161可以在iso-8869-2中编码为0xB9,但它根本不能在iso-8869-1中编码
所以,为了能够对任何东西进行编码,您需要一种支持所有unicode字符的编码
卢比:
utf-8的优点是整个ASCII范围保持不变,只要只使用ASCII,每个字符只使用一个字节:
>>> u'abcdefg'.encode('utf-8')
'abcdefg'
Python 2中的Unicode
重要提示:这是Python 2特有的。Python 3则不同
与str对象(字节字符串)不同,unicode对象是unicode字符字符串
它们可以用选定的编码方式编码到str中,也可以用选定的编码方式从str中解码
unicode字符串在开始引号之前使用u指定。其中的字符使用当前编码进行解释,也可以以数字格式指定\uHEX:
现在是答案
第一个问题
内容打印代表内容
打印内容打印内容
第二个问题
UTF-8字符串是字节字符串str。您可以通过编码unicode来获得它们:
是的,encode将unicode转换为str。str可以是utf-8,但不一定是
第三项质询
为什么我这样做的时候汉字会变成utf-8码。拆分
他们一直都是utf-8
B我想fw.write'{0}'。formatcontent_list.decode'utf-8'可以工作
内容列表不是字符串。这是一份清单。当列表转换为字符串时,将使用其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']
最后一次打印的包含reprstr的reprlist。什么是编码
文件由字节组成。您可以用一个介于0和255之间的数字或十六进制中的0x00和0xFF来表示每个字节
文本也以字节形式写入。对文本的书写方式有一致意见。这是一种编码。最基本的编码是ASCII,其他编码通常基于ASCII。例如,ASCII定义数字65 0x41表示“A”,66 0x42表示“B”等
字符串是如何表示的
在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'
不同编码
定义数字0-127的含义,仅包括英文字母。数字128-255未定义。因此,其他编码定义了128-255的含义。还有一些改变了整个范围0-255的含义
有许多编码,它们以不同的方式定义128-255
例如,字符185 0xB9在windows-1250编码中是ą,但在iso-8859-2编码中是ą
那么,如果打印\xb9会发生什么?这取决于控制台中使用的编码。在我的情况下,我的控制台使用cp852编码,它是:
>>> print '\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
但是,如果只是在控制台中输入变量,会发生什么呢
在cosole中输入变量而不打印时,将打印其表示形式。与以下内容相同:
>>> print repr(content)
'\xe4\xbd\xa0\xe5\xa5\xbd \xe4\xb8\xad\xe5\x9b\xbd Hello China 1 2 3\n'
什么是Unicode?
旨在定义世界上所有字符的数字表示形式等。它实际上可以做到这一点,因为它实际上不限于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'
Python 2中的Unicode
重要提示:这是Python 2特有的。Python 3则不同
与str对象(字节字符串)不同,unicode对象是unicode字符字符串
它们可以用选定的编码方式编码到str中,也可以用选定的编码方式从str中解码
unicode字符串在开始引号之前使用u指定。其中的字符使用当前编码进行解释,也可以以数字格式指定\uHEX:
现在是答案
第一个问题
内容打印代表内容
打印内容打印内容
第二个问题
UTF-8字符串是字节字符串str。您可以通过编码unicode来获得它们:
是的,encode将unicode转换为str
str可以是utf-8,但不一定是
第三项质询
为什么我这样做的时候汉字会变成utf-8码。拆分
他们一直都是utf-8
B我想fw.write'{0}'。formatcontent_list.decode'utf-8'可以工作
内容列表不是字符串。这是一份清单。当列表转换为字符串时,将使用其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']
最后一份打印的reprlist包含reprstr。您针对的是什么版本的Python?@PatrickHaugh python2.7.12您针对的是什么版本的Python?@PatrickHaugh python2.7.12但在我退出vim时,它仍然显示['\xe4\xbd\xa0\xe5\xa5\xbd','\xe4\xb8\xad\xe5\x9b\xbd','Hello',China',1',2',3'],“wb”并写入“{0}”。formatcontent_list.encode到文件中,但当我vim out.TESTtry fw=open'out.TEST','wb'并写入“{0}”时,它仍然显示['\xe4\xb8\xad\xe5\x9b\xbd',Hello',China',1',2',3']