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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

12509閲覧

指定フォルダ配下のフォルダごとに同じ処理を行いたい。

TomF

総合スコア4

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2020/10/18 09:01

前提・実現したいこと

Python初学者です。

現在フォルダ内にある複数のjpgを一つのPDFにまとめる作業をしています。
フォルダの数が多いので自動化できないものかと考えていますが検索しても引っかからないので困っています。

フォルダ0
┣━フォルダ1
┃  jpg1
┃  jpg2
┃  jpg3

┣━フォルダ2
┃  jpg1
┃  jpg2
┃  jpg3

┗━フォルダ3
jpg1
jpg2
jpg3

上記のように階層は複雑ではないのですが、各フォルダの名前でPDFをまとめたいのと、出力先も指定したいです。

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

エラーの前段階です。

該当のソースコード

Python

1import img2pdf 2import glob 3 4file_path = "フォルダパス" 5files = glob.glob(file_path+"*.jpg") 6 7with open(file_path + "フォルダ名.pdf", "wb") as f1: 8 f1.write(img2pdf.convert([file for file in files]))

試したこと

上記のコードでフォルダ内に統合されたPDFを作ることはできましたが、その処理を各フォルダ毎に実行する術が思い浮かびません。
ご教授頂ければ幸いです。
どうかよろしくお願いいたします。

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

windows10
Python 3.8.5
anaconda

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下でいかがでしょうか。
指定のパス内のフォルダの一覧を取得しfor文で順番に処理を行っています。
今回はファイルが実行されているカレントディレクトリを指定しておりますが
パスについてはご自身でご指定ください。

python

1import os 2import glob 3 4cur_dir = os.getcwd() # カレントディレクトリ取得 5dirs = os.listdir(cur_dir) # 指定ディレクトリ内に存在するファイル、フォルダをリスト化 6 7for f in dirs: 8 # 対象がフォルダである場合にTrueが返り、if文内が実行される 9 if os.path.isdir(os.path.join(cur_dir, f)): 10 files = glob.glob(os.path.join(cur_dir, f, r"*.jpg")) 11 with open(os.path.join(cur_dir, f, f"{f}.pdf"), "wb") as f1: 12 f1.write(img2pdf.convert([file for file in files]))

追記 フォルダ内にある更なる階層のフォルダを対象にする方法について

一見複雑そうに見えますが、先日回答した処理を、更にフォルダ内でも行っているだけです。
以下では更にもう1階層分のフォルダを探して~という風にコードを書きましたが
この先あと何階層フォルダがあるのかわからないといった場合にはwhile文を書いて
指定したフォルダ内に更にフォルダがあるか・ないかを判定すれば良いでしょう。

import img2pdf import os import glob cur_dir = os.getcwd() # カレントディレクトリ取得 dirs = os.listdir(cur_dir) # 指定ディレクトリ内に存在するファイル、フォルダをリスト化 for f in dirs: # 対象がフォルダである場合にTrueが返り、if文内が実行される if os.path.isdir(os.path.join(cur_dir, f)): for sf in os.listdir(os.path.join(cur_dir,f)): if os.path.isdir(os.path.join(cur_dir, f, sf)): files = glob.glob(os.path.join(cur_dir, f, sf, r"*.jpg")) with open(os.path.join(cur_dir, f, sf, f"{sf}.pdf"), "wb") as f1: f1.write(img2pdf.convert([file for file in files])) files = glob.glob(os.path.join(cur_dir, f, r"*.jpg")) with open(os.path.join(cur_dir, f, f"{f}.pdf"), "wb") as f1: f1.write(img2pdf.convert([file for file in files]))

投稿2020/10/18 09:58

編集2020/10/19 03:05
nto

総合スコア1438

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

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

TomF

2020/10/18 12:17

教えて頂きありがとうございました。 無事解決できました! 参考までにお聞きしたいのですが、さらに下の階層にフォルダがあってその中にもjpgファイルがある場合はどう書けば良いのでしょうか。 カレントディレクトリを移動する他に方法があるのでしょうか。 厚かましくて申し訳ございませんが、余裕のある時に教えていただけたら幸いです。
nto

2020/10/19 03:06 編集

カレントディレクトリ内のフォルダを探してそれらを対象に処理を行った様に カレントディレクトリ内のフォルダ内でも同じ様にフォルダを探してそれらを対象に再帰的に処理を行えば良いと思います。 追記: 先日の回答にさらなるフォルダ内の検索方法を追記致しました。再帰的な方法では御座いませんが、再帰化する為の方法も記載しております。ご検証ください。
TomF

2020/10/19 06:44

なるほど、比較をすると理解しやすかったです。 解説も非常に丁寧で助かります。 初心者にも分かりやすく教えてくださりありがとうございました! すごく勉強になり、本当に助かりました! while文でも検証してみます。 またなにかつまづいたときにはよろしくお願いいたします。 ありがとうございました!
guest

0

https://qiita.com/hasepy/items/8e6a0757da1ce074ce87
こちらの記事の内容と組み合わせて巡回参照させてみてはいかがでしょうか?

投稿2020/10/18 09:48

yasutakatou

総合スコア446

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

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

TomF

2020/10/18 12:20

私もこちらの記事は一度読んだのですが、頭の出来が悪く理解できなかったんです。。。 もう一度じっくり読んで理解を深められるように色々やってみます。 ありがとうございました。
yasutakatou

2020/10/18 12:56

いえいえ。やりたいことのイメージあわせてからコードに落とし込みたいと思ってたのですけど 先に具体的に回答して頂ける方に解決策出してもらえてよかったですね!
TomF

2020/10/18 13:07

すみません、ありがとうございます! これから幾度となくつまづいて質問すると思いますので、その時はまたよろしくお願いいたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問