仕事メモとか

仕事中に調べた情報とか知ったことをメモしています。
unixコマンド, vim, oracle, putty, postgresql, bash, EXCEL, python, SQL全般 など。
最近は tableau, movabletype とかも触ったりしています。
雑な読書感想とかはこちら


pythonでZipFileを使ってzip圧縮したらディレクトリ構造まで付いてきたので、ファイルだけにしたい

元々カレントの場所に出力するプログラムを作っていたのですが、
zip圧縮するなら元のファイルは消さないとなー、
くらいに思っていたのですが、

TemporaryDirectoryという素晴らしいものがありまして。

これを使うと一時的に使えるディレクトリが作成できます。
使い終わったら消えます。便利。

んで本題。
出力pathを指定したところ、zip圧縮した中身のファイルもディレクトリ構造をそのまま持ってきちゃいまして。

例)
{TemporaryDirectory}/outfile_{today_str}.csv
をzipにそのまま放り込んだら、「{TemporaryDirectory}/」がそのまま付いてきた。

これを解消する方法を調べたら、
arcnameで入れるファイル名の階層を指定できるので、ファイル名だけをそのまま指定すれば、
zipファイルの中に直接ファイルを入れられる、ということが分かりました。


with TemporaryDirectory() as tempdir:

out_file_name = f'outfile_{today_str}.csv'
out_file_name_zip = f'outfile_{today_str}.zip'
to_csv(df, Path(tempdir) / out_file_name) -- dfをファイルに出力する部分

with ZipFile(out_file_name_zip, 'w') as out_zip:
out_zip.write(Path(tempdir) / out_file_name, arcname=out_file_name)



逆にarcnameにディレクトリ構造を指定することもできるので、
込み入ったディレクトリ構造をzipに入れるタイミングで制御することもできます(あんまり要望無さそう)
このエントリーをはてなブックマークに追加

pythonでテスト実行した際、EUC-JP使ってないのに、INTERNALERROR> UnicodeEncodeError:
'euc_jp'... っていうエラーがでた

はい、pythonでプログラムを書いてるのですが、未だによくわからないことが発生します。
今回のお題はこちら。

テスト実行したら、こんなんが出た。

INTERNALERROR> UnicodeEncodeError: 'euc_jp' codec can't encode
character '\u9ad9' in position xx: illegal multibyte sequence

●環境
プログラム:python 3.7
エディタ:IntelliJ
テスト環境:IntelliJ組み込みのpytest

●文字コード
テスト対象、テスト用プログラム両方ともUTF-8

●テスト内容
特殊文字のテストもしたかったので、髙(通称、はしごだか)を入れた


テスト実行してみたところ、上記のようなエラーが出ました。
\u9ad9は「髙」なので、これをEUC-JPにしようとしてエラーになりました、とのことなのですが、
そもそもプログラム全部UTF-8なのに? と。

結論から書きますが、IntelliJの基本設定をEUC-JPに変更していることが原因でした。

●設定
[IntelliJ]-[Preferences]-[Editor]-[FileEncodings]

ここのProjectEncodingが「EUC-JP」になっていました。
(デフォルトはUTF-8っぽいのですが、読み込むファイルがEUC-JPが多かったので、変更していたことが原因です。


●解消方法
1.ProjectEncodingは「SystemDefault: UTF-8」に戻します。
2.良く開くファイルはやはりEUC-JPとして開きたいので、そのディレクトリだけ直接指定(下の+ボタンで個別追加)

これで解消できました。
このエントリーをはてなブックマークに追加


IntelliJ で、gitを何度も作るときに簡単にしたスタートコマンド

はい、gitになって管理が堅牢になったんですが、毎回ブランチ立てるのは面倒。
でも必要なことなので、ブランチ作るの簡単にしたコマンドを用意しました。

●git_startコマンド作成

#!/bin/sh
set -eu

PROG_ID="$1"
FEATURE="${2:-test_program}" #ブランチ名

# masterの最新を取得
git checkout master 1>/dev/null 2>/dev/null
git pull 1>/dev/null 2>/dev/null

# ブランチ名を自動作成してブランチ作成
BRANCH_NAME="feature/${PROG_ID}_${FEATURE}"
git checkout -b ${BRANCH_NAME}
git push --set-upstream origin ${BRANCH_NAME}

echo "created complete. ${BRANCH_NAME}"


●git_startコマンドを自分のbinのところに置く
${HOME}/bin
に、git_startを配置

●git_startに実行権限を付ける
chmod 775 git_start

●自分の作ったbinにPATHを通す
.bash_profile

export PATH="~~"に足す
その後、
source ~/.bash_profile で再読み込み

●IntelliJのターミナルで起動
source ~/.bash_profile でこちらでも再読み込み
git_start {プログラム番号} {プログラム名とか}


こうすることで「feature/」のスペルってなんだっけ? って毎回思わずに済みます。
(そして打たないので、またfeatureのスペルを忘れます)
このエントリーをはてなブックマークに追加

pandasで、データフレームに対し、同様のフォーマットだったら全部置換したい、的な手法=applymap

はい、データフレーム使ってますか?
便利ですね、pandas。

ということで、今回の要件はこんな感じです。

要件:
データフレーム上では全てのデータをそのまま扱いたいが、
csvなどで出力するときは日付のフォーマットを全部固定差し替えしたい。

調べてみると、applymapというものが使えそうなんですが、これ指定の仕方がちょっと面白い。

df = df.applymap(function)

直接、function(関数)をぶっこみます。
ここで指定する関数はlambdaでも、defでもよいのですが、こんな感じになります。


def _format_date_time(value):
if isinstance(value, datetime):
return value.strftime('%Y/%m/%d')
else:
return value


formatted = {変換したいdf}.applymap(_format_date_time)

このようにすることで、内部関数「_format_date_time」をapplymapに突っ込んで、
変換したいdfの中身のうち、datetime型のものだけ出力を「YYYY/MM/DD」型に置換します。

慣れるとかなり強力です。
このエントリーをはてなブックマークに追加


lnコマンドでディレクトリのシンボリックリンクを張り替え

はい、ディレクトリ構成を変更したので、
シンボリックリンクの向き先を変更するにはどうすればいいんだろう、と調べました。
一旦消して~とも思ったんですが、リンクを消すときに間違えてリンク先の実態が消えそうで
本当怖い。

なので向き先だけを変更すればいいのでは? と思って調べたら、ちょうどいいのありました。


ln -nfs {向き先} {リンク名}

オプションの意味
-n:ディレクトリでも指定OK
-f:リンクファイルと同名のファイルがあったら上書き
-s:シンボリックリンク作成

利用頻度が少なすぎて、あんまり覚えてられないのでメモ。


参考:
https://qiita.com/takeoverjp/items/bb1576e90a8a495db4b3
https://www.atmarkit.co.jp/ait/articles/1605/30/news022.html
このエントリーをはてなブックマークに追加

↑このページのトップヘ