2

私はこのテキストファイルを持っています

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辞書に変換したい。どうやってやるの。

また、複数の値の場合、どうすればよいか混乱しています。

MIME タイプからファイル拡張子を取得したい

したがって、基本的に複数の値の場合、最初の値を取得したいと考えています。

例えば

mydict['image/jpeg']戻るべきjpeg

これは私がしたことです

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
4

2 に答える 2

3

編集:更新ごとに、あなたは非常に近いです-問題は次の行によるものです:

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

ご存じのように、2 つの項目を持つ任意の要素に対しては問題なく機能しますが、複数の項目がある場合に問題が発生します。例えば:

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

何が起こっているかというと、3 つの項目のリストを使用して 2 つの変数を割り当てようとしているということです。これにより、そのエラーが発生します。コードでできることの 1 つは、次のようにして、返されるリストを制限して 2 つのアイテムのみを返すことです。

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

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

In [9]: print k, v
one two

一般的な考え方は、辞書を作成し、ファイルを開き、各行で末尾の改行を取り除き、空白で分割し、結果のリストの最初の 2 つの要素を取得することです。

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
于 2012-12-31T03:31:17.550 に答える
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']

各行を " " で分割し、リスト内の "" を削除しています。次に、ディクショナリに値を割り当てます。

于 2012-12-31T03:44:47.707 に答える