とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub
スポンサードリンク

サボり

今月のサボり記事

PowerShellで"dir /b"コマンドを打つとエラーになった

PowerShellでファイルの一覧を得る


Windows 10になってから、フォルダ内でShiftと右クリックを押して出てくる「コマンドウィンドウをここで開く」が消えた。
かわりに「PowerShellをここで開く」になった。

ということは、慣れ親しんだコマンドウィンドウがお手軽に起動できなくなり、PowerShellをお手軽に使えるようにならないといけないわけです。
dirコマンド。。。便利なのになぁ。

PowerShellでdirを呼び出す


PowerShellでは、『動詞-述語』というようにコマンドが定義されている。
そのため、やりたい事をなんとなく探すには便利です。
また、コマンドウィンドウとの互換性をなんとか保つために、aliasというコマンドに対する別名が定義されています。

PowerShell上でaliasと打つと、その定義一覧が表示されます(めちゃくちゃあるので割愛)

もちろんdirコマンド(風)も定義されていて、その実態はGet-ChildItemコマンドのようです。
dir -> Get-ChildItem

PowerShellにおけるdir は、Get-ChildItemの別名なので、もちろんいままでどおり
dir /b

なんて打ち込んでもエラーになります。
PowerShellで dir /b したらエラーになった

Get-ChildItemのパラメータ


日本語のヘルプは見つけられませんでしたが、オンラインヘルプがコマンドラインよりは充実しています。
Get-ChildItem
これによると、
「-name」パラメーターが/bに該当するパラメータのようです。

さっそく、dir -name と打ち込んでみます。
Example 5: Get the name of items in the current directory

PowerShellで dir /b したらエラーになった

できました。

PowerShellに慣れていくべし


さて、Windows 7以降何かとPowerShell推しなマイクロソフトさんですが
とっつきにくかったPowerShellはどんどんパワーアップして、コマンドラインの新機能は停滞していきます。

そうなると、いつかは 「とっつきにくい < 便利」 になり、コマンドラインが時代遅れになっていく日も近いかもしれません。
最悪の場合、コマンドラインは廃止なんてことにもなりかねません。
mspaintも paint3dに変わったしね。

というわけで、コマンドラインを使っていた方はそろそろ見切りをつけて、PowerShellに馴染んでいくことを強くおすすめします。

Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

WindowsでPython シリーズ その30


今回はPythonにコマンドライン引数を渡す処理の延長で
右クリック→送る メニューにpythonプログラムを登録する方法を記載します。

pythonを送るメニューに登録する


windowsのファイルを右クリックし、「送る」メニューに任意のファイルを指定ためには、「送る」フォルダにファイルを配置します。
まずは「送る」フォルダを開くためにコマンドを実行します。
Windowsボタン + Rでファイル名を指定してsendtoフォルダを開きます。
shell:sendto

Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

sendtoフォルダにpythonファイルを配置
Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

このpythonファイルには、とりあえず渡された引数を表示するだけのプログラムを書いています。


ファイルを右クリックしてメニューを確認


さっそく、送るメニューに表示されているか確認してみます。
Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

ない・・・

どうやらpythonは送るメニューに表示されないようです。
恐らくwindows側の設定でなんとかなるのかもしれませんが、今回はバッチファイル化してお目当ての挙動にします。

pythonを呼び出すバッチファイルをsendtoフォルダに作成する


バッチファイルであれば「送る」メニューに表示されるので、sendtoフォルダにはバッチファイルを作成し、
そのバッチファイルからpythonを呼び出します。

pythonのコード


バッチファイルのコード

バッチファイルは、引数 %1 が自分のパスで、%* とすると、第1引数以降の引数を全部取得できます。
E:\work\main.py %*
と書くことで、pythonにバッチファイルに渡された引数全部を送りつけます。

念のため、右クリックメニューに表示されるか見てみます。
Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

ちゃんと送るメニューに表示されました。

メニューから送られる引数の正体


ファイルを右クリックして、「送る」メニューを選択すると、右クリックしたファイルのフルパスが引数として渡されます。
では、ファイルを3つほど選択して、送ってみましょう。
Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

今回は、ファイルを3つ選択しています。
それぞれ 01.txt、02.txt、03.txt を選んで、python.batに送ってみた結果はこちら。

Pythonファイルをsendtoフォルダに配置して「送る」メニューに登録する

引数が4つechoされました。期待通りの結果です。

['E:\\work\\main.py', 'E:\\work\\01.txt', 'E:\\work\\02.txt', 'E:\\work\\03.txt']

3ファイル渡したのに4ファイル表示されているのは、pythonプログラムであるmain.pyの処理が、
pythonプログラム自身のフルパスを表示しているからです。

送られたファイルに対する処理


さて、送ることでファイルのフルパスを引数に指定することができました。
これさえできれば、後は渡されたファイルパスを圧縮したり、中身を読んだり・・・
windowsと連携して色々できそうですね。

テーマ:プログラミング - ジャンル:コンピュータ

Pythonでコマンラインド引数を扱う

WindowsでPython シリーズ その29


とうとうPythonでコマンドライン引数を扱う時が来た!
これはもうレベル的にPythonをバッチファイルと同じ感覚で利用できる日が近いことを意味しますね!

Pythonでコマンドライン引数の扱い方


