2016-04-08 22 views
0

属性Product_ID、Name、Cost、Descriptionの3つのCSVファイルがあります。各ファイルにProduct_IDが含まれています。私はProduct_IDと上記の3つのすべての属性を持つ新しいCSVファイルにName(file1)、Cost(file2)、Description(File3)を結合したいと思います。私は130000以上の行を含むファイルとして効率的なコードが必要です。1つのcsvから別のPythonにデータを書き込む

すべてのデータを新しいファイルに結合した後、そのデータを辞書にロードする必要があります。 のように:Product_IdとしてKey and Name、Cost、Description as Value。

+0

そして、何あなたがそうFAを試してみましたが簡素化することができますr?あなたのコードを私たちに示してください。そうすれば、あなたを助けることができます。 –

+0

私が試みたのは、3つのファイルからのデータを辞書に結合して書き込むことですが、エラーが発生しています。以下のコードでは、行[1]をキーとし、行[2]、行[3]を値として辞書にファイルを書き込みます。しかし、同じ辞書に別のファイルを追加することはできません。 TEXT_FILE = csv.reader TEXT_FILEの行のための(ファイル) 次(TEXT_FILE) : maindict [行[1ファイルとしてオープン( 'train_1.csv'、R ''、エンコーディング= "UTF8")と ]] = rows [2]、rows [3] – Sameer

+0

@Sameerあなたの質問をそのコードで編集したいと思うかもしれません。 – kirkpatt

答えて

1

集計結果を作成する前に、各入力.csvを辞書に読み込む方が効率的かもしれません。

各ファイルを読み込み、Product_IDをキーとして辞書に列を格納するためのソリューションです。各Product_ID値が各ファイルに存在し、そのヘッダーが含まれていると仮定します。また、Product_ID以外にも、ファイル全体に重複した列がないことを前提としています。

import csv 
from collections import defaultdict 

entries = defaultdict(list) 
files = ['names.csv', 'costs.csv', 'descriptions.csv'] 
headers = ['Product_ID'] 

for filename in files: 
    with open(filename, 'rU') as f:  # Open each file in files. 
     reader = csv.reader(f)   # Create a reader to iterate csv lines 
     heads = next(reader)    # Grab first line (headers) 

     pk = heads.index(headers[0])  # Get the position of 'Product_ID' in 
             # the list of headers 
     # Add the rest of the headers to the list of collected columns (skip 'Product_ID') 
     headers.extend([x for i,x in enumerate(heads) if i != pk]) 

     for row in reader: 
     # For each line, add new values (except 'Product_ID') to the 
     # entries dict with the line's Product_ID value as the key 
     entries[row[pk]].extend([x for i,x in enumerate(row) if i != pk]) 

writer = csv.writer(open('result.csv', 'wb')) # Open file to write csv lines 
writer.writerow(headers)       # Write the headers first 
for key, value in entries.items(): 
    writer.writerow([key] + value)  # Write the product IDs 
    # concatenated with the other values 
+0

CSVから複数の行を追加する場合は、上記のコードは機能しません。 names.csvにProduct_ID、Names、Tagsが含まれているとします。私は行1、行2の両方を追加したいのですか? – Sameer

+0

あなたのcsvカラムに関する情報はあまり含まれていませんでした。私はそれらに含まれている他のデータがないと仮定しました。スキップするのではなく、最初の行からヘッダーを読み取って、キーの正しい行インデックスと追加する値を見つけ出すことができます。明確にするために、各ファイルのすべての列をプロダクトIDをキーとして追加しますか? – dnix

+0

私は自分の答えを編集して各ファイルの各列を含めました。 – dnix

0

レコードを生成する一般的な解決策は、おそらく不完全、各idため、それは3つのファイルを処理するスロット

の事前に割り当てられた数と、幸いリストだけである特殊なデータ構造の使用を必要と遭遇
d = {id:[name,None,None] for id, name in [line.strip().split(',') for line in open(fn1)]} 
for line in open(fn2): 
    id, cost = line.strip().split(',') 
    if id in d: 
     d[id][1] = cost 
    else: 
     d[id] = [None, cost, None] 
for line in open(fn3): 
    id, desc = line.strip().split(',') 
    if id in d: 
     d[id][2] = desc 
    else: 
     d[id] = [None, None, desc] 

for id in d: 
    if all(d[id]): 
     print ','.join([id]+d[id]) 
    else: # for this id you have not complete info, 
      # so you have to decide on your own what you want, I have to 
     pass 

あなたはさらにプロセス不完全なレコードを望んでいないことが確実な場合は、上記のコードは

d = {id:[name] for id, name in [line.strip().split(',') for line in open(fn1)]} 
for line in open(fn2): 
    id, cost = line.strip().split(',') 
    if id in d: d[id].append(name) 
for line in open(fn3): 
    id, desc = line.strip().split(',') 
    if id in d: d[id].append(desc) 

for id in d: 
    if len(d[id])==3: print ','.join([id]+d[id]) 
+0

@ gboffi、今日はコードを調べます。ありがとうございました。 – Sameer

関連する問題