2014-03-13 44 views
1

我想用一個文本文件從xml中獲取數字輸出並將其轉換爲名稱,然後將其寫入單獨的文本文件。我的問題是,名稱有時有空格,我不知道如何處理這個。解析文本文件而不分裂多個詞的名稱

該程序在線訪問多個txt和xml文件,其中的項目由參考編號引用。它將這些文件的信息與我設置的標準進行比較,然後將參考編號添加到列表中。我想要做的是將此參考號碼轉換爲關聯的名稱。我有一個帶有參考數字和名稱的文本文件,並希望使用index()函數來查找參考號,然後將關聯名稱寫入文本文件。我無法解析它,因此我可以進行轉換。我的問題是列表中是這樣寫的:

number name\n 
14  apple\n 
27  anjou pear\n 
36  asian pear\n 
7645  langsat\n 

所以如果我只是用()我結束了一些名字被分割的.split。我嘗試用'\ n'替換數字和名稱之間的空格,然後將其分開,但這也不起作用。如果我用','替換空格,然後拆分,最後得到包含下一行數字['apple \ n15']的名稱,它將兩行文本寫入文本,並留下與我無法分割相同的問題它在白色空間...

任何建議???

我現在已經實施的建議波紋管的快譯通()函數,它的工作原理接受,我仍然有在名稱末尾的\ n ...

ttn = dict() 
f=open('typeid2.txt', 'r') 
    for line in f: 
    number, name = line.split(None,1) 
    ttn[number] = name 

如果我叫ttn['14']我得到'apple\n'

+0

使用ttn [number] .strip()更好地改變line.split(None,1)爲line.strip()。split(None,1) – PyNEwbie

回答

1

正則表達式是非常強大的,有用的,但它需要很多習慣使用他們提供一些權威。我會建議,而不是你堅持與拆分這裏是來自分裂的幫助信息,描述如何使用maxsplit值來限制拆分數量。

Help on built-in function split: 

split(...) 
S.split([sep [,maxsplit]]) -> list of strings 

Return a list of the words in the string S, using sep as the 
delimiter string. If maxsplit is given, at most maxsplit 
splits are done. If sep is not specified or is None, any 
whitespace string is a separator and empty strings are removed 
from the result. 

因此,對於你的代碼,假設你有一些線條分割

mytest = dict() 
for each_line in data: 
    number, name = line.split(None,1) 
    mytest[number] = name 

將返回這樣的事情

mytest的 { '27':「安茹梨','7645':'langsat','號碼':'名字','36':'亞洲梨','14':'蘋果' 訪問他LP假設你有一些字符串的myString則只需鍵入

​​

我第一次嘗試之間的區別,這一個是由於下面的評論。在我的第一次嘗試中,名稱值上的前導空格被保留,但是通過使用None,所有空白字符在第一次拆分時被刪除,因此這更具體地針對您正在尋找的內容。

+0

使用'split(None,1)'代替自動修剪值之間的空白。 – tripleee

+0

#triplee謝謝你學到了新的東西 – PyNEwbie

+0

所以基本上我會用這個來創建一個新的列表然後索引到那個列表?另外,你能否展示如何保存該列表而不是打印它?我有超過8000的條目,所以打印他們都會有點討厭... 我厭倦了做一個例子,但我顯然吮吸使用評論系統... – user3391121

1

您可以使用re.findall()來實現此目的。

input = "number name\n14  apple\n27  anjou pear\n36  asian pear\n7645  langsat\n" 
print re.findall("(\w+)\s+(.+)", input) 

輸出:

[('number', 'name'), ('14', 'apple'), ('27', 'anjou pear'), ('36', 'asian pear'), ('7645', 'langsat')] 
+0

這樣做的確如你所說的那樣,似乎有擺脫了\ n,但我不知道如何搜索它的id號並將其與名稱關聯。我想我將不得不再次分裂它,但它現在是一個元組,所以我遇到了麻煩。任何更多的建議完成此關閉??? (名字數組合現在是單元內的元組,所以如果我說't [1]'它會返回'('14','apple')') – user3391121