天天看点

Python入门(三)

Subsections

日志

编码

字符串

列表和字典

一、日志

#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Created on 2013-4-26
@author: chenll
日志等级
NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级 输出
'''


import logging  

# 创建一个logger  
logger = logging.getLogger('Log')  
logger.setLevel(logging.DEBUG)  
 
# 创建一个handler,用于写入日志文件  
fh = logging.FileHandler('test.log')  
fh.setLevel(logging.DEBUG)  
  
# 再创建一个handler,用于输出到控制台  
ch = logging.StreamHandler()  
ch.setLevel(logging.DEBUG)  
  
# 定义handler的输出格式  ,时间-类名-等级名称-日志内容
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  
fh.setFormatter(formatter)  
ch.setFormatter(formatter)  
  
# 给logger添加handler  
logger.addHandler(fh)  
logger.addHandler(ch)  
   
# 记录一条日志  
logger.info('building table')      

控制台和test.log 输出:

2013-04-26 10:40:46,381 - Log - INFO - building table

二、编码

python 中字符串分两种:一种是byte string ,一种是unicode string

py文件默认是ASCII编码,中文在显示时会做一个ASCII到系统默认编码的转换,这时就会出错:SyntaxError: Non-ASCII character。需要在代码文件的第一行或第二行添加编码指示#coding=utf- 8 所有的中文ex:myName="陈" 都会宣告成utf-8 编码的byte string.

一般python 预设编辑器是ascii ,如果需要更改,操作如下:

importsys

reload(sys)

sys.setdefaultencoding (' utf-8')

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码代码中字符串的默认编码与代码文件本身的编码一致。

1. Unicode 对任何语言文字,都是 1个字符1个编码,所以“hi!”是3个Unicode字符,“你好!”也是3个Unicode字符。

2. UTF-8 用3个字符来表示1个中文字符,用1个字符来表示英文字符。所以,“hi!”是3个UTF-8字符,“你好!”是7个UTF-8字符。

3. GBK 用2个字符来表示1个中文字符,用1个字符来表示英文字符。所以,“hi!”是3个GBK字符,“你好!”是5个GBK字符。

4. decode方法,是任何字符串具有的方法,将字符串转换成unicode格式,参数是源字符串的编码代号。

5. encode 方法,任何字符串具有的方法,将字符串转换成参数指定的格式,参数是目标编码代号。

三、字符串常用操作

#!/usr/bin/python
#-*- coding: utf-8 -*-
'''
Created on 2013-4-30

