2017-08-10 19 views
0

IDと値を持つ複数の* .txtファイルがあり、一意の辞書を作成したい。しかし、いくつかのファイルではいくつかのIDが繰り返されていますが、そのIDについては値を連結したいと思っています。これは2つのファイルの例です(しかし、私はglob.globが必要だと思うので、私はたくさんのファイルを持っています):(特定のファイル内のすべての '値'が同じ長さを持つので、 ' - 'をLEN(値)が欠落している何回複数のテキストファイルから辞書マッピングを作成する

ファイル1

ID01 
Hi 
ID02 
my 
ID03 
ni 

ファイル2

ID02 
name 
ID04 
meet 
ID05 
your 

欲望出力:(なしの繰り返しIDがない場合、私は追加したいことに注意してください " Na 'または' - '、連結するlen(値))これは私の出力です:

ID01 
Hi---- 
ID02 
myname 
ID03 
ni---- 
ID04 
--meet 
ID05 
--your 

出力を辞書に保存したいだけです。さらに、私はファイルが開いているときに印刷するかどうか、私はどちらのファイルが他のファイルの後に開かれているのかを知ることができましたか? 「 - 」時にIDが繰り返されていません(私はこれまでのところ、私の値を連結することはできません)

output={} 
list = [] 
for file in glob.glob('*.txt'):   
    FI = open(file,'r') 
    for line in FI.readlines(): 
     if (line[0]=='I'):  #I am interested in storing only the ones that start with I, for a future analysis. I know this can be done separating key and value with '\t'. Also, I am sure the next lines (values) does not start with 'I' 
      ID = line.rstrip() 
      output[ID] = '' 
      if ID not in list: 
       list.append(ID)  
     else: 
      output[ID] = output[ID] + line.rstrip() 

    if seqs_name in list: 
     seqs[seqs_name] += seqs[seqs_name] 

    print (file) 
    FI.close() 


print ('This is your final list: ') 
print (list) #so far, I am getting the right final list, with no repetitive ID 
print (output) #PROBLEM: the repetitive ID, is being concatenated twice the 'value' in the last file read. 

はまた、どのように追加するには:

これは私が持っているものでしょうか?私はあなたの助けに大変感謝します。

要約:別のファイルでキーが繰り返されるときに値を連結できません。そしてキーが繰り返されない場合は、 ' - 'を追加したいので、後でファイル名を印刷して、特定のIDに値がないファイルを知ることができます。

答えて

0

既存のコードに問題のカップル:

  1. line[0] == 'ID':文字を返すline[0]ので、この比較は常にfalseです。代わりにstr.startswidth(xxx)を使用して、文字列がで始まるかどうかを確認してください。

  2. IDの後のテキストは正しく検索されていません。これを行う最も簡単な方法は、next(f)を呼び出すことです。

  3. 2番目のリストは必要ありません。また、変数名にはlistという名前は付けないでください。


import collections 

output = collections.defaultdict(str) 
for file in glob.glob('*.txt'):   
    with open(file, 'r') as f: 
    for line in f: 
     if line.startswith('ID'): 
      try: 
       text = next(f) 
       output[line.strip()] += text.strip() + ' ' 
      except StopIteration: 
       pass 

print(output) 

それはtry-exceptを使用して、奇妙な例外をキャッチするために痛いことはありません。

+0

ok、あなたの新しいバージョンは動作しています:)どうもありがとうございます! – gusa10

+0

値が連結されていないときに ' - 'または 'Na'を追加するとどうなりますか? – gusa10

+0

@ gusa10スレッドごとに1つの質問;)助けがあれば、これを受け入れることができます。 Naを追加するには、テキストを取得し、テキストがIDで始まるかどうかを確認する必要があります。つまり、実際のテキストが欠落しています。 –

関連する問題