Archive for the ‘Python’ Category

neovimを使っていて、:HealthCheckを実行時、python3はOKなのにpython2はエラーが出ていた。
python3とpython2、どちらもOKじゃないと問題がないかはわからなかったが、とりあえずエラーが出ている状態というのは気持ちがいいものではないので解決した

環境:
os:Linux Ubuntu18.04LTS
python2:2.7.16
python3:3.7.2

このサーバーではpythonのバージョン管理にpyenvを使っている。

記事執筆時に新しいバージョンだったpython2とpython3を導入している
それぞれ環境のところに書いてあるpythonをpyenvを使ってインストールをした。

その後、~/.config/nvim/init.vimに下記の記述を追加


let g:python_host_prog = expand('~/.pyenv/versions/2.7.16/bin/python2')
let g:python3_host_prog = expand('~/.pyenv/versions/3.7.2/bin/python3')

これで:CheckHealthをするとエラーは消えた

バージョンを直で書くのはよくないとかいう声も聞こえてきそうだけれど、とりあえずはこれでよし

(本当の問題は別のプラグインがまともに動いてくれていなくて、これがpython2がうまく動かないことに起因しているのかを確かめたかったのです)

下記記事を参考にさせていただきました。ありがとうございます。

init.nvim にpython のpath を指定してneovim の起動速度を早くする - Qiita

python-logo-master-v3-TM

先日Linux上でPythonのプログラムを開発していた時にディレクトリの中の画像ファイル一覧を取得したいなあと思う事がありました。

ディレクトリの中にはテキストファイルや、csvファイルが同時に含まれていたのですが、画像ファイルの一覧だけをリスト化したいなあと。

という事でどうやって解決したのかをここに記して置こうと思います。

import commands
jpgList = []
jpgList =  commands.getoutput("ls targetPath | grep *.jpg").split("\n")

osモジュールのlistdir()メソッドとかでもディレクトリとファイルの参照が出来るようですが、使い慣れたbashの出力をそのままゲット出来るcommands.getoutput()メソッドの方が便利だなと私は感じました。

このメソッドに文字列を渡すとカレントディレクトリでシェルコマンドを実行、返り値を取得する事ができます。

次のsplit()メソッドがキモなのですが、lsの返り値は"\n"で区切られています。

適当なファイルのあるディレクトリ内で

ls > result.txt
less result.txt

とやってみれば改行がIFS(内部フィールド区切り文字 (Internal Field Separator))となっている事が分かると思います。

よって、split("\n")で改行によって分割、リスト化してあげればlsの返り値を簡単にリスト化する事が出来るというワケです。

読者諸兄におかれましては蛇足となりましょうが、 "| grep *.jpg" によってファイル末尾(拡張子)が".jpg"のファイル群のみをリストアップするようにする事でjpgファイルらのみをリスト化しております。

python-logo-master-v3-TM

Pythonでは文字列型に文字を挿入するメソッドが存在しないようですね。
リスト型に挿入する方法はあるのですが・・・。

まあここらへんは各々ハックされていらっしゃる事だと存じますが、
今回私が使った手法をご紹介させていただこうとおもいます。

例えば 
"http://www.example.jp/0/1/700/500.1.jpg"という文字列があったとして
文字列中の"/1/"の部分を"/7/"に変更したいとします。
これだけなら.replace()メソッドを使う事で実現できてしまうのですが、もしも文字列が
"http://www.example.jp/1/1/700/500.1.jpg"
であった場合、"/1/"は2つ存在する事になり、両方とも置換されてしまいます。
この様な動作が目的に沿わない場合もある事でしょう。

こういうケースの場合以下の様に書く事によって、任意の場所の文字列を変更する事が可能です。

src = "http://www.example.jp/0/1/700/500.1.jpg"

#文字列の末尾から"/1/"を検索、その場所を確保
idx = src.rfind(r'/1/')

#ここがキモです。pythonでは文字列は非破壊なので、新しい変数を用意する必要があります。
#スライスを使って文字列srcのidxまでの文字列を取得、そこに"/7/"を加えて、更にスライスを用いてidx+3(+3は"/7/"の3文字を表す)より後の文字列を結合させています。
result = src[:idx] + "/7/" + src[idx+3:]

以上の方法によって私は、文字列の挿入を可能としました。

文字列の「スライス」の方法は以下に詳しく書いてあります。
スライスを使った部分文字列の取得