pythonでのファイル検索、読み込みについて
解決済
回答 5
投稿
- 評価
- クリップ 0
- VIEW 6,273
例えば
A/B/C/D/
の中にEというディレクトリとFというディレクトリがあったとします。
EとFにはそれぞれe001.txt〜e100.txtとf001.txt~f100.txtが入ってるとします。
このような状況下で、e050.txt~e059.txtとf050.txt~f059.txtのファイルを一度に読み込みたいのですがどのようにしたらいいのでしょうか?
検索対象のディレクトリが1つであれば(仮にEとします)
import glob
files = []
filesnames = []
files = glob.glob('A/B/C/D/E/e05*.txt')
for i in range(len(files)):
filesnames.append(os.path.basename(files[i]))
for i in range(len(files)):
openfile = codecs.open(''A/B/C/D/E/' + filesnames[i],"r",'utf-8')
のようにしているのですが、複数のディレクトリを一度に検索して取得する方法がわかりません。
よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+3
どういうパターンがあるかわからないので、globでまとめて処理しないで os.listdir で地道に処理するか、 os.walk でディレクトリを走査しながら処理してはどうでしょうか?
>>> import os
>>> base = 'A/B/C/D/'
>>> for dirname in os.listdir(base):
... path = os.path.join(base, dirname)
... if os.path.isdir(path): # ディレクトリだったらファイルの一覧を取得
... for filename in os.listdir(path):
... if filename.endswith('.txt'):
... filepath = os.path.join(path, filename)
... # ここにファイルに対する処理を書く
...
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
二回とってくっつけちゃえばいい
files = glob.glob('A/B/C/D/E/e05?.txt')
files.extend(glob.glob('A/B/C/D/F/f05?.txt'))
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
0
[ ]
で囲むと、いずれかの文字というパターンになります。
なので、A/B/C/D/[EF]/e05*.txt
とすれば、E
とF
の両方を検索できます。
ただ、おそらく実際のディレクトリーは1文字ではないのですよね?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
以下でどうでしょうか。
files = glob.glob('A/B/C/D/[EF]/[fe]05*.txt')
ただし、Eの配下に f05.. というファイルがあった場合、マッチしてしまいますが。
コメントにあるようにディレクトリ名が1文字でないとすると難しいです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
glob と filter をつかってかいてみました。
a.py
import glob
import os
def match(n):
s = os.path.split(n)
file_name = s[1]
dir_name = os.path.split(s[0])[1]
return file_name.startswith(dir_name.lower() + '05')
print(filter(lambda n: match(n), glob.glob('./data/*/*05[0-9].txt')))
実行例
$ tree data
data
├── A
│ ├── a050.txt
│ ├── a100.txt
│ └── b050.txt
├── B
│ ├── a050.txt
│ ├── b050.txt
│ └── b100.txt
└── XYZ
├── a050.txt
├── xyz050.txt
└── xyz100.txt
$ python a.py
['./data/A/a050.txt', './data/B/b050.txt', './data/XYZ/xyz050.txt']
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる