2017-12-07 14 views
0

私は非常にPythonには新しいので、私に同行してください。私はこのようなCSVファイルを持っています:CSVファイルから一意の個体を新しいファイルにコピーする方法

Animal Locations

私はファイルをループしていきたいと思いますし、一意の個人ごとに新しいcsvファイルを作成して行をコピーします。私は1匹の動物でこれを成功させましたが、より一般的なアプローチのための構文を作成するのに問題があります。ここで私は、現在持っているものです。

import arcpy 
import csv 
from csv import DictReader 

WS = arcpy.env.workspace = raw_input("Where if your workspace") 
infile = raw_input("where is your file?") 
outfile = raw_input("What is your outfile name?") 
arcpy.env.overwriteOutput = True 


with open(infile, "r") as csvFile, open(outfile, "w") as out, open("outfile2.csv", "w") as out2: 
    reader = csv.DictReader(csvFile) 
    writer = csv.writer(out) 
    writer.writerow(reader.fieldnames) 
    for row in reader: 
     if row["Animal"] == "1": 
      values = [row[field] for field in reader.fieldnames] 
      writer.writerow(values) 

答えて

1

は、独自のCSVファイルに各Animalを作成するには、動物の種類ごとに別のファイルを開く必要があります。これは辞書を使って各動物のファイルオブジェクトとcsvライターオブジェクトを保存することで可能です。終わりに、これはその後、正しく、すべてのファイルを閉じるために使用することができます

import csv 

output_csvs = {} # e.g. {'1' : [file_object, csv_object]} 

with open('input.csv', 'rb') as f_input: 
    csv_reader = csv.reader(f_input) 
    header = next(csv_reader) 

    for row in csv_reader: 
     animal = row[0] 

     if animal in output_csvs: 
      output_csvs[animal][1].writerow(row) 
     else: 
      f_output = open('animal_{}.csv'.format(animal), 'wb') 
      csv_output = csv.writer(f_output) 
      output_csvs[animal] = [f_output, csv_output] 
      csv_output.writerow(header) 
      csv_output.writerow(row) 

for csv_file, csv_writer in output_csvs.values(): 
    csv_file.close() 

これはあなたに動物に従って命名出力CSVファイルのセットを与えるだろう、例えばまたanimal_1.csv


データがメモリに読み込まれるのに十分小さい場合、それはPythonのitertools.groupby()機能を利用することにより、一度に動物と出力1つのブロックでソートすることができます

from itertools import groupby 
import csv 

with open('input.csv', 'rb') as f_input: 
    csv_reader = csv.reader(f_input) 
    header = next(csv_reader) 

    for animal, group in groupby(sorted(csv_reader), lambda x: x[0]): 
     with open('animal_{}.csv'.format(animal), 'wb') as f_output: 
      csv_output = csv.writer(f_output) 
      csv_output.writerow(header) 
      csv_output.writerows(group) 

sorted()を使用すると、同じ種類のすべての動物が確実にグループ化されます。これがすでにデータの場合は、ソートは必要ありません。


あなたがglob.glob()を使用することができ、これらのファイルにアクセスするには:

import matplotlib.pyplot as plt    
import glob 

for animal_filename in glob.glob('animal_*.csv'): 
    with open(animal_filename, 'rb') as f_input: 
     csv_input = csv.reader(f_input) 
     heading = next(csv_input) 
     x, y = [], [] 

     for row in csv_input: 
      x.append(int(row[1])) 
      y.append(int(row[2])) 

     fig, ax = plt.subplots() 
     plt.title(animal_filename) 
     ax.scatter(x, y) 

plt.show() 
+0

どのように私はx-y座標をプロットするように、それらのプロセスを実行したい場合、新しく作成されたファイルを参照するのでしょうか? – Kevin

+0

1つのプロットにつき、1つのグラフに1つのプロットが表示されますか? –

+0

最後に、私はラスター形式に変換するarcpyを使用して最小境界ジオメトリを作成したいと思います。 – Kevin

関連する問題