ファイル名を大文字から小文字に変換する

やりたいこと

大文字の拡張子でできた.pdf とかを自社のシステムにアップロードすると良くないことがおこるので、拡張子を小文字にしたい

原因

相手が勝手に.PDF とかで吐いてくるから(ドウシテ…

やり方

  • lower メソッド を使う(逆に大文字にしたいときはupper メソッドを使う)
# 使い方

print("Hello".lower())
>> hello

print("apple".upper())
>> APPLE
  • 実際のやり方
# ダウンロードしてきたときのファイル名 を小文字にする
filename = '20231216_BILL.PDF'
filename = filename1.lower()

# ダウンロードしたPDFファイル名をアップロード用に変更する
# ダウンロードディレクトリは download_dir
pdf_file_name_before = os.path.join(download_dir, filename)

# アップロード用に社名を頭につける
pdf_file_name = 'A社請求書_' + filename
pdf_file_name_after = os.path.join(download_dir, pdf_file_name)

#ダウンロードしたファイル名から、アップロード用にファイル名を変更する
os.rename(pdf_file_name_before, pdf_file_name_after) 

Windows環境でpython のzipfile ライブラリを使ったときに文字化けするのをなんとかしたい

やりたいこと

Windows環境でpython のzipfile ライブラリを使ったときに文字化けするのをなんとかしたい

そうは言っても相手側が勝手に送るzip なんでこっちで対策する必要がある場合

全部utf-8 で済ませられる人には関係ない話

原因

zipfile ライブラリがcp432 を使ってくるので、cp932 を使うようにzipfile ライブラリを書き換える

やり方

  • zipfile ライブラリを探せ

path ってうってpython.exe ある場所わかるから、↓のフォルダ開いたらLib フォルダ見つけられると思う

path
C:\Users\[ユーザ名]\AppData\Local\Programs\Python\Python38\ 
  • Lib フォルダ内の zipfile.py をコピペしてzipfileJPN.py にする

  • zipfileJPN.py をエディタで開いて cp437 を cp932 で置換

  • 保存

import zipfileJPN

exist_dir = '[展開したいフォルダ]'

#ZIP展開する(展開後元ZIPは削除する)
with zipfileJPN.ZipFile('sample.zip') as existing_zip:
    existing_zip.extractall(exist_dir)
os.remove('sample.zip')

pfx の証明書を使ってpython のrequests でクライアント証明書を使ったアクセスを行う

やりたいこと

pfx のクライアント証明書経由でアクセスする必要があるサイトをpython のrequests でアクセスしたい

前提知識

pfx の証明書はPKCS#12 に相当し、証明書や秘密鍵、中間証明書が同梱された証明書となっている。

requests の使い方をドキュメントで調べると…

You can also specify the local cert file either as a path or key value pair:

requests-docs-ja.readthedocs.io

>>> requests.get('https://kennethreitz.com', cert=('/path/server.crt', '/path/key'))
<Response [200]>

となっているので、crt とkey ファイルに分離すればいけそう。

上記のことから、pfx の証明書からpem 形式(非暗号化)に変換する必要がある。

証明書のエクスポート

PKCS#12(pfx)形式から、秘密鍵、公開鍵形式への変換方法

knowledge.digicert.com

  1. OpenSSLでPKCS#12形式から秘密鍵ファイルをエクスポートする

    ※要クライアント証明書のパスワード

    openssl pkcs12 -in <PKCS#12ファイル名> -nocerts -nodes -out <秘密鍵ファイル名>
    
  2. OpenSSLでPKCS#12形式から証明書ファイルをエクスポートする

    ※要クライアント証明書のパスワード

    openssl pkcs12 -in <PKCS#12ファイル名> -clcerts -nokeys -out <証明書ファイル名>
    
  3. OpenSSLでPKCS#12形式から中間CA証明書ファイルをエクスポートする

    (今回使っているpfx にはなかった)

    openssl pkcs12 -in <PKCS#12ファイル名> -cacerts -nokeys -out <中間CA証明書ファイル名>
    

実際にrequests に入れる

{証明書ファイル名} と {秘密鍵ファイル名} には↑で作成したそれぞれのファイルパスを指定する

import requests

URL =" {アクセスするURL} "
API_TOKEN=" {APIトークン} "

headers = {"X-Cybozu-API-Token":API_TOKEN,'X-Requested-With':'XMLHttpRequest'}
response =requests.get( URL , headers=headers,cert=('{証明書ファイル名}','{秘密鍵ファイル名}'))

無事にアクセスできました。

ブラーバ M6 iRobot アプリで追加できない問題(解決済)

既存ルンバが入っているiRobot アプリにブラーバM6 が追加できなかった。 Wifi に接続されないというエラーになる。(つながっている)

使っているスマホiPhone 12 Pro Max でどうにもならなかったので、 もう一台あるiPhoneSE2 に新しくiRobot アプリを追加し、 ブラーバを追加したら正常に認識、ロボットの管理自体はクラウド側の管理なので、 問題なくiPhone 12 Pro Max からも認識された。 すぐiPhoneSE2 のアプリは消した。

Python + Selenium でfileupload

Python + Selenium でfileupload しないといけないことがあったので、調べたのですが、日本語だと古い記事しか見つからなかったので、メモ。

開発環境 MacOS Catalina, Python3

XPath でファイルアップロードのinput 属性を指定して、send_keys でファイルパスを渡せばよい。

# アップロードするファイルパス
uploadfile = './file/uploadfile.pdf'
# ファイルアップロード
driver.find_element_by_xpath('//input[@type="file"]').send_keys(uploadfile)

# ファイルアップロード をクリック
driver.find_element_by_xpath('//*[@id="btn_upload"]/').click()

これが

これが
こうなって
こうなって

あとは、ファイルアップロードボタンをクリック(最後の行)すればupload できます。

python でjsonデータをHTML変換する

先日jsonからHTML変換して見た目をわかりやすくする必要があったので、それの覚え書きです。

開発環境 MacOS Catalina, Python3

json_to_html.py

# coding:utf-8
import json
from collections import OrderedDict
from jinja2 import Environment, FileSystemLoader,Template

#HTMLテンプレートファイルの読み込み
env = Environment(loader=FileSystemLoader('./', encoding='utf8'))
tmpl = env.get_template('./templates/template.tmlp')

#JSON ファイルの読み込み
json_open = open('test.json', 'r')
#順番どおり読むにはOrderedDict が必要
json_load = json.load(open('test.json',encoding='utf-8'),object_pairs_hook=OrderedDict)

print (json.dumps(json_load,indent=2,ensure_ascii=False))

#HTML テンプレートに値をセットする
html = tmpl.render(json_to_html= json_load)

#HTML に書き込む(UTF-8にしないと文字化けする)
with open('json_to_html.html',mode='w',encoding='utf-8') as f:
    f.write(str(html))
    
print(html)

内容は適当です。

test.json

[
{
  "list_A": "タイトル1",
  "list_B": "東京",
  "list_C": "晴れときどき曇り",
  "list_D": "20%",
  "list_E": "本州付近は高気圧に覆われています。"
}
,{
  "list_A": "タイトル2",
  "list_B": "埼玉",
  "list_C": "晴れ",
  "list_D": "10%",
  "list_E": "高気圧に覆われますが、湿った空気の影響を受ける見込みです。このため、曇りで夜遅くは雨の降る所があるでしょう。 "
}
,{
  "list_A": "タイトル3",
  "list_B": "千葉",
  "list_C": "曇り",
  "list_D": "0%",
  "list_E": "高波に注意してください。 "
}
]

template.tmlp

<!DOCTYPE html>
<html lang="ja">
<head>
    <title>JSON to HTML</title>
    <link rel="stylesheet" href="./html/style.css">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<body>   
<div id="container">
<article id="contents">
  <h1 class="title-webdesign">JSON からHTML 作成テスト</h1>

<!--for文 でJSONを繰り返す-->
{% for i in json_to_html %}
  <ul class="list-webdesign">
<div><p class="link-title-wd">{{ i.list_A }}</p>
<p>都道府県:{{i.list_B}}</p>
<p>天気:{{i.list_C}}</p>
<p>降水確率:{{i.list_D}}</p>
<p>その他:{{i.list_E}}</p>
</div>
</ul>

{% endfor %}
</article>

<table>
{% for i in json_to_html %}

  <tr>
    <th>タイトル</th>
    <td>{{i.list_A}}</td>
  </tr>
  <tr>
    <th>都道府県</th>
    <td>{{i.list_B}}</td>
  </tr>
  <tr>
    <th>天気</th>
    <td>{{i.list_C}}</td>
  </tr>
  <tr>
    <th>降水確率</th>
    <td>{{i.list_D}}</td>
  </tr>
  <tr>
    <th>その他</th>
    <td>{{i.list_E}}</td>
  </tr>
{% endfor %}
</table>






</body>
</html>

実行方法

$ python3 json_to_html.py

私は旧世代の人間なので、print で出力確認しながらHTMLファイルを作成しています。

HTMLを開けばこんな感じになります。

CSS は適当です。

f:id:ruepon:20210211072810p:plain
出力例