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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1773閲覧

python: 画像リストのテーブルを作成してhtml上で表示したい

Sayuki

総合スコア21

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/06/28 17:28

前提・実現したいこと

2組の画像リストをhtmlで出力したいと考えています。
複数出力するので、テーブル形式で出力したいと考え、下のindex.pyのcreate_tableという関数でhtml形式のテーブルを作り、--table--を書き換えようと思っています。

訳あって、実行環境はオフラインで、そのhtmlはローカルで表示します。

cgiのサーバを立て、htmlのテーブルをpythonで更新してlocalhostで表示しようとしています。

フォルダ構成(見づらくてすいません。)
root
-cgi-bin
--index.py
-cgiserver.py
-res
--test1
---a.png
---b.png
--test2
---a.png
---b.png

問題点

ループでリストを作るとうまくいきませんが、その出力結果をターミナルからコピーしてリストをハードコードするとうまく表示されます。

ループで作ったリスト(table_data1)とハードコードされたリスト(table_data2)に違いがないかも確認しましたが、Trueと返ってきました。

お手数ですが、間違っている点を指摘いただければ幸いです。
よろしくお願いいたします。

該当のソースコード

cgiserver.py

python

1import http.server 2import subprocess 3 4http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler) 5subprocess.call('python -m http.server --cgi')

index.py

import glob import pathlib print('Content-type: text/html; charset=UTF-8\r\n') html = """ <!DOCTYPE html> <html> <meta charset="utf-8"> <head> <title>Images List</title> </head> <body> <h1>aaa</h1> <h2>Images</h2> --table-- </body> </html> """ def create_table(table_data): rows = '' for case in table_data: columns = '' for cell in case: columns += "\t\t\t\t<td><img src='{}'></td>\n".format(cell) rows += "\t\t\t<tr>\n{}\t\t\t</tr>\n".format(columns) table = "<table>\n{}\n\t\t</table>".format(rows) return table test1_dir = '../res/test1/' test2_dir = '../res/test2/' test1_images = sorted([pathlib.Path(f).name for f in glob.glob(test1_dir + '*.png')]) test2_images = sorted([pathlib.Path(f).name for f in glob.glob(test2_dir + '*.png')]) #test1にもtest2にもあるファイルだけ抽出する。 to_be_listed = set(test1_images) | set(test2_images) table_data1 = [[test1_dir + case_name, test2_dir + case_name] for case_name in to_be_listed] table_data2 = [['../res/test1/a.png', '../res/test2/a.png'], ['../res/test1/b.png', '../res/test2/b.png']] table_html = create_table(table_data1) html = html.replace('--table--', table_html) # display the html print(html)

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

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

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

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

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

y_shinoda

2020/06/28 20:24

1 > ループでリストを作るとうまくいきませんが どのようにうまくいきませんでしたか? 出力結果を質問欄に次の MarkDown で追記お願いします ```console (ここにうまくいかなかったときの出力結果を記載) ``` 2 >ループで作ったリスト(table_data1)とハードコードされたリスト(table_data2)に違いがないかも確認しましたが、Trueと返ってきました。 どのように違いがないかを確認した結果、Trueと返ってきましたか? 確認した方法を質問欄に追記お願いします Python コードの場合は次の MarkDown で追記お願いします: ```python (ここに Python コードを記載) ```
guest

回答2

0

python

1test1_dir = '../res/test1/' 2test2_dir = '../res/test2/' 3 4test1_images = sorted([pathlib.Path(f).name for f in glob.glob(test1_dir + '*.png')]) 5test2_images = sorted([pathlib.Path(f).name for f in glob.glob(test2_dir + '*.png')])

glob を行うとき、ファイルを相対パスで指定していますが、
この相対パスの基準となる位置は python コマンドを実行した位置となります

/rootcgiserver.py を実行した場合、
相対パスの基準となる位置が /root になっている可能性があり、
その場合、ファイルが glob できません

少なくとも、/root/cgi-binindex.py を実行すれば
次のような結果が得られます:

console

1$ cd /root/cgi-bin 2$ python index.py 3Content-type: text/html; charset=UTF-8 4 5 6<!DOCTYPE html> 7<html> 8 <meta charset="utf-8"> 9 <head> 10 <title>Images List</title> 11 </head> 12 <body> 13 <h1>aaa</h1> 14 <h2>Images</h2> 15 <table> 16 <tr> 17 <td><img src='../res/test1/b.png'></td> 18 <td><img src='../res/test2/b.png'></td> 19 </tr> 20 <tr> 21 <td><img src='../res/test1/a.png'></td> 22 <td><img src='../res/test2/a.png'></td> 23 </tr> 24 25 </table> 26 </body> 27</html>

投稿2020/06/28 20:10

y_shinoda

総合スコア3272

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

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

Sayuki

2020/06/29 22:49

ご丁寧に対応いただきありがとうございます! パスの話をしていただいたおかげで誤りに気付きました。 助かりました。
guest

0

自己解決

すごく初歩的なミスでした。

  • rootでcgiserver.pyをcgiサーバを立ち上げているので、カレントディレクトリはrootなので、globしたらrootからの相対パスになっている。

  • htmlはroot/cgi-bin/にあるので、相対パスを修正する必要がある。(これが抜けていました。)

注意点

  • 絶対パスで書く方法と、ローカルなファイルにアクセスできないと言われるので相対パスで書く必要がある。

(ドキュメントルートの外にアクセスする場合にはそのための対応が必要になる。)

投稿2020/06/29 22:46

Sayuki

総合スコア21

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問