これが簡単ではないことを願っていますが、次のことを考えています。
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
ループはしたがって、参照する場合は、ファイル名をそのままの形で考慮する必要があります。
それが私がそれをする方法です:
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()
このようなものを探していると思います
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のフォルダーとサブフォルダーを検索し、その後計算を適用します。
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をインストールしていないので、簡単にテストできません)