このシリーズは、そもそもPythonを使ってWindowsアプリを作りたいという想いから始まっています。
今回、ようやくPythonにWindows側からコマンドライン引数を渡して処理する方法を学びます。

Pythonにおいて、コマンドライン引数を扱う場合は
sys.argv を使います。

sysオブジェクトを使うには、
import sys をファイル冒頭に宣言する必要があります。

それでは早速sys.argv を使って引数を扱ってみましょう。


まずは至ってシンプルなコード。
コマンドライン引数をただprintするだけのコードです。

実行してみます。
Pythonでコマンド引数を扱う

引数が表示ささました。
[]でくくられています。
Pythonにおいて、コマンドライン引数はリストとして扱われるようです。

引数の内容を見てみましょう。

まずコマンドラインで指定したのは 1,2,3,4なのに、'E:\\work\\main.py' と表示されています。
これは実行したファイルのフルパスですが、Windows環境におけるPythonの引数0は実行パスが入っているということですね。

引数を処理するコード


Pythonでコマンドライン引数を受け取るプログラムを作るにあたって、
渡された引数をぶん回す処理を書いてみます。


これは、引数をとりあえずintに変換させて、表示するプログラムです。
intに変換出来ない場合は例外としてキャッチし、そのままcontinueしてエラーの内容を表示して、ループを継続させています。

実行結果はこちら
Pythonでコマンド引数を扱う

引数に1 2 3 a 4と渡しています。
数値ではない引数0番目の実行パスと「a」はエラーになるはず。

思いの通り表示されています。

プログラムコードの8行目
print("index:{0} value:{1} エラー発生:{2}".\
としているところ、これは本来であれば
print("index:{0} value:{1} エラー発生:{2}".format(i, v, str(type(err))))
と書きたいのですが、1行が長くなりすぎるので、次の行もプログラムの続きですよという「\」を付けて次の行に改行させています。
こうすることで、1行のプログラムを次の行に続けることができます。
見栄えの問題です。
C#で例えると「_」に該当します。

Pythonでコマンドライン引数を扱えるようになったら・・・


さて、今回の勉強でコマンドライン引数を扱う事ができるようになりました。

これで何ができるんか?っていうと、例えばファイルのパスを引き渡して、それを圧縮するなり、
加工するなり、動的にコネコネすることができるんですよ。
これってもうバッチファイルと同じ程度には何かできそうな予感がしませんか?

私はします。
夢が広がりますよね!

ファイルを右クリックして、「送る」フォルダにPythonプログラムを指定して、Pythonでファイルを圧縮する・・・
なんてこともできるかも。
できるでしょ。

テーマ:プログラミング - ジャンル:コンピュータ

Python ファイルを1行ずつ読んで改行を消す

WindowsでPython シリーズ その28



今回はファイルを1行ずつ読む方法です。
前回までのファイルの読み方は、
ファイルの中身を一気に変数に取り込む方法でした。
#2.テキストを読む
s1 = f.read()
read()関数は、ファイルの中身を一気に変数に格納します。

ファイルの中身が膨大な時、これでは都合が悪い時があります。
メモリ不足に陥るのですね。

ファイルを1行ずつ読む


ファイルを1行ずつ読むことでメモリ不足に対処します。
ここでいう1行とは、改行コードまでです。
WindowsでいうとCRLFつまり\r\nまでなので、バイナリデータを読む場合には適用できませんが、
それでも何らかのテキストファイルを処理する時には大いに役立つはずです。

enumerateを使う


ファイルを1行ずつ読む方法は、enumerateにopenしたファイルオブジェクトを指定します。
このあたりは、リストとかタプルでやりました。
要するに、「行番号:1行の文字列」を返してくれます。

コードを書いてみます。


読み込むテキストファイルはこんなの
AAAAA
BBBBB
CCCCC
DDDDD
NGEEE
FFFFF


※FFFFFの後ろにも改行があります。

実行結果

Python ファイルを1行ずつ読んで改行を消す

なんかいやな改行が出てますね。
テキストファイルに改行が含まれているので、それがそのまま出力されているようです。

改行を消して出力する


改行なしで出力したいので、改行コードを消して表示させます。
ついでに"NG"と記載のある行は表示しないようにさせます。


実行結果
Python ファイルを1行ずつ読んで改行を消す

ちょうどNGから始まる行は除外されて表示されました。
そして改行も消えてますね。

キモはlineをスライスしている[:-1]です。
その7(スライスってなんぞ)で説明した画像を見てください。
WindowsでPython その7(スライスってなんぞ)
-1は、「末尾から一つ手前の場所まで」ということなので、改行を覗いて表示されています。
注意点は、末尾に改行がなかった場合はFFFFFがFFFFとなって表示されてしまうことです。

そうしないためには、replaceで改行を除去する方法が良いかと思いますが、
ちょっとPythonらしく書くためにあえてスライスを使ってみました。

おまけ


コードにfind関数を使っています。
これは指定した文字列のIndexを返す関数なので、
line.find("NG") == -1:
で"NG"が見つからなければprintするということになっています。

1行ずつ読むことで、ファイルの中身を判断しながら、何かゴニョゴニョできそうですね。
将来的にはS-JISを他の文字コードに変換するようなプログラムを組みたいと思ってますので、今回はその布石でした。

それでは!
次のページ

FC2Ad