2016-08-15 9 views
1

2つのファイルがあります。ソースファイルには1つのID(1行に1つのID)の列が1つしかありません。 2番目のcsvファイルにはIDと追加情報が含まれています。 file2のすべてのレコードに対してfile1の各IDをチェックし、一致するレコードがある場合は一致する行(file1)とfile2の対応する情報を印刷します。2つのcsvファイル間のループは最初のマッハで停止します

ファイルは次のようになります。

出典:

0234906006000 
0234765306000 
0231316005000 
0234906006000 
0212134006000 
0125667806000 
3334906006000 
1778986006000 
0239906006000 

鉱山:私は結果を得るが、私はすべての一致を得ることはありません

import csv 
source = csv.reader(open("denver_source.csv")) 
mine = csv.reader(open("denver_mine.csv")) 
output = {} 
for line in source: 
    print(line[0]) 
    for xline in mine: 
     if line[0] not in xline: continue 
     output[line[0]] = xline 
    print(xline) 
print("Result", output) 

、初回のみ:

02349-34-010-000,Adam 
05125-07-033-000,Michael 
05172-04-042-000,Debora 
8071-33-001-000,Matt 
2349-38-007, 2349-38-011, 2349-38-012,Ken 
0234906006000,Roger 
3334906006000,Hummels 
0231316005000,Don 
0501401028000,Gregg 

私のコードは次のようになります一致:

0234906006000 
['0501401028000', 'Gregg'] 
0234765306000 
['0501401028000', 'Gregg'] 
0231316005000 
['0501401028000', 'Gregg'] 
0234906006000 
['0501401028000', 'Gregg'] 
0212134006000 
['0501401028000', 'Gregg'] 
0125667806000 
['0501401028000', 'Gregg'] 
3334906006000 
['0501401028000', 'Gregg'] 
1778986006000 
['0501401028000', 'Gregg'] 
0239906006000 
['0501401028000', 'Gregg'] 
Result: {'0234906006000': ['0234906006000', 'Roger']} 

2番目のファイルでループを正しく続行できない箇所を理解できたら助かりますか?これが前に投稿されたことをお詫びしますが、私はより複雑な例しか見つけませんでした。

答えて

1

まあ後。

2番目のファイルがseek(0)になる場合は、内側のループが途切れた後に最初に戻ってください。また、彼らは、その本体が実行されたとき、ファイルが閉じていることを確認しますので、ファイルを開くためにwithステートメントを使用することをお勧めします:

with open("denver_source.csv") as cf1, open("denver_mine.csv") as cf2: 
    source = csv.reader(cf1) 
    mine = csv.reader(cf2) 
    for line in source: 
     for xline in mine: 
      if line[0] in xline: 
       output[line[0]] = xline 
       break 
     cf2.seek(0) 

ここで注目すべきことは、あなたがcsv.readerにユーザーが指定するファイルにseek(0)を呼び出していることですcsv.readerのインスタンスではありません。つまり、mine.seek(0)ではなくcf2.seek(0)と呼んでいます。変更はreaderインスタンスに反映され、必要に応じて再実行することができます。

もちろん、withline in sourceの反復ごとに使用してseek(0)の代わりに使用することもできます。それは本当に個人的な好みにまで下がっています。

+0

入力いただきありがとうございます。私は前に試したことが分かっていますが、csv.readerオブジェクトにはseek属性がありません。 – Robert

+0

@Robertは混乱しています。元のファイル(ここでは 'cf2')を開き、変更が反映されます。そのファイルオブジェクトから作成する 'csv.reader'オブジェクトです。 –

+1

ジムありがとうございます。今、私は分かる。リスト項目ではなく文字列が必要なので、あなたのバージョンをlist [0]のアカウントに変更しました。今はうまくいく。修正行は次の通りであった: 'ラインであれば[0] XLINE中: \t \t \t \t出力[ライン[0]]私は答えにそれを追加します= XLINE \t \t \t \t break' – Robert

1

特に[0]行を参照しています。だから、それはあなたに最初の試合を与えるだけです。あなたのループはX回(xはcsvにいくつの行があるのか​​)ですが、line [0]がループの繰り返しごとにmineにあるかどうかを確認しています。

はこれを試してください:あなたが最後に到達すると、新しい行が再び読み込むことができませんあなたの内側のループで二.csvを反復処理

import csv 
source = csv.reader(open("denver_source.csv")) 
mine = csv.reader(open("denver_mine.csv")) 
output = {} 
for line in source: 
    print(line) 
    for xline in mine: 
     if line not in xline: continue 
     output[line] = xline 
    print(xline) 
print("Result", output) 
+0

あなたのバージョンを使用しても、結果は変わりますが、まだOKではありません。リスト項目ではなく文字列を比較して比較できるように、行[0]を書きました。 最初のループはうまくいっていますが、2番目のループは失敗します。最初のループでは毎回実行されますが、ネストされたループでは、file1の最初の項目のみになります。 – Robert

+0

私の結果はあなたに何をもたらしましたか?私はそれをコンパイルしなかった、それは私が気づいた最初のことだった。それがあなたに何を与えたか教えてもらえれば、私はさらに助けることができます。 – Harrison

+0

出力は空です。結果は次のようになります。それはコメント [ '0234906006000'] [ '0501401028000'、 'グレッグ'] [ '0234765306000'] [ '0501401028000'、 'グレッグ']で[OK]をクリックしフォーマットを願って [ '0231316005000'] [ '0501401028000 」、 'グレッグ'] [ '0234906006000'] [ '0501401028000'、 'グレッグ'] [ '0212134006000'] [ '0501401028000'、 'グレッグ'] [ '0125667806000'] [ '0501401028000'、 'グレッグ'] [ '3334906006000'] [ '0501401028000'、 'グレッグ'] [ '1778986006000'] [ '0501401028000'、 'グレッグ'] [ '02399060060 00 '] [' 0501401028000 '、' Gregg '] 結果{ – Robert

関連する問題