@author: chenlly
'''
#复制字符串
#strcpy(sStr1,sStr2)
sStr1 = 'strcpy'
sStr2 = sStr1
sStr1 = 'strcpy2'
print sStr2

#连接字符串
#strcat(sStr1,sStr2)
sStr1 = 'strcat'
sStr2 = 'append'
sStr1 += sStr2
print sStr1

#查找字符
#strchr(sStr1,sStr2)
# < 0 为未找到
sStr1 = 'strchr'
sStr2 = 'ch'
nPos = sStr1.index(sStr2)
print nPos

#查找字符串
#strchr(sStr1,sStr2)
sStr1 = 'abcdefg'
sStr2 = 'cde'
print sStr1.find(sStr2)

#扫描字符串是否包含指定的字符
#strspn(sStr1,sStr2)
sStr1 = '12345678'
sStr2 = '456'
print len(sStr1 and sStr2)

#比较字符串
#strcmp(sStr1,sStr2)
#sStr1 == sStr2:0
#sStr1 > sStr2:1
#sStr1 < sStr2:-1
sStr1 = 'strchr'
sStr2 = 'strch'
print cmp(sStr1,sStr2)

#字符串长度
#strlen(sStr1)
sStr1 = 'strlen'
print len(sStr1)

#将字符串中的大小写转换
#strlwr(sStr1)
sStr1 = 'JCstrlwr'
sStr1 = sStr1.upper()
sStr1 = sStr1.lower()
print sStr1

#追加指定长度的字符串
#strncat(sStr1,sStr2,n)
sStr1 = '12345'
sStr2 = 'abcdef'
n = 3
sStr1 += sStr2[0:n]
print sStr1

#字符串指定长度比较
#strncmp(sStr1,sStr2,n)
sStr1 = '12345'
sStr2 = '123bc'
n = 3
print cmp(sStr1[0:n],sStr2[0:n])

#复制指定长度的字符
#strncpy(sStr1,sStr2,n)
sStr1 = ''
sStr2 = '12345'
n = 3
sStr1 = sStr2[0:n]
print sStr1

#将字符串前n个字符替换为指定的字符
#strnset(sStr1,ch,n)
sStr1 = '12345'
ch = 'r'
n = 3
sStr1 = n * ch + sStr1[3:]
print sStr1

#扫描字符串
#strpbrk(sStr1,sStr2)
sStr1 = 'cekjgdklab'
sStr2 = 'gka'
nPos = -1
for c in sStr1:
    if c in sStr2:
        nPos = sStr1.index(c)
        break;
print nPos

#翻转字符串
#strrev(sStr1)
sStr1 = 'abcdefg'
sStr1 = sStr1[::-1]
print sStr1

#分割字符串
#strtok(sStr1,sStr2)
sStr1 = 'ab,cde,fgh,ijk'
sStr2 = ','
sStr1 = sStr1[sStr1.find(sStr2) + 1:]
print sStr1

#或者
s = 'ab,cde,fgh,ijk'
print(s.split(','))

#连接字符串
delimiter = ','
mylist = ['Brazil', 'Russia', 'India', 'China']
print delimiter.join(mylist)

#只显示字母与数字
def OnlyCharNum(s,oth=''):
    s2 = s.lower();
    fomart = 'abcdefghijklmnopqrstuvwxyz0123456789'
    for c in s2:
        if not c in fomart:
            s = s.replace(c,'');
    return s;

print(OnlyCharNum("中国a000 aa-b"))      

四、字典和列表

dict

采用键值对(key-value)的形式存储数据。python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。可哈希表示key必须是不可变类型,如:数字、字符串、只含不可变类型元素的元组(1,2,3,’abc’)

len(a) 得到字典a中元素的个数
a[k] 取得字典a中键K所对应的值
a[k] = v 设定字典a中键k所对应的值成为v
del a[k] 使用 key从一个 dictionary中删除独立的元素。如,删除Dictionary dic中的user=’root’:del dic[“user”]
a.clear() 从一个 dictionary中清除所有元素。如,删除Dictionary dic中的所有元素:dic.clear()
a.copy() 得到字典副本
k in a 字典中存在键k则为返回True,没有则返回False
k not in a  字典中不存在键k则为返回true,反之返回False
a.has_key(k) 判断字典a中是否含有键k
a.items() 得到字典a中的键—值对list
a.keys() 得到字典a中键的list
a.update([b]) 从b字典中更新a字典,如果键相同则更新,a中不存在则追加.
a.fromkeys(seq[, value]) 创建一个新的字典,其中的键来自sql,值来自value
a.values() 得到字典a中值的list
a.get(k[, x]) 从字典a中取出键为k的值,如果没有,则返回x
a.setdefault(k[, x]) 将键为k的值设为默认值x。如果字典a中存在k,则返回k的值,如果不存在,向字典中添加k-x键值对,并返回值x
a.pop(k[, x]) 取出字典a中键k的值,并将其从字典a中删除,如果字典a中没有键k,则返回值x
a.popitem() 取出字典a中键值对,并将其从字典a中删除
a.iteritems() 返回字典a所有键-值对的迭代器。
a.iterkeys() 返回字典a所有键的迭代器。
a.itervalues() 返回字典a所有值的迭代器。
#!/usr/bin/python
#-*- coding: utf-8 -*-

'''
Created on 2013-4-21

@author: chenlly
'''

def disPlay(dict):
    for key in dict:
        print key + "," + dict[key]
        
def dicFun():
    #dict2 = dict();
    dict2 = {'name':'chen','port':'8809'}
    #遍历字典
    disPlay(dict2)
    print '---end disPlay---'
    #新增数据项
    dict2['ip'] = '198.164'
    disPlay(dict2)
    print '---end add---'
    #修改数据项
    dict2['name'] = 'laoben'
    disPlay(dict2)
    print '---end edit---'
    #删除已经存在的数据项
    del dict2['name']
    disPlay(dict2)
    print '---end remove---'
    

    
def main():
    dicFun();
    
if __name__ == "__main__":
    main();