2016-8-5
import,from...import的区别
python中如果要导入一个库,通常有两种方法:
import modulename
或者
from modulename import ...
这两种方法。第一种方法会导入这个模块中所有定义的对象,第二种则不会,使用方式上两者也有区别:
第一种,以使用socket模块中socket()为例子,该函数能创建一个socket对象
>>>import socket
>>>socket
<module 'socket' from 'C:\Python27\lib\socket.pyc'>
>>>socket.socket
<class 'socket._socketobject'>
>>> socket.socket()
<socket._socketobject object at 0x00000000032982B8>
可以看到,如果只使用import socket
,在调用socket()
时,需要再前面再加上模块的名字,单独调用会产生如下错误:
>>>>>> socket()
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
socket()
TypeError: 'module' object is not callable
很显然,由于模块名字和函数名字重名,解释器认为这个模块对象是无法这样调用的。
第二种方法适合要使用模块中特定的函数和对象时,这样更加准确,不容易出错。
>>>from socket import socket
>>>socket
<class 'socket._socketobject'>
>>>socket()
<socket._socketobject object at 0x0000000002E2F0B0>
这样可以直接调用socket()
函数,不用担心出错了。
总结:在调用包含重名函数的模块,自己编写的模块时,最好采用from ... import ...
的形式。对于自己编写的模块,from
后面跟随的是.py文件的文件名。
注:另外一种解释是,采用from...import...
形式的引用会直接将import后面的模块引用到本地命名空间,python会优先搜索本地命名空间中的模块,所以,如果对于常用的模块可以采用from...import...
的调用方式
2016-12-15
python中的编码问题
在处理文本数据,爬取网页数据,处理json请求时,编码是经常碰到又让人头疼的问题, 因此在这里记录几个常见错误
-
python IDLE的编码方式: 在2系列的版本中,IDLE采用ascii的编码方式,而3系列的采用utf-8的方式编码,要查看当前系统编码方式,可以有如下方法:
>>> import sys >>> sys.getdefaultencoding() 'ascii'
-
在头部声明编码: 如果不使用:
#coding:....
声明编码方式,那么在代码中出现的字符将由默认的编码方式编码,当需要使用英文以外的字符时,经常会出现编码转换错误,最常见的错误是这种:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
另外,不指定编码方式,也会出现.py文件无法保存的现象。
- 编码识别:
可以借助chardet包来帮助判断字符串的编码方式,但是碰到中文字符不太准确。
>>> a = "中文" >>> a '\xd6\xd0\xce\xc4' >>> detect(a) {'confidence': 0.682639754276994, 'encoding': 'KOI8-R'} >>> a = 'ccc' >>> detect(a) {'confidence': 1.0, 'encoding': 'ascii'}
可以看到,在中文编码识别上,只有68%自信,而ascii则有100%
其实还有一种简单方法,直接:
>>> print a.decode('GB2312')
中文
print a.decode('KOI8-R')
жпнд
说明GB2312是pythonIDLE处理中文的编码(貌似gbk也可以??神秘)
-
编码转换: 对于字符串,python提供了
decode()
和encode()
两种方法来进行编码转换,用法如下:#decode()能将其他编码转化为Unicode编码 >>> a = "中文" >>> a '\xd6\xd0\xce\xc4' >>> a.decode('GB2312') u'\u4e2d\u6587' #encode()能将unicode编码转化为其他编码 >>> a = "中文" >>> a '\xd6\xd0\xce\xc4' >>> a = a.decode('GB2312') >>> a u'\u4e2d\u6587' >>> a.encode('utf-8') '\xe4\xb8\xad\xe6\x96\x87'
-
注意事项:
- 如果从其他途径获取的数据编码格式和自己代码编码格式不同,有必要在代码头部进行编码声明或者用
decode()
和encode()
来统一编码。 - 可以先用
decode()
统一编码成unicode格式来处理
- 如果从其他途径获取的数据编码格式和自己代码编码格式不同,有必要在代码头部进行编码声明或者用