Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理编码的python写文件_Python_Unicode_Encoding_Utf 8_Character Encoding - Fatal编程技术网

处理编码的python写文件

处理编码的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() &

我很困惑。我需要帮助!!! 我正在处理一个包含中文字符的文件,例如,让我们称之为.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码。拆分

我还以为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']