最近在讀《Head First Python》,只是對最近學習的內容做一個小總結。最近遇到了字符串分割,在實際操作的過程中,遇到了一些錯誤,於是就自己遇到的問題做了一個總結。
在書中,對於函數split()的總結順序是:
1.基礎用法-->2.當用於分割的依據有多個時,出現錯誤,怎麼保證分割。-->3.當沒有出現分割字符時,怎麼處理。-->4.對於文件出現錯誤,用try,except串進行統一處理。
我按照自己在其中實際操作遇到的問題順序進行整理,順序爲:
1.正常分割-->2.沒有出現用於分類的字符。-->3.按空格分類出現錯誤。-->4.對文件的出現的錯誤,用try,except串進行解決。
小馬說:我什麼時候才能過河呢?
老爺爺說:等天亮的時候把。
小馬說 那天亮時什麼時候呢?
爺爺沉默了一下。
爺爺說:太陽升起來的時候天就亮了。
我們發現一個規律,那就是每一個”說“字後面,都接着一句話,我們可以根據冒號:來作爲分割的依據,將人和說的話進行分開。這就可以用到一個函數split()來進行分割。
上一篇微博中,已經提示過如何更改路徑,在上一次的基礎上,我們繼續本次的學習。
上一次的代碼爲:
import os #引入包
>>>os.getcwd() #getcwd()方法是獲取當前目錄
結果:
>>>os.getcwd() #getcwd()方法是獲取當前目錄
>>> os.chdir('C:\Users\moli\Desktop') #更改目錄,寫的是絕對路徑。
>>> os.getcwd() #獲取當前路徑。
'C:\\Users\\moli\\Desktop' #當前路徑是C盤目錄下,Users目錄,Users目錄是默認目錄,moli是
>>> os.chdir('../Desktop/first')
原來的文件夾是C盤的python27,即:'C:\\Python27'。
更改過後的文件夾是C盤的Users文件夾下面的Desktop/first。
在first文件夾下面,有一個test.txt文件,文件內容爲:
1.idhiasdb jolc cjl dnd dd dndjd
2.zsdcbj dfchdkc cndjkchs c c
3.cbkjd clkj chdjbcndvi jcjlkv
4.dhck idlhv nvkldhv voidjlv vlkdj
5.ckd cjl cdl czxkn clsjc ldcjod
6.cdb cdkjc cdjc lsjdl codjfo cjdlv
7.cdk ldjvl dlk;v jv]ovm
8.cdk ;dkfc djdf dlfn
只有8行文件。
1.正常分割
用於分割的代碼:
data = open('test.txt') #打開文件test.txt
for each_line in data: #一行一行讀入數據
(role, line_spoken ) = each_line.split('.') #按.分串,因爲分成兩部分,所以傳入參數爲兩個。
print(role) #打印出兩個串,串之間加入said:作爲分割。
print('said:')
print(line_spoken)
結果正確。
2.某些行不包含分割條件
當第一行的.變爲:輸入此代碼報錯:
Traceback (most recent call last):
File "<pyshell#181>", line 2, in <module>
(role, line_spoken ) = each_line.split('.',1)
ValueError: need more than 1 value to unpack
錯誤:需要一個值來解壓(ValueError: need more than 1 value to unpack)
錯誤原因:因爲第一行沒有符號“.”所以無法分割,所以沒有值傳入,所以報錯。
更改方法:
1.將第一行的冒號改爲句號,但是這顯然不解決問題。
2.只能增加判斷,用到find()方法,當find(':')返回值爲-1,表示沒有找到,則該行不作爲分割。代碼及運行結果如下:
data.seek(0)
for each_line in data:
if not each_line.find('.') == -1:
(role, line_spoken ) = each_line.split('.')
print(role)
print('said:')
print(line_spoken)
運行結果如下:
2
said:
zsdcbj dfchdkc cndjkchs c c
3
said:
cbkjd clkj chdjbcndvi jcjlkv
4
said:
dhck idlhv nvkldhv voidjlv vlkdj
5
said:
ckd cjl cdl czxkn clsjc ldcjod
6
said:
cdb cdkjc cdjc lsjdl codjfo cjdlv
7
said:
cdk ldjvl dlk;v jv]ovm
第一行不包含運行條件,所以直接跳過,運行第二行。
3.某一行中分割條件包含多個
當我們按照空格進行分割的時候,可能一行中包含多個分割條件。所以產生問題。
解決辦法:
1.split()函數有兩個參數,split( str,maxsplit)方法有兩個參數,str是分類依據,這裏寫爲“ ”,maxsplit表示最大分割次數。當maxsplit=1時,因爲最多分割一次。所以即使有多個分割條件,也只會分割一次。
代碼只更改了一行:
(role, line_spoken ) = each_line.split(' ',1)
表示最多隻分割一次,則運行結果同上。
如果想要分割兩次,則存在風險,首先,有的分割之後會有兩個字符串,有的分割之後會產生三個字符串,則傳入的參數,如果寫兩個(role,line_spoken),則當傳入三個字符串的時候,沒有參數接收。
如果寫三個字符串(role,line_spoken,third),則如果只分割成兩個字符串,第三個沒有值傳入則會報錯。
這個問題目前我還沒有解決。
我們發現很多問題會接踵而至,那麼有沒有一種方法,只讓我們關注到我想要的正確結果上,其餘的都規避不看呢?
4.try-except方法
就像java語言中的try-catch,在python中我們可以使用try-except方法。
輸入代碼:
運行結果同上。
try-except語法:(主意冒號和縮進)
try:
要保護的代碼塊
except:
異常處理
總結如上,歡迎指正。