初看這個方法還挺好用的,用來切割字符串真是的是非常方便,返回的字符串數組也非常容易處理。
於是乎看了一眼就應用到我的程序當中去了。
用來切割如下形式的字符串
s = 'Jul 24 21:38:25 luozw medusa.py[24707]: HOST=192.168.50.77 LOGIN=root PASSWORD=123456 SERVICE=ssh PORT=22'
month = s.split(' ')[0] #取月份
day = s.split(' ')[1] #取天數
……
成功的運行了。
后來設置到crontab中自動運行,也能成功運行,可是到了8月份的時候結果就不正常了。
自己跑到八月份的日志文件里看
Aug 1 21:38:25 luozw medusa.py[24707]: HOST=192.168.50.77 LOGIN=root PASSWORD=123456 SERVICE=ssh PORT=22
日志格式看起來也沒問題,然后不得已去調試源程序,發現切割的字符串亂七八糟的。
將s.split(' ')直接打印出來看,馬上就明白了:
['Aug', '', '2', '21:38:25', 'luozw', 'medusa.py[24707]:', 'HOST=192.168.50.77', 'LOGIN=root', 'PASSWORD=123456', 'SERVICE=ssh', 'PORT=22']
數組第二個元素是一個空字符串,它代表了一個空格,原來spilt方法是嚴格按照過濾參數設置的,不會感知連續過濾的參數。
Jul 24之間相距一個空格,但是Aug 1之間就相距兩個空格,所以切割失敗,導致后來取得數據發生錯誤。
此時有兩個解決辦法:
1.采用不帶參數的split(),它會把所有空格(空格符、制表符、換行符)當作分隔符。
2.filter(None, s.split(' '))
第二種方法應用場景更多一些。
看看這個例子
a = 'hello++world!+'
如何取得'hello'和'world'呢?
>>>a.split('+')
['hello', '', 'world!', ''] #含有兩個空字符串
>>>filter(None, a.split('+'))
['hello', 'world!']
關於filter()方法的使用說明:
filter(...)
filter(function or None, sequence) -> list, tuple, or string
Return those items of sequence for which function(item) is true. If
function is None, return the items that are true. If sequence is a tuple
or string, return the same type, else return a list.
總結的經驗:對函數方法的使用不要過於想當然了,文檔簡易可得的話最好把函數說明看完。