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

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

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

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

Q&A

解決済

1回答

1807閲覧

JPG画像が入ったフォルダからのGIF画像作製を複数フォルダ一括で行いたい

hisui-mo

総合スコア1

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

0グッド

0クリップ

投稿2021/10/05 11:11

前提・実現したいこと

カレントディレクトリにJPG画像を含んだフォルダがあり、そのフォルダごとのGIF画像を一括で作りたいです。
一つのフォルダ内のJPG画像群からGIF画像を創る関数を定義して、カレントディレクトリ内の全部のフォルダでforループすることを考えたのですが、うまくいきません。
エラーは出ないですが、ループしてるはずなのに、”{cap}”という一つのGIFファイルしか出力されません。

初歩的な質問で申し訳ありません…
よろしくお願いいたします。

該当のソースコード

python

1# GIFアニメーションを作成 2def create_gif(in_dir, out_filename): 3 path_list = sorted(glob.glob(os.path.join(*[in_dir, '*']))) # ファイルパスをソートしてリストする 4 imgs = [] # 画像をappendするための空配列を定義 5 6 # ファイルのフルパスからファイル名と拡張子を抽出 7 for i in range(len(path_list)): 8 img = Image.open(path_list[i]) # 画像ファイルを1つずつ開く 9 imgs.append(img) # 画像をappendで配列に格納していく 10 11 # appendした画像配列をGIFにする。durationで持続時間、loopでループ数を指定可能。 12 imgs[0].save(out_filename, 13 save_all=True, 14 append_images=imgs[1:], 15 optimize=False, 16 duration=50, 17 loop=0) 18 19cur_dir = os.getcwd() # カレントディレクトリ取得 20dirs = os.listdir(cur_dir) # 指定ディレクトリ内に存在するファイル、フォルダをリスト化 21 22for cap in dirs: 23 create_gif(in_dir = cap, out_filename = '{cap}.gif')

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

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

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

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

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

guest

回答1

0

ベストアンサー

まずは複数フォルダ一括で、ということは考えないで、一つのフォルダだけでGIFの作成を行いましょう。
それがきちんとできてから、複数フォルダでするようにしていけばよろしい。

投稿2021/10/05 11:14

y_waiwai

総合スコア87719

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

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

hisui-mo

2021/10/05 11:17

記述不足ですみません。それはできました。 しかし、データが膨大なのでステップアップとして勉強しております。 よろしくお願いいたします。
y_waiwai

2021/10/05 11:21

> out_filename = '{cap}.gif' '{cap}.gif'という名前のファイルに上書きしていってますが、これどーにかしましょう そりゃファイル一つしかできませんよ
hisui-mo

2021/10/05 11:31

なるほど、同じ名前のファイルに何度も上書きしてしまっていたわけですね。 命名の一部を変数にすることはできないのでしょうか…? 下記の書き方で大括弧やフォーマット文字列を試してみましたがうまくいきませんでした… > out_filename = '[cap].gif' > out_filename = 'f"{cap}.gif"'
y_waiwai

2021/10/05 11:41

変数にそのファイル名いれて、その上で関数に渡せば。
y_waiwai

2021/10/05 11:42

out_filename = f"{cap}.gif" でしょう
hisui-mo

2021/10/06 03:30

シングルクオーテーションが要らなかったんですね。 ありがとうございます。 変数としての記述の仕方がどう良くなかったかは分かったのですが、以下のような新たなエラーが出るようになってしまいました… もう一度forループなしで一つのフォルダに対して関数を実行してみたところ、うまく動いたので、関数はこのままでfor文を直せばいいのかなの思うのですが、どう直せばよいのかわかりません、ご助言いただけないでしょうか?? for文ではループの一つ一つが独立してないのでしょうか?? --------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-3-b0759ecbb285> in <module> 4 5 for cap in dirs: ----> 6 create_gif(in_dir = cap, out_filename = f"{cap}.gif") <ipython-input-2-14889f7c3f9c> in create_gif(in_dir, out_filename) 10 11 # appendした画像配列をGIFにする。durationで持続時間、loopでループ数を指定可能。 ---> 12 imgs[0].save(out_filename, 13 save_all=True, 14 append_images=imgs[1:], IndexError: list index out of range
y_waiwai

2021/10/06 06:02

そこのimgsが空なのでは そこで止めて各変数のナカミをチェックしてみては
hisui-mo

2021/10/06 07:00

for文を途中で止めるとは、ループを抜けるといういみでしょうか?
y_waiwai

2021/10/06 07:11

pythonの開発環境を探せば、任意の行で実行を止めて変数のナカミを確認できるようなものもあります エキスパートはそういうツールで開発を行ってます。 って、いきなりそれは無理なようなので、 とりあえずそこで、print(imgs) でもおいて、どういう表示のときにコケてるのか、とかで調べてみては
hisui-mo

2021/10/06 08:48

print(imgs)やimgsで表示させてみたんですが、not definedでした… 関数内の定義って関数内でしか反映されない仕組みなのでしょうか… もう一つ質問させてくださいm(__)m dirsは定数ではないのでしょうか? > dirs = os.listdir(cur_dir) の定義はfor文の前ですが、forループでcur_dirの中身が改変されていくとすでに定義されているdirも変わっていくのでしょうか??
y_waiwai

2021/10/06 11:49

ならこんどは、forのなかでiをプリントしてみたらどうなるでしょう こんなことになってる!で思考停止せずに、なにがどうなったらそんな結果になるのかを考えていきましょう。 プログラムは、書いたひとの思うように動くのじゃありません。 書いているとおりにしか動きません
hisui-mo

2021/10/07 01:13

なるほど、そうやって確かめるんですね。 勉強になりました。 質問していた件ですが、 > IndexError: list index out of range のエラーは最後まで消えなかったですが、何回かやっていたら出力してくれました。 ありがとうございました。 処理を実行するフォルダにGIFを出力していたので、出力したGIFに対して処理ができないという意味のエラーだったのかもしれませんし、 無線のオンライン上のHDDにカレントディレクトリを置いていたのでそことのコネクトが一時的に上手くいっていなかったのかもしれません。 こんな風になってるのかなとか、いろいろと仮説を立ててみるのですが、プログラムでそれを実証する方法が分からないことが多々あり、今後もこのサービスに教えを乞うことがあるかと思います。 あまり難しい質問はまだまだ投げれないと思いますので、また今回のように助言を頂けましたら幸いです。 今後ともよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問