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

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

新規登録して質問してみよう
ただいま回答率
85.53%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Python

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

Q&A

解決済

2回答

376閲覧

ディレクトリに複数あるファイルを移動させたい。

oobutamaru

総合スコア32

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Python

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

0グッド

0クリップ

投稿2022/04/21 06:34

前提

あるディレクトリにファイルが複数入っています。
例)0123456-01製品.xlsx,0123456-01図面.pdf, 1234546-a0製品.xlsx,123456-a0図面.pdfというように
数字7桁-[0-9a-z]{2}のパターンに製品と図面が複数入っているディレクトリがあります。
このディレクトリに、数字7桁-[0-9a-z]{2}+’sample'というディレクトリを作り、共通するファイルを入れていきたいです。

上記の例でいうと
0123456-01sample-0123456-01製品.xlsx,0123456-01図面.pdf

1234546-a0sample-1234546-a0製品.xlsx,123456-a0図面.pdf
が入る形になります。

うまくいかないので、どうすればよいでyそうか?

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

発生している問題・エラーメッセージ

ディレクトリは作られるのですが、ファイルが入りません。

python

1 2 3#ディレクトリ作成 4 5def make_target_dir(filelists): 6 for file in filelists: 7 filepath = os.path.split(file)[0] 8 basename = os.path.split(file)[1] 9 name,ext = os.path.splitext(basename) 10 foldername = re.search(r'[0-9]{7}-[0-9A-z]{2}',name).group() 11 new_folder_path = os.path.join(filepath,foldername+'sample') 12 if not os.path.exists(new_folder_path): 13 os.makedirs(new_folder_path) 14 15#ディレクトリとファイルを判定 16def filter_dir(filelists): 17 dir_ = [] 18 for file in filelists: 19 if os.path.isdir(file): 20 dir_.append(file) 21 return dir_ 22 23def filter_file(filelists): 24 filelist = [] 25 for file in dirs: 26 if os.path.isfile(file): 27 filelist.append(file) 28 return filelist 29 30 31 32#同じディレクトリにあるものをフォルダ名とファイル名が一致したらフォルダに入れる 33def insert_file(dirs,filelist): 34 for target_dir in dirs: 35 basename = os.path.basename(target_dir) 36 basename_code = re.match(r'[0-9]{7}-[a-z0-9]{2}',basename).group() 37 for file in filelist: 38 if re.search(r'[0-9]{7}-[a-z0-9]{2}',file).group() in basename_code: 39 shutil.move(file,target_dir) 40 41if __name__ == '__main__': 42 file_path_lists =glob.glob(r'ファイルパス/*') 43 make_target_dir(file_path_lists) 44 dirs = filter_dir(file_path_lists) 45 filelist =filter_dir(dirs) 46 insert_file(dirs,filelist) 47

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

とりあえず、修正しました。
修正箇所は #修正 のコメントが入っています。

python3

1#ディレクトリ作成 2 3def make_target_dir(filelists): 4 dirs = [] 5 for file in filelists: 6 filepath = os.path.split(file)[0] 7 basename = os.path.split(file)[1] 8 name,ext = os.path.splitext(basename) 9#修正開始 10 match = re.search(r'[0-9]{7}-[0-9A-z]{2}',name) 11 if match != None: 12 foldername = match.group() 13 new_folder_path = os.path.join(filepath,foldername+'sample') 14 if new_folder_path not in dirs: 15 dirs.append(new_folder_path) 16 if not os.path.exists(new_folder_path): 17 os.makedirs(new_folder_path) 18 return dirs 19#修正終了 20 21#ディレクトリとファイルを判定 22def filter_dir(filelists): 23 dir_ = [] 24 for file in filelists: 25 if os.path.isdir(file): 26 dir_.append(file) 27 return dir_ 28 29def filter_file(filelists): 30 filelist = [] 31 for file in filelists: #修正 32 if os.path.isfile(file): 33 filelist.append(file) 34 return filelist 35 36 37 38#同じディレクトリにあるものをフォルダ名とファイル名が一致したらフォルダに入れる 39def insert_file(dirs,filelist): 40 for target_dir in dirs: 41 basename = os.path.basename(target_dir) 42 basename_code = re.match(r'[0-9]{7}-[a-z0-9]{2}',basename).group() 43 for file in filelist: 44#修正開始 45 match = re.search(r'[0-9]{7}-[a-z0-9]{2}',file) 46 if match != None: 47 if match.group() in basename_code: 48 shutil.move(file,target_dir) 49#修正終了 50 51if __name__ == '__main__': 52 file_path_lists =glob.glob(r'ファイルパス/*') 53#修正開始 54 dirs = make_target_dir(file_path_lists) 55 filelist =filter_file(file_path_lists) 56#修正終了 57 insert_file(dirs,filelist) 58

投稿2022/04/21 13:57

tatsu99

総合スコア5422

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

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

oobutamaru

2022/04/22 01:09

ありがとうございます。 やりたかったことが出来ました。 debugをして、コードの流れを追って、自分のどこがいけなかったのかを調べてみます。
guest

0

shutil.move(file,target_dir)

このときに、fileとtarget_dir になにが入ってるのか、printするなどして確認してみては

投稿2022/04/21 06:38

y_waiwai

総合スコア87693

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問