python之split()使用方法和try-except塊


最近在讀《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 strmaxsplit)方法有兩個參數,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:
   異常處理


總結如上,歡迎指正。














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章