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行目
・・・・・