質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

3651閲覧

再帰的に処理する時、指定したディレクトリを除外したい

shamimatsu

総合スコア22

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/09/27 09:46

python2.7です。
色々考えましたがどうしても除外する方法がわからなかったため質問させていただきます。

例ではテキストデータをまとめてエディタに送るという処理なのですが、
oldという名前のフォルダに入っているデータだけ処理から除外しA.txt、B.txtだけ開きたいです。
良い方法がございましたら教えていただきたいです。

構造 textdir └ A.txt B.txt old └ C.txt

現状のコード

# coding=utf-8 import os import subprocess memo = 'C:/Program Files/Notepad++/notepad++.exe' dir_path = 'C:/Users/ユーザー名/Desktop/textdir' for root, dirs, files in os.walk(dir_path): for file_name in files: paths = os.path.join(root, file_name) for dir_name in dirs: dir = os.path.join(root, dir_name) if os.path.basename(dir) == 'old': pass elif os.path.isfile(paths): subprocess.Popen([memo, dir_path])

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

os.walk() で走査するディレクトリを変更する。

os.walk() で topdown=True とした場合、返り値の dirnames を in-place で変更することで、走査するディレクトリを変更できます。

topdown が True のとき、呼び出し側は dirnames リストを、インプレースで変更でき、 walk() は dirnames に残っているサブディレクトリ内のみを再帰します。 これにより、検索を省略したり、特定の訪問順序を強制したり、呼び出し側が walk() を再開する前に、 呼び出し側が作った、または名前を変更したディレクトリを、 walk() に知らせたりすることができます。

サンプルコード

python

1# coding: utf-8 2import os 3import subprocess 4 5exe_path = r'C:/Program Files/Notepad++/notepad++.exe' 6target_path = '/root' 7 8for root, dirnames, filenames in os.walk(target_path, topdown=True): 9 # old を走査するディレクトリから除く。 10 dirs[:] = [d for d in dirnames if d != 'old'] 11 12 for filename in filenames: 13 file_path = os.path.join(root, filename) # ファイルパス 14 ext = os.path.splitext(file_path)[1] # 拡張子 15 if ext == '.txt': 16 # テキストファイルを開く。 17 print('Open', file_path) 18 subprocess.Popen([exe_path, file_path])

投稿2018/09/27 10:13

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shamimatsu

2018/09/27 10:30

回答ありがとうございます!A.txt、B.txtだけ開くことができました。 dirs[:]部分が僕にはまだ難しかったため少しずつ見ながら理解していきたいと思います。
guest

0

Pythonでフォルダ内のファイルリストを取得する

考え方だけですがご参考までに。

・対象フォルダ配下のフルパスファイル名を全て取得したリストを作成する
・取得したリストを全ループで回す時にif文でフォルダ名\oldを含む場合は処理しない

投稿2018/09/27 09:57

opyon

総合スコア1009

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shamimatsu

2018/09/27 10:25

回答ありがとうございます!
guest

0

参考として、old 以下を除外したファイル名表示するだけのコードを作ってみました。
a.py

python3

1import glob 2 3for file in glob.iglob("./textdir/**/*.txt", recursive=True): 4 if not file.startswith("./textdir/old/"): 5 print(" ", file) 6 else: 7 print("skip ", file)

実行例:
イメージ説明

参考情報

  • Pythonでフォルダ内のファイルリストを取得する

https://qiita.com/amowwee/items/e63b3610ea750f7dba1b

  • 再帰的なサブフォルダの検索とリストのファイルを返すpython

https://code.i-harness.com/ja/q/118ac23

  • あなたは、もうos.pathやglobやopenを使わなくていい

https://www.killedbynlp.com/posts/stop-to-use-os-path-and-open

...
Python3.3までは、 「あるディレクトリ以下に存在するテキストファイルの一覧を取得して、それぞれを開く」 という処理に、以下の3つのライブラリを使う必要がありました。

ファイルパス操作
os.path
ファイルの一覧取得
glob.glob
ファイルを開く
open
しかし、Python3.4以降であれば、これらを すべて 標準ライブラリpathlibに一任 することができます。
...

投稿2018/09/29 00:41

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shamimatsu

2018/09/29 02:54

回答ありがとうございます! いただいたコードを実行してみたところなぜかC.txtがスキップされない結果になってしまいました。フォルダ構成も同じにしているのですが。 ./textdir\A.txt ./textdir\B.txt ./textdir\old\C.txt ./textdir\sub\D.txt
katoy

2018/09/29 03:02

windows では ファイルの区切りが \ (バックスラッシュ)です。 私の環境は Mac なのでファイルの区切りは / です。 https://www.python-izm.com/advanced/separator/ などを参考にしてみてください。 "python ファイル セパレータ" で google 検索もしてみてください。
shamimatsu

2018/09/30 02:35

./textdir/old/".replace('/', os.sep)のようにしたところ上手くいきました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問