2012-12-31 65 views
2

分割文本文件我有這個文本文件我怎麼可以在dictonary在python

application/andrew-inset      ez 
application/applixware       aw 
application/atom+xml       atom 
application/atomcat+xml       atomcat 
application/atomsvc+xml       atomsvc 
application/ccxml+xml       ccxml 
application/cdmi-capability      cdmia 
application/cdmi-container      cdmic 
image/jpeg          jpeg jpg jpe 

,我想在轉換到Python dictonary鍵值對。 我該怎麼做。

我也很困惑,如果有多個值我應該怎麼做。

我想從mime類型

得到的文件擴展名

所以基本上在多重價值的情況下,我想第一個。

E,G

mydict['image/jpeg']應該返回jpeg

這是我TREID

import shlex 
f = open("mimetypes.txt","r") 
mydict = dict() 
for line in f: 
     k,v = shlex.split(line.strip()) 
     mydict[k.strip()] = v.strip() 

f.close() 
f2 = open("mimetest.txt","w") 
f2.write(mydict) 
f2.close() 

和我得到這個

Traceback (most recent call last): 
    File "makedict.py", line 5, in <module> 
    k,v = shlex.split(line.strip()) 
ValueError: too many values to unpack 
+2

這很簡單。你有什麼嘗試? –

+0

更新的問題 – user19140477031

回答

3

編輯:根據您的更新,你很親密Ë - 這個問題是因爲該行的:

k,v = shlex.split(line.strip()) 

如你所知,它工作正常,兩個項目的任何元素,但是當你有一個以上的問題就來了。例如:

In [1]: import shlex 

In [2]: line = 'one two' 

In [3]: k,v = shlex.split(line.strip()) 

In [4]: print k, v 
one two 

In [5]: line = 'one two three' 

In [6]: k,v = shlex.split(line.strip()) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 

/<ipython console> in <module>() 

ValueError: too many values to unpack 

發生了什麼事情是,您正試圖使用​​三個項目列表分配兩個變量,這會給您那個錯誤。有一兩件事你可以在你的代碼做的是限制返回列表中做這樣的事情只返回兩個項目:

In [7]: line = 'one two three' 

In [8]: k,v = shlex.split(line.strip())[:2] 

In [9]: print k, v 
one two 

總的想法是創建一個字典,打開該文件,然後在每一行,去掉尾隨換行符,分割上的空白,並採取結果列表中的前兩個元素:

In [5]: d = {} 

In [6]: with open('mime.txt', 'rb') as f: 
    ...:  for line in f: 
    ...:   mime, val = line.strip().split()[:2] 
    ...:   d[mime] = val 
    ...:   
    ...:   

In [7]: d 
Out[7]: 
{'application/andrew-inset': 'ez', 
'application/applixware': 'aw', 
'application/atom+xml': 'atom', 
'application/atomcat+xml': 'atomcat', 
'application/atomsvc+xml': 'atomsvc', 
'application/ccxml+xml': 'ccxml', 
'application/cdmi-capability': 'cdmia', 
'application/cdmi-container': 'cdmic', 
'image/jpeg': 'jpeg'} 

In [8]: d['image/jpeg'] 
Out[8]: 'jpeg' 

如果你需要存儲所有的項目,你可以這樣做:

In [1]: d = {} 

In [2]: with open('mime.txt', 'rb') as f: 
    ...:  for line in f: 
    ...:   line = line.strip().split() 
    ...:   d[line[0]] = line[1:] 
    ...:   
    ...:   

In [3]: d 
Out[3]: 
{'application/andrew-inset': ['ez'], 
'application/applixware': ['aw'], 
'application/atom+xml': ['atom'], 
'application/atomcat+xml': ['atomcat'], 
'application/atomsvc+xml': ['atomsvc'], 
'application/ccxml+xml': ['ccxml'], 
'application/cdmi-capability': ['cdmia'], 
'application/cdmi-container': ['cdmic'], 
'image/jpeg': ['jpeg', 'jpg', 'jpe']} 

這包括所有的MIME類型,所以如果你只是想第一個,你可以打電話給定類型的值的第一個元素:

In [4]: d['image/jpeg'][0] 
Out[4]: 'jpeg 
+1

很明顯,OP甚至沒有嘗試自己做這個,你不應該只是發出這樣的答案。 –

+0

@HunterMcMillen我在這方面看到了不同的觀點,我通常會傾向於提供任何方向,希望OP能從中獲得一些有用的信息。我知道遠比這個網站上的大多數人都少,所以我一定知道被卡在什麼地方並不知道該去哪裏是什麼感覺。對某些人來說這可能很簡單,但對於剛剛學習它的人來說可能會更困難一些。 – RocketDonkey

+0

我已經嘗試了一些東西,我會發布上面,看看我錯在哪裏 – user19140477031

0

另一種方法是這樣的:

dic = {} 
file = open("filename","r") 
contents = file.readlines() 
for content in contents: 
    value = filter(lambda a: a !='',content.split(" ")) 
    dic[value[0]] = value[1] 
file.close() 
print dic['image/jpeg'] 

我們按「」分割每一行,然後刪除列表中的任何「」。然後我們給詞典賦值。