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

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

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

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

Q&A

解決済

3回答

1370閲覧

Python:ワンポチで全ディレクトリ内のjpgファイルと18秒以下のmp4ファイルを一斉削除するプログラムを作りたい!

grasan

総合スコア10

Python

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

0グッド

0クリップ

投稿2020/04/25 14:16

前提・実現したいこと

Pythonで、一斉に全ディレクトリ内の
jpgファイルと18秒以下のmp4ファイルを削除するプログラムを
作成したいです。

実行ファイルの位置は⇒ c:\Users\sho\Desktop\4K Stogram\★★★ です。
★★★の位置に実行ファイルと共に
jpg、mp4ファイルの複数入ったディレクトリが沢山ある状況です。

まずはディレクトリのリストを作成するプログラム。
次にjpgを削除するプログラム。
最後に18秒以下のmp4ファイルを削除するプログラム。

これらが完成したので、合わせて再編集してみたのですが、
どうにも上手く動作してくれません。

リストの取得には成功してるのですが、
jpg削除以降のプログラムが上手く動いてくれません。

そもそものプログラムの組み方が間違っているのでしょうか?
どなたか知恵を貸してください!

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

PS C:\Users\sho> ${env:DEBUGPY_LAUNCHER_PORT}='63064'; & 'C:\Users\sho\AppData\Local\Programs\Python\Python38-32\python.exe' 'c:\Users\sho.vscode\extensions\ms-python.python-2020.4.74986\pythonFiles\lib\python\debugpy\no_wheels\debugpy\launcher' 'c:\Users\sho\Desktop\4K Stogram\Execute all.py' リストの総数:49 ディレクトリ数:43 ディレクトリ一覧:['adamdanyal', 'artventure', 'bestviralposts', 'cool_newtech', 'createvirals', 'creative_technologies', 'cut.the.wood', 'daily_construction', 'dreamonscience', 'drivinghero', 'drsaitozturk', 'electricity', 'electronicsdiy', 'engineer_technology_', 'fbminghuan', 'globalwoodworking', 'ifyouhigh', 'in_creatives', 'mech_home', 'paulbryantv', 'pipesandcreative', 'pouchpanda', 'powervisiongo', 'rising.tech', 'rosie.technology', 'servicegig', 'so.up.high', 'steampunktendencies', 'tech.section', 'techextent', 'tech_collections', 'thdrawing', 'thegiftbazaar', 'totaltoolssouthmelbourne', 'tradectory', 'tv.memari', 'uwoodworkingprojects', 'virals.collections', 'vlog_auto', 'woodworkingideas01', 'worldofartists', 'world_of_engineering', '__pycache__']

該当のソースコード

import glob import os import cv2 ################################################################### ################ ディレクトリのリストを取得するフロー ################ ################################################################### ########## 各変数を定義 ########## path = 'C:/Users/sho/Desktop/4K Stogram' # ディレクトリのリストを作成 folder_lists = os.listdir(path) total_number = len(folder_lists) # 総数 file_lists = [] # リストの初期化 list_number = 0 i=0 # ループ用 ########## ループ ########## for f in folder_lists: if os.path.isdir(os.path.join(path, f)): file_lists.append(f) list_number = len(file_lists) i+=1 if i < total_number: continue else: break else: i+=1 if i < total_number: continue else: break ########## 各値 ########## total_number = len(folder_lists) print('リストの総数:{0}'.format(total_number)) list_number = len(file_lists) print('ディレクトリ数:{0}'.format(list_number)) print('ディレクトリ一覧:{0}'.format(file_lists)) ############################################################### ################ jpgファイルを一括削除するフロー ################ ############################################################## file_lists2 = file_lists # 次フロー用に複製 i = 0 path = 0 # リセット ########## jpegデータを一括取得 ########## file_list= glob.glob("{}/*.jpg".format(file_lists)) # 全jpgファイルのリストを取得 ####### ループ:取得したデータを一括削除 ####### for file in file_list: print("remove:{0}".format(file)) os.remove(file) i += 1 if i < len(file_list): # 全部終わるまでループ continue else: break ####################################################################### ################ ○秒以下のmp4ファイルを一括削除するフロー ################ ####################################################################### file_list = 0 # リセット file_list = glob.glob("{}/*.mp4".format(file_lists2)) # 全mp4ファイルのリストを取得 ########## ループ:動画の名前と尺を抽出 ########## for video_path in file_list: cap = cv2.VideoCapture(video_path) # ビデオを読み込む video_name = os.path.basename(video_path) # 名前を取得 scale = cap.get(cv2.CAP_PROP_FRAME_COUNT) / cap.get(cv2.CAP_PROP_FPS) # 尺を取得 print() print("video_name:{}".format(video_name)) print("scale:{}".format(scale)) cap.release() # 動画を閉じる ########## ③18秒以下なら削除 ########## if scale <= 18: os.remove(video_path)

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

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

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

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

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

meg_

2020/04/25 14:45

「jpg削除以降のプログラムが上手く動いてくれません」とはどういうことでしょうか?具体的に説明出来ますか?
guest

回答3

0

下記でファイルリストが取得できていないかと思われます。

Python

1file_list= glob.glob("{}/*.jpg".format(file_lists)) # 全jpgファイルのリストを取得 2 3file_list = glob.glob("{}/*.mp4".format(file_lists2)) # 全mp4ファイルのリストを取得

下記のような表現ではglob.globでファイル取得は出来ないかと思います。

Python

1'{}/*.jpg'.format(['1','2','3']) 2"['1', '2', '3']/*.jpg"

投稿2020/04/25 15:04

meg_

総合スコア10580

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

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

grasan

2020/04/25 23:33

回答ありがとうございます! 凄く分かりやすいです。 for関数などで先に抽出してからpathに当てはめていれば 上手く動いていたという訳ですね。 もう一人の方の意見も参考にしながら、 改めてプログラムの構造から考え直してみようと思います。 ありがとうございました!
guest

0

フォルダ名を引数に与えれば、そのなかのjpgを削除する関数(メソッド)を書きましょう。そして、
フォルダ名を引数に与えれば、そのなかの18sec以下のMP4を削除する関数を書きましょう

それができたら、
フォルダのリストでループ回してこの2つの関数を呼んでいけばいいってことになります

投稿2020/04/25 14:50

y_waiwai

総合スコア87749

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

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

grasan

2020/04/26 06:57 編集

返信遅れてすみません。 今まで悪戦苦闘しておりました。汗 ちなみになんですが、昨日いただいたアドバイスに従って ググりながら試行錯誤してみたところ、 なんとか目的通りの動作をさせることに成功しました。 嬉しいです。 本当にありがとうございます!
y_waiwai

2020/04/26 07:08

それができたなら、こういう関数を作ってみよう やるきがあれば、でよろしいw パスを引数に取る関数 引数のパスで、すべてのファイル/ディレクトリのリストを取り 対象がディレクトリなら、そのディレクトリを引数にして自分自信の関数を呼ぶ、そしてリスト分ループ 対象がJPGファイルなら削除してリスト分ループ 対象がMP4なら時間を確認して削除してリスト分ループ いずれも当てはまらなければパスしてリスト分ループ
grasan

2020/04/26 07:09

すみません、間違えて自己解決をベストアンサーにしてしまったので、 今運営に問い合わせ中です。 連続でアドバイスいただき本当に助かっております。 これからもどうぞよろしくお願いいたします。
grasan

2020/04/26 07:10

勿論やります!w
guest

0

自己解決

完成プログラムがこちらになります。

import glob import os import cv2 ####################################################################### #【関数】jpgファイルを一括削除 ########################################## ####################################################################### def delete_picture(): ########## jpegデータを一括取得 ########## picture_path_lists= glob.glob("{}/*.jpg".format(directory_path)) # 全jpgファイルのリストを取得 ####### ループ:取得したデータを一括削除 ####### for picture_path_lists in picture_path_lists: # print("remove:{0}".format(picture_path_lists)) #表示 os.remove(picture_path_lists) #削除 ####################################################################### #【関数】★秒以下のmp4ファイルを一括削除 ################################ ####################################################################### def delete_video(): video_path_lists = [] # リセット video_path_lists = glob.glob("{}/*.mp4".format(directory_path)) # 全mp4ファイルのリストを取得 ########## ループ:動画の名前と尺を抽出 ########## for video_path in video_path_lists: cap = cv2.VideoCapture(video_path) # ビデオを読み込む video_name = os.path.basename(video_path) # 名前を取得 video_scale = cap.get(cv2.CAP_PROP_FRAME_COUNT) / cap.get(cv2.CAP_PROP_FPS) # 尺を取得 print() print("video_name:{}".format(video_name)) print("video_scale:{}".format(video_scale)) cap.release() # 動画を閉じる ########## ③18秒以下なら削除 ########## if video_scale <= 18: os.remove(video_path) ####################################################################### # ディレクトリのリスト取得 ############################################### ####################################################################### ########## 各変数を定義 ########## path = 'C:/Users/sho/Desktop/4K Stogram' # ここにフォルダの住所を入力 folder_lists = os.listdir(path) file_total_number = len(folder_lists) # 総数 directory_path_lists = [] # リストの初期化 directory_lists_number = 0 i=0 # ループ用 ########## ループ ########## for f in folder_lists: if os.path.isdir(os.path.join(path, f)): directory_path_lists.append(f) directory_lists = len(directory_path_lists) i+=1 if i < file_total_number: continue else: break else: i+=1 if i < file_total_number: continue else: break ########## 各値 ########## file_total_number = len(folder_lists) print('リストの総数:{0}'.format(file_total_number)) ###### directory_lists_number = len(directory_lists) ###### print('ディレクトリ数:{0}'.format(directory_lists_number)) print('ディレクトリ一覧:{0}'.format(directory_lists)) ####################################################################### # 削除ループ ########################################################## ####################################################################### for directory_path in directory_path_lists: ########## 【関数の呼び出し】jpgファイルを一括削除 ########## delete_picture() ########## 【関数の呼び出し】★秒以下のmp4ファイルを一括削除 ########## delete_video()

投稿2020/04/26 07:01

grasan

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問