pythonを使用して所定のフォルダを再帰的に探索して、複数のzipファイルに格納されているCSVファイルだけを読み込む
「pythonでフォルダやファイルへアクセスする」では、pythonを使用してフォルダ内のファイルへアクセスする方法をメモした。
これを踏まえて、次はタイトルに書いたことを実施する。
次のようなフォルダ構造となっている。この中から、ファイル名に「USDJPY.csv」を含むCSVファイルだけを読み込むことが目標である。
inputフォルダ
|-testFolderフォルダ
|-1.zip
|-1
|−1.csv
|-2.zip
|-2
|−2.csv
|-3.zip
|-3
|−3.csv
|-4.zip
|-4
|−4.csv
|-5.zip
|-5
|−5.csv
|-6.zip
|-6
|−6_USDJPY.csv
|-7.zip
|-7
|−7_USDJPY.csv
コードは次。
#coding:utf-8 import zipfile import os import glob import cStringIO import re #Input inputFileDirName = 'input' inputFiles = os.listdir(inputFileDirName) #Data Processing g = os.walk(inputFileDirName) for dirpath, dirs, files in g: print dirpath, files for targetZipFile in glob.glob(dirpath+"/"+"*.zip"): #globを使用して、dirpathの中で拡張子がzipのものだけを取得 print targetZipFile unzippedZf = zipfile.ZipFile(targetZipFile, 'r') #zipファイル解凍 fileListInZip = unzippedZf.namelist() #zipファイル内のファイルリスト取得 for fileName in fileListInZip: if(re.compile("USDJPY.csv").search(fileName)): #拡張子がcsvのものを対象とする(「.csv」を含むファイルが拡張子がcsvのものしかないことが前提) print fileName f = cStringIO.StringIO(unzippedZf.read(fileName)) #cStringIOを使用して、zipファイルを展開せずにメモリ上で読み込む for line in f: print(line)
ポイントを羅列する。
1.再帰的な探索にはos.walkを使用する
2.指定フォルダから検索パターンにマッチするファイルだけを取得するにはglob.globを使用する
3.zipファイルの読み込みにはzipfile.ZipFileを使用する
4.zipファイルを解凍せずに読み込むには、cStringIOを使用する
出力結果は下記(「←」で付けた文は注釈なので出力結果ではない)。
input [] ←inputフォルダ内を検索した「print dirpath, files」の実行結果。inputフォルダ直下にファイルは無いので空リストが返っている。
input\testFolder ['1.zip', '2.zip', '3.zip', '4.zip', '5.zip', '6.zip', '7.zip']←「print dirpath, files」の実行結果。testFolder内にはzipファイルが存在する
input\testFolder\1.zip←1.zipファイルにアクセスした後の「print targetZipFile」の実行結果。対象ファイルが無いので「print fileName」実行結果は無し。
input\testFolder\2.zip←同上
input\testFolder\3.zip←同上
input\testFolder\4.zip←同上
input\testFolder\5.zip←同上
input\testFolder\6.zip←6.zipファイルにアクセスした後の「print targetZipFile」の実行結果。
6/6_USDJPY.csv←6.zipファイルには対象ファイルがあるため「print fileName」の実行結果が返却される。
Date,Pair,bid,ask←「print(line)」の実行結果。対象ファイルの1行目
2016/11/07,USD/JPY,102.022,102.042←「print(line)」の実行結果。対象ファイルの2行目
・・・・・