web-dev-qa-db-ja.com

Pythonを使用して、ディレクトリからすべてのcsvファイルを読み込みます

これが簡単ではないことを願っていますが、次のことを考えています。

ncsvファイルがある特定のフォルダーがある場合、それらをすべて一度に1つずつ繰り返し読み取り、その値に対していくつかの計算を実行するにはどうすればよいですか?

たとえば、単一のファイルの場合、次のようなことをして、x配列に対していくつかの計算を実行します。

_import csv
import os

directoryPath=raw_input('Directory path for native csv file: ') 
csvfile = numpy.genfromtxt(directoryPath, delimiter=",")
x=csvfile[:,2] #Creates the array that will undergo a set of calculations
_

特定のフォルダーにあるcsvファイルの数を確認できることを知っています( here を確認してください):

_import glob
for files in glob.glob("*.csv"):
    print files 
_

しかし、numpy.genfromtxt()関数をforループに入れ子にする方法を理解できなかったため、指定する必要があるディレクトリのすべてのcsvファイルを読み込みました。

[〜#〜] edit [〜#〜]

私が持っているフォルダには、jpgおよびcsvファイルしかありません。後者は_eventX.csv_という名前で、[〜#〜] x [〜#〜]は1〜50の範囲です。forループはしたがって、参照する場合は、ファイル名をそのままの形で考慮する必要があります。

10
FaCoffee

それが私がそれをする方法です:

import os

directory = os.path.join("c:\\","path")
for root,dirs,files in os.walk(directory):
    for file in files:
       if file.endswith(".csv"):
           f=open(file, 'r')
           #  perform calculation
           f.close()
13
user4850448

このようなものを探していると思います

import glob

for file_name in glob.glob(directoryPath+'*.csv'):
    x = np.genfromtxt(file_name,delimiter=',')[:,2]
    # do your calculations

編集

フォルダー(サブフォルダーを含む)からすべてのcsvファイルを取得する場合は、subprocessの代わりにglobを使用できます(このコードはLinuxシステムでのみ機能します)

import subprocess
file_list = subprocess.check_output(['find',directoryPath,'-name','*.csv']).split('\n')[:-1]

for i,file_name in enumerate(file_list):
    x = np.genfromtxt(file_name,delimiter=',')[:,2]
    # do your calculations
    # now you can use i as an index

最初に、シェルのfindコマンドを使用してすべてのfile_namesのフォルダーとサブフォルダーを検索し、その後計算を適用します。

5
plonser

documentation of numpy.genfromtxt()によれば、最初の引数は

読み込むファイル、ファイル名、またはジェネレーター。

これは、次のようなすべてのファイルの行を生成するジェネレーターを作成できることを意味します。

def csv_merge_generator(pattern):
    for file in glob.glob(pattern):
        for line in file:
            yield line

# then using it like this

numpy.genfromtxt(csv_merge_generator('*.csv')) 

動作するはずです。 (私はnumpyをインストールしていないので、簡単にテストできません)

2
Ward