1

Python 3.5 を使用して、csv ファイルに含まれるデータを分析しています。これらのファイルは、「figs」ディレクトリに含まれています。このディレクトリは、全体的なデータ ディレクトリに含まれているケース ディレクトリに含まれています。

/strm1/serino/DATA/06052009/figs

またはより一般的に:

/strm1/serino/DATA/ case_date_in_MMDDYYYY /figs

私が開始しているディレクトリは「/strm1/serino/DATA/」であり、各サブディレクトリは、私が取り組んでいるケースの月、日、および年です。各サブディレクトリには「figs」という名前の別のサブディレクトリが含まれており、これが各ケースの csv ファイルの場所です。正確には:

/strm1/serino/DATA/ case_date_in_MMDDYYYY /figs/ case_date_in_MMDDYYYY .csv

そのため、DATA ディレクトリから始めて、そのサブディレクトリを調べて、MMDDYYYY という名前のディレクトリを見つけたいと思います。ただし、一部のケース ディレクトリは、「06052009_TX」のように、末尾に州の略語が付けられている場合があります。したがって、MMDDYYYY の名前を正確に一致させる代わりに、ディレクトリ名に 1 から 9 までの任意の数字が含まれていることを確認するのと同じくらい単純なことである可能性があります。

最初のサブディレクトリ (case ディレクトリ) に移動したら、'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)

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

4

2 に答える 2

0

上記のいくつかの問題を挙げました。あなたはどちらにこだわっていますか?を使用してファイル ストレージ システムをナビゲートする方法を既にご存知のようですos.pathos.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次に、サブディレクトリへのパスを追加して、親ディレクトリの保存を更新します。それは意味がありますか?

于 2016-11-01T04:33:45.900 に答える
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
于 2016-11-01T08:43:51.807 に答える