python写文件处理编码

MMM*_*VII 1 python unicode encoding utf-8 character-encoding

我糊涂了.我需要帮助!!!我正在处理一个包含中文字符的文件,例如,让我们调用它a.TEST,这就是里面的内容.

?? ?? Hello China 1 2 3
Run Code Online (Sandbox Code Playgroud)

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

这是第一个问题:为什么python shell会在我输入时给出我的utf-8信息,同时cmd可以输出我想看到的表单?contentcontentprint content

第二个问题:什么之间的区别unicodestr?有人告诉我,这encode是转换unicodestr,但我从Unicode HowTo告诉我encode转换unicodeutf-8

还没结束!:)

这是 test.py

#!/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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

第三个问题:为什么汉字变成utf-8代码.split()呢?

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

zvo*_*one 6

什么是编码

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

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

Strings如何代表

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

>>> '\x41\x42\x43'
'ABC'
Run Code Online (Sandbox Code Playgroud)

'\x41\x42\x43'是完全一样的'ABC'.Python将始终使用更易读的文本表示('ABC')来表示字符串.

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

>>> '\x00\x01\x02\x03\x04'
'\x00\x01\x02\x03\x04'
Run Code Online (Sandbox Code Playgroud)

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

>>> '\x0a\x0d\x09'
'\n\r\t'
Run Code Online (Sandbox Code Playgroud)

不同的编码

ASCII表定义数字0-127的含义,仅包括英文字母.数字128-255未定义.因此,其他编码定义了128-255的含义.然而其他人改变了整个范围0-255的含义.

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

例如,字符185(0xB9)采用?windows-1250编码,但š采用iso-8859-2编码.

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

>>> print '\xb9'
?
Run Code Online (Sandbox Code Playgroud)

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

>>> '\xb9'
'\xb9'
Run Code Online (Sandbox Code Playgroud)

也:

>>> '?'
'\xb9'
Run Code Online (Sandbox Code Playgroud)

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

如果变量在没有cosole的情况下是enteren,print则打印其表示.它与以下内容相同:

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

什么是Unicode?

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'
Run Code Online (Sandbox Code Playgroud)

关于utf-8的好处是整个ASCII范围不变,只要使用ASCII,每个字符只使用一个字节:

>>> u'abcdefg'.encode('utf-8')
'abcdefg'
Run Code Online (Sandbox Code Playgroud)

Python 2中的Unicode

重要:这是Python 2特有的.Python 3是不同的.

str作为字节串的对象不同,unicode对象是unicode字符串.

它们可以编码为str选定的编码,或者从str选择的编码中解码.

u在开头报价之前使用unicode字符串.内部字符使用当前编码进行解释,或者可以使用数字格式指定\uHEX:

>>> u'ABCD'
u'ABCD'
>>>
>>> u'\u0041\u0042\u0043'
u'ABC'
>>> u'šâ?'
u'\u0161\xe2\u016f'
Run Code Online (Sandbox Code Playgroud)

现在的答案

第一个问题

  • contents 版画 repr(contents)
  • print contents 版画 contents

第二个问题

UTF-8字符串是字节字符串(str).你通过编码得到它们unicode:

>>> u'\u0161'.encode('utf-8')
'\xc5\xa1'
>>> '\xc5\xa1'.decode('utf-8')
u'\u0161'
Run Code Online (Sandbox Code Playgroud)

是的,encode转换unicodestr.该str可以是utf-8,但它并没有要.

第三个问题

A) "当我做.split()时为什么汉字会变成utf-8代码?"

他们一直都是utf-8.

B) "我认为fw.write('{0}'.format(content_list).decode('utf-8'))将起作用"

content_list不是一个字符串.这是一个清单.当列表转换为字符串时,它是使用它完成的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']
Run Code Online (Sandbox Code Playgroud)

最后一个打印的repr(列表),其中包含repr(str).