2016-12-03 5 views
0

私はこの形式の文字列を持つファイルを持っています:.B:13 & A:4 & I:1 & I :! & H:| - | & H:} {& B:3 & H:[ - ] & &テキストファイル内の指定された文字列から辞書を作成します。

これは始まります "" 、「&」で終わる「&」で、各エントリのキーと値のペアを分離し、最終的にそれに対応する値から各キーを分離「:」
これは私がこれまで持っているものです。

//読みますデータ
filehndl = open("text.dat") filedata = filehndl.read() filehndl.close()

しかし、私はどのようにデータを分割して辞書を作成するか分からない。どんな助けもありがとう!

+3

'python split'' python dictをlistから検索して検索すると、多くの解決策があります。 –

答えて

1

あなたがして、最初と最後の文字を削除することができます。そして、スプリット

filedata = filedata[1:-1] 

entries = filedata.split('&') 

は次にアップエントリを分割し、辞書に入れ:

out_dict = {} 
for entry in entries: 
    entry_array = entry.split(':') 
    out_dict[entry_array[0]] = entry_array[1] 

だから全部あなたが持っている

filehndl = open("text.dat") 
filedata = filehndl.read() 
filedata = filedata[1:-1] 

entries = filedata.split('&') 

out_dict = {} 
for entry in entries: 
    entry_array = entry.split(':') 
    out_dict[entry_array[0]] = entry_array[1] 

# out_dict is what you now want to work with 

filehndl.close() 
+0

ありがとう!もう一度簡単に質問すると、out_dictで範囲外のエラーが出ています。[entry_array [0]] = entry_array [1] – Sakizzle

+0

私はあなたが他の回答から考え出したと思っていますが、 :2番目から最後のアンパサンドも取り除かなければならなかったので、3番目の行は 'filedata = filedata [1:-1]'でなければなりません。 –

+0

私はまだ最後の行のIndexErrorを取得している理由について少し混乱していますforループの部分は – Sakizzle

0

私はあなたのファイルはただ1つのラインを持っており、あなたが引用扱いされていないことを仮定するつもりですので、あなたはジェネレータの理解とそれを行うことができます。

with open("yourfile.txt") as file: 
    data = file.read().strip() 
    if data.startswith(".") and data.endswith("&"): 
     clean = data.lstrip(".").rstrip("&") 
     print dict(item.split(":") for item in clean.split("&")) 

ここで重要なライン、次のとおりです。これは

dict(item.split(":") for item in clean.split("&")) 

&文字で、あなたの文字列を分割しようとした後、最終的には辞書にリストを「変換」するために、:文字によって再び分割されます。

1

1ライナーのバージョンは、あなたのFILEDATAは1つのライナーも

第一は:

filedata = r'.B:13&A:4&I:1&I:!&H:|-|&H:}{&B:!3&H:[-]&&' 
d = dict(i.split(':') for i in filedata.strip('.&\r\n').split('&')) 
# {'A': '4', 'I': '!', 'B': '!3', 'H': '[-]'} 
により、キーと値のペアを分割する辞書を構築し、その後、 .&オフストリップ後 &でdictの項目を分割されますと仮定します

しかし、これは同じキーを持つ繰り返し項目には気をつけません。例えば、Bというキーを繰り返した場合、後でB:!3は前の値を上書きしますB:13

関連する問題