Python学习笔记

Posted by rogerclarkgc on 周五 05 八月 2016

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'
    
  • 注意事项:

    1. 如果从其他途径获取的数据编码格式和自己代码编码格式不同,有必要在代码头部进行编码声明或者用decode()encode()来统一编码。
    2. 可以先用decode()统一编码成unicode格式来处理

tags: python