python编码的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python编码的问题相关的知识,希望对你有一定的参考价值。

我用os.listdir()获取了一个文件夹的内容,但是直接输出这个list的话就会是乱码,如果用循环输出就是正常的中文。

那个[2:]是因为前两个是 $RECYCLE.BIN 和 360Rec
给python的编码跪了

ot = os.listdir("F:")
print ot

测试了下上面这两条语句,中文命名的文件夹列表显示如下:

['\\xd2\\xf4\\xc0\\xd6', '\\xcd\\xbc\\xc6\\xac']


这不叫乱码,只是以utf-8编码表示中文字符串。你的本意是想要得到['abc', 'bcd', '音乐', '图片']这种形式的输出,但是实际显示却是utf-8编码。

假设我们创建一个列表 ot = ['abc', 'bcd', '音乐', '图片'],并且文件开头定义了以utf-8格式进行编码。那么在内存里列表对象ot存储的是'abc', 'bcd', '\\xd2\\xf4\\xc0\\xd6', '\\xcd\\xbc\\xc6\\xac'这四个值。


    为什么英文字符还是英文,中文字符就变成“乱码”了呢?因为计算机不是人,它是看不懂'音乐'和'图片'这几个汉字字符的,它只认识字符的编码值。对于多种编码来说,键盘上那些英文字符编码值都是一样的。中文则不一样。


    为什么打印字符串显示出了中文,打印列表的时候显示的却是utf-8编码?print 的作用是把计算机可理解的对象以人类可以理解的方式打印出来,具体显示结果跟你要打印的对象有关,打印的是字符串,显示的就是人类语言表示的字符串对象,打印的是列表,显示的就是列表对象本身,也即该列表里存储的值。


print ot 表示打印一个列表对象ot,打印的是列表本身,所以它里面的项以什么形式存储的就以
什么形式显示。

追问

讲的非常好,基本懂了。如果我把中文打印出来,存储进字典中,还会是utf-8编码吗?

追答

打印字符串不会改变原来的字符串对象,一个确定编码的字符串,在处理过程中如果不主动对它进行转码,它的编码是不会改变的。

追问

噢,讲得很好,已经有点理解了

参考技术A python2默认编码是ascii,如果你在文件顶部添加# -*- coding: utf-8 -*-,会转成utf8,
通过字符串前面添加u,如u“中国”,可以转成unicode.

python3默认unicode
参考技术B 你好:
编码的问题确实头疼;
我在博客园摘抄了一些编码问题;
这个问题主要是因为:
print 是将字符串转化为系统的编码输出。
而list存储的你设置的编码。追问

如何以正确的编码,存储为列表?

追答

那你就得知道你的编码的格式;
进行先解码,再编码!

python抓网页的编码问题

小弟刚接触python,抓第一个网页就过不去编码这个坎`请高手赐教,代码如下:

#coding = gb2312
import urllib2
from BeautifulSoup import BeautifulSoup

outfile = open("lsxk.txt", "w")
for i in range(1,2): #第一页
url= "http://bbs.scu.edu.cn/wForum/disparticle.php?
boardName=SCUExpress&ID=1735295349&pos=-1&page=%d" % i
doc = urllib2.urlopen(url).read()
soup = BeautifulSoup(doc,fromEncoding="gb2312")
print >> outfile,doc #输出到文本
outfile.close()

抓到txt中的内容是中文,但使用beautifulSoup后就乱码了`
BS的文档说使用soup = BeautifulSoup(doc, fromEncoding="gb2312"),
还是不能正确编码.print出来报错是gb2312和utf-8不能编码网页中的某些字符.

单独使用编码也不能解决:
import codecs
print open("lsxk.txt").read().decode("utf-8")

可能说的不是很清楚`以上是我遇到的问题们,还请高手帮帮忙,不甚感谢!

BeautifulSoup 版本有问题,使用3.03就可以了

import urllib2
from BeautifulSoup import BeautifulSoup

f = urllib.urlopen('http://www.baidu.com')

html=f.read()
f.close()
soup = BeautifulSoup()
soup.feed(html)
print soup
参考技术A BeautifulSoup() 不能直接 指定 编码

还有编码尽量 用GB18030 不要用GBK

以上是关于python编码的问题的主要内容,如果未能解决你的问题,请参考以下文章

python抓网页的编码问题

python编码的问题

原创python中文编码问题深入分析:python2.7文件读写中文编码问题

python编码问题

从python2,python3编码问题引伸出的通用编码原理解释

url编码问题在python中怎么解决