2017-06-06 24 views
0

背景:のPythonでCSVファイルに書き込む方法

私はCSV(csv_dump)はMySQLのテーブルからデータを含むファイルがあります。特定の条件(row[1] == condition_1 and row[2] == condition_2)を満たす行の一部を一時的なCSVファイル(csv_temp)にコピーします。

コードスニペット:

f_reader = open(csv_dump, 'r') 
f_writer = open(csv_temp, 'w') 
temp_file = csv.writer(f_writer) 

lines_in_csv = csv.reader(f_reader, delimiter=',', skipinitialspace=False) 

for row in lines_in_csv: 

    if row[1] == condition_1 and row[2] == condition_2: 
     temp_file.writerow(row) 

f_reader.close() 
f_writer.close() 

質問:

がどのように読み取られている行をコピーすることができますコピーして "そのまま" のpython3で一時ファイルに?

答えて

1

のtest.CSV

data1,data2,data3 
120,80,200 
140,50,210 
170,100,250 
150,70,300 
180,120,280 

コードが

ここ

import csv 
with open("test.csv", 'r') as incsvfile: 
    input_csv = csv.reader(incsvfile, delimiter=',', skipinitialspace=False) 
    with open('tempfile.csv', 'w', newline='') as outcsvfile: 
    spamwriter = csv.writer(outcsvfile, delimiter=',', quoting=csv.QUOTE_MINIMAL) 
    first_row = next(input_csv) 
    spamwriter.writerow(first_row) 
    for row in input_csv: 
     if int(row[1]) != 80 and int(row[2]) != 300: 
      spamwriter.writerow(row) 
を行く出力 tempfile.csv

data1,data2,data3 
140,50,210 
170,100,250 
180,120,280 

あなたはタイトルがこの2行

first_row = next(input_csv) 
    spamwriter.writerow(first_row) 
を削除していない場合
0

次のPythonスクリプトは仕事をしているようですが、中間のCSVファイルから再処理するのではなく、おそらくMySQLクエリを使用してこの作業を直接行うべきです。しかし、私はそれをしたいと思ういくつかの正当な理由があるに違いないと思いますか?

mycsv.csv

aa,1,2,5 
bb,2,3,5 
cc,ddd,3,3 
hh,,3,1 
as,hfd,3,3 

readwrite.py

import csv 

with open('mycsv.csv', 'rb') as infile: 
    with open('out.csv', 'wb') as outfile: 
     inreader = csv.reader(infile, delimiter=',', quotechar='"') 
     outwriter = csv.writer(outfile) 
     for row in inreader: 
      if row[2]==row[3]: 
       outwriter.writerow(row) 

out.csv

cc,ddd,3,3 
as,hfd,3,3 

もう少し作業では、あなたはを利用するために 'csv.writer' を変更することができます同じ区切り文字とエスケープ/クォート文字を ' csv.reader '。ファイルから生の行を書き出すのとまったく同じではありませんが、特定のフィールドの値を調べることができれば、問題の行がすでに明確に解析されているので、実際には速くなると思います。

+0

入力CSVファイルから* raw *行を出力する簡単な方法はないようです。唯一のアイデアは、Pythonの 'file'クラスをサブクラス化することです。私はそれを試みましたが、_csvモジュールが一度にフルラインを読み取っているように見えないので、それは簡単ではありませんでした。 – jdpipe

関連する問題