2016-11-01 2 views
0

私はPython 3.5を使用してcsvファイルに含まれるデータを分析しています。これらのファイルは、例えば、全体のデータディレクトリに含まれている場合のディレクトリに含まれる「いちじく」ディレクトリに含まれています。Python - 名前付け基準に準拠するサブディレクトリを移動する

/strm1 /セリーノ/ DATA/06052009 /イチジク

以上の一般:

/strm1 /セリーノ/ DATA/case_date_in_MMDDYYYY /イチジク

私が始めているディレクトリは '/ strm1/serino/DATA /'で、各サブディレクトリは私が作業しているケースの月、日、年です。各サブディレクトリには「figs」という別のサブディレクトリがあり、これは各ケースのcsvファイルの場所です。正確には:

/strm1 /セリーノ/ DATA/case_date_in_MMDDYYYY /イチジク/ case_date_in_MMDDYYYY .CSV

だから、私は私のデータディレクトリで起動し、そのサブディレクトリを通過したいと思いますMMDDYYYYという名前のものを探します。しかし、ケースディレクトリの中には、末尾に「06052009_TX」のような状態の省略形を付けて名前を付けることができます。したがって、MMDDYYYYの名前を正確に照合するのではなく、ディレクトリ名に1〜9の数字が含まれていることを確認するだけの簡単な方法です。

私が最初のサブディレクトリ(ケースディレクトリ) 「figs」サブディレクトリに移動します。一度そこに、最初のサブディレクトリ(ケースのディレクトリ)と同じ命名規則でcsvファイルにアクセスしたいと思います。私は各csvファイルに含まれるデータで既存の配列を埋めます。

基本的に私の質問は、特定の命名規則に一致し、最終的には「最後」のデータファイルにアクセスする複数のサブディレクトリを移動することに関係しています。私はglob、fnmatch、os.listdir、os.walkで素朴に遊んでいましたが、私が含めると役立つと感じるような作業には十分近いものは得られませんでした。私はそれらのモジュールにはあま​​り慣れていません。私は何を含めることができることは私がつもりです:

for dirs in data_dir that contain a number: 
     go into this directory 
     go into 'figs' directory 
     read data from the csv file whose name matches its case directory name (or whose name format matches the case directory name format) 

私は関連の質問に遭遇しましたが、私は特に、ネストされたディレクトリと、私は希望の方法で彼らの答えを適用することができていません。私は本当に助けに感謝し、私は何かを明確にする必要がある場合はお知らせください。

答えて

0

次のようにしてください。 datetime.strptime()関数を使用して、各フォルダ名を有効なdatetimeオブジェクトに変換しようとします。変換に失敗すると、フォルダ名が正しい形式でなく、スキップできることがわかります。次に、対応するfigフォルダにあるCSVファイルを解析しようとします。

from datetime import datetime 
import glob 
import csv 
import os 

dirpath, dirnames, filenames = next(os.walk('/strm1/serino/DATA')) 

for dirname in dirnames: 
    if len(dirname) >= 8: 
     try: 
      dt = datetime.strptime(dirname[:8], '%m%d%Y') 
      print(dt, dirname) 
      csv_folder = os.path.join(dirpath, dirname) 

      for csv_file in glob.glob(os.path.join(csv_folder, 'figs', '*.csv')): 
       with open(csv_file, newline='') as f_input: 
        csv_input = csv.reader(f_input) 

        for row in csv_input: 
         print(row) 

     except ValueError as e: 
      pass 
+0

これはまさに私が援助を必要としていたものであり、それが理にかなっていることがわかります。私はあなたが 'datetime.strptime'をそのように使うことができるのか気づいていませんでした。私も「試しに」気づいていませんでした。本当にありがとう、私は応答するために私がしばらくかかったことを謝罪します。 – ChelleS

0

上記のいくつかの問題を挙げました。あなたはどれを抱きしめていますか? os.pathを使用してファイルストレージシステムをナビゲートする方法をすでに知っているようです。あなたは、手動のようなファイルへのファイルの相対パスを指定することができる機能os.path.join()のか分からないことがあります。

os.path.abspath(os.path.join(os.path.dirname(__file__), '../..', 'Data/TrailShelters/')) 

は、上記を打破するには:

os.path.dirname(__file__)は、現在のファイルのパスを返します。 '../..'は、フォルダ階層で2つのレベルに上がることを意味します。そしてData/TrailShelters/は私が移動したいディレクトリです。

これはどのようにあなたの特定のケースに当てはまりますか?さて、あなたはいくつかの変更を加える必要がありますが、親ディレクトリのos.pathを変数に格納することができます。基本的にwhile sub_dir is not nullループを使用して、サブディレクトリを反復処理することができます。すべてのサブディレクトリについて、そのファイルのos.pathを調べ、興味のあるパスの特定の部分を抽出したいと思うでしょう。次に、好きなサブディレクトリであるかどうかを判断するために単にif 'TN' in subdirectory_nameのようなものを使うだけです。サブディレクトリにパスを追加して、保存された親ディレクトリのos.pathを更新します。それは意味をなさないでしょうか?

+0

ありがとうございました。以下の@Martin Evansによって提供される答えは、私の質問にもっと徹底的に取り組んでいます。私は混乱のためにお詫びしますが、ディレクトリをナビゲートすることは、私が立ち往生していたものでした。しかし、あなたは私が 'os.path.join()'を知らなかったという点で正しいですし、私は自分のコードでそれを使う必要がありました。私はあなたの迅速な対応に感謝します。 – ChelleS

関連する問題