Python3関連のことを調べてみた2020年01月17日

Python3関連のことを調べてみた2020年01月17日

HDF5のpython実装で文字列データを圧縮して保存するだけ

# これは何

HDF5でPython実装から文字列を圧縮して保存したいとき、 `str` ではなく 固定長 `bytes` を使いましょう。 `str` や可変長配列は圧縮されずに保存されている可能性があります。

# 経緯

あるとき、文字列データ(というか計算結果の出力ファイル)をHDF5形式でまとめておこうと思い立ちました。
せっかくなので容量節約のため、圧縮もかけておきたいと思います。

文字列長は不定なので、固定長は使わない方向で。

http://docs.h5py.org/en/stable/strings.html

こちらを参考にしつつ、

“`python
test_string = “hoge”*5
with h5py.File(“test.hdf5”, “w”) as f:
g = f.require_group(“test_group”)
# dt = h5py.special_dtype(vlen=str)
dt = h5py.string_dtype()
ds = g.cr

元記事を表示

[Python3 入門 10日目] 5章 Pyの化粧箱:モジュール、パッケージ、プログラム(5.4〜5.7)

#5.5 Python標準ライブラリ

– Pythonには様々な」役に立つ仕事をしてくれるモジュールを集めた大規模な標準ライブラリがある。

##5.5.1 setdefault()とdefaultdict()による存在しないキーの処理

– 存在しないキーで辞書にアクセスしようとすると例外が生成される。辞書のget()関数を使って、キーが存在しない場合はデフォルト値を返すようにすれば例外を避けられる。
– setdefault()関数はget()と似ているがキーがなければ更に辞書に要素を追加するところが異なる。
– defaultdict()関数は存在しない全てのキーに対してデフォルトの値を設定するところがget()と異なる。**引数は関数である。**また、存在しないキーを用いた場合、そのキーが自動で生成される。デフォルト値引数を省略するとデフォルト値はNoneになる。

“`py

>>> periodic_table={“Hydrogen”:1,”Helium”:2}
>>> print(periodic_table)
{‘Hydrogen’: 1, ‘Helium’: 2

元記事を表示

ジェネレーター内包表記 タプル内包表記

“`py:1
def g():
for i in range(10):
yield i

g = g()
print(next(g))
print(next(g))
print(next(g))
“`

“`:1の実行結果
0
1
2
“`
これを内包表記で書くと

“`py:ジェネレーター内包表記
g = (i for i in range(10))

for j in range(3):
print(next(g))
“`

“`:ジェネレーター内包表記の実行結果
0
1
2
“`

()で囲っているので一見、
タプルの様にも見えなくはない。
タプルの内包表記は下記の様になる。

“`py:タプルの内包表記
t = tuple(i for i in range(10))
print(t)
“`

“`:タプルの内包表記実行結果
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
“`

“`py:ジェネレーター内包表記2
g = (i for i in range(10))

for j in g:
pri

元記事を表示

関数内で例外が発生した場合、呼び出し元へ伝わる2

“`py:1
def test_exception(num):
print(1)
try:
print(2)
answer = 100 / num
return answer
print(3)
except ZeroDivisionError as e:
print(4)
raise e
print(5)

print(‘start’)
try:
test_exception(1)
print(6)
except ZeroDivisionError as e:
print(7)
raise e
finally:
print(‘end’)
“`

“`:1の実行結果
start
1
2
6
end
“`

print(‘start’)を
最初に実行。

次に、
tryブロックを実行する。
tryブロック1行目のtest_exception関数に引数1で入る。
なので、
print(1)を実行し、
test_exce

元記事を表示

random.randint(a,b) と np.random.randint(a,b) を入れ替えると分析結果が正反対になってしまった!

#実は違っていた!random.randint(a,b) と np.random.randint(a,b)

Pythonでよく使われているライブラリでこんなことがあるのかとハマってしまった件。
次のGoogle Collaboratory で実行可能な単純なコードを見てもらいたい。
広く使われている一般的なライブラリを呼び出しているだけだし
式的には全く同じように見えるのですが、
出力結果が似ていて実は異なる結果になっていることを。

We need some caution when using randint whether this function is called from random library or numpy library. The result will be very different !!

“`
import random
import numpy as np

for i in range (500):
print (np.random.randint(0,37))

for j in range (500):
print (ran

元記事を表示

Pythonのpyqtgraphを使う

##経緯
グラフを描画するにはmatplotlibを使えばいいが、リアルタイムでグラフを更新する際はより高速なpyqtgraphを使った方が良さそう.
matplotlibも工夫次第では、高速処理ができるみたいだが、よく分からない.
##環境
python 3.7
##ソースコード
三つのデータをそれぞれ表示し、1秒後にデータの先頭要素が消えていき、その流れを描画する.

“`py
from pyqtgraph.Qt import QtGui, QtCore
import pyqtgraph as pg
import sys

R = [255, 0, 0]
G = [ 0, 255, 255]
B = [ 0, 0, 255]

win = None
plt = None
data = [[1,-1,2,-2,3,-3,4,-4],[10,-10,9,-9,8,-8,7,-7],[0,1,0,2,0,3,0,4]]
curve = list()
app = QtGui.QApplication([])

def init():
global curve

元記事を表示

関数内で例外が発生した場合、呼び出し元へ伝わる1

“`py:1
def test_exception(num):
print(1)
answer = 100 / num
return answer
print(2)

print(‘start’)
try:
test_exception(1)
print(4)
except ZeroDivisionError as e:
print(3)
print(e)
finally:
print(‘end’)
“`

“`:1の実行結果
start
1
4
end
“`
print(‘start’)を
最初に実行。

次に、
tryブロックを実行する。
tryブロック1行目のtest_exception関数に引数1で入る。
なので、
print(1)を実行し、
answer = 100
となり100を返す。
retrunしているので、
その下のprint(2)は実行されない点に注意。
tryブロックのtest_exception関数が終わったので、
その続きでprint(4)を実行。

ZeroDivisio

元記事を表示

【Python】MotoでモックしたAWSリソースをpytestフィクスチャ化する

motoとは AWSサービスをモック化できる非常に便利なツール。

[spulec/moto – GitHub](https://github.com/spulec/moto)

これをpytestのフィクスチャと組み合わせれば`conftest.py`のsetUpで自動的にAWSサービスをモックできる。

参考 – [Issue with Moto and creating pytest fixture #620](https://github.com/spulec/moto/issues/620)

SQSの例

– SQSのモックキューを作成
– モックキューにメッセージ送信
– モックキューのメッセージを検証

“`python
import boto3
import pytest
from moto import mock_sqs
import json

@pytest.fixture()
def mock_fixture():
“””キューを作成してメッセージを1件送信する”””
mock = mock_sqs()
mock.start()

元記事を表示

超音波距離センサ(HCSR-04)とRaspberry Piを使って凹凸の検出をしたい

#使用するもの
・Raspberry Pi Zero
・角が直角のもの(ティッシュの箱など)
・HCSR-04センサ×2
・プレッドボード
・ジャンパー

#Raspberry Piとセンサを接続する
HCSR-04とRaspberry Pi Zeroをジャンパ等で接続する
今回は接続方法については割愛する.詳細はこちらからhttps://algorithm.joho.info/programming/python/raspberry3-ultrasonic-distance-sensor-hcsr04/
また,センサと検出対象の物体の配置図は以下の図を参照する

#検出方法
検出は3つのステップで行います.また,すべてのステップではHCSR-04センサの位置は変更していません
・L:物体の中央線とセンサ間の距離(A,Bとも同じ距離である)
・ℓ:センサAと物体との距離
・ℓ’:センサBと物体との距離

###初期状態
![object1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558036/64

元記事を表示

[Python3 入門 9日目] 5章 Pyの化粧箱:モジュール、パッケージ、プログラム(5.1〜5.4)

#5.1 スタンドアローンプログラム

– テキストターミナル、またはターミナルウィンドウでPythonを実行している場合、Pythonプログラムの名前に続いてプログラムファイル名を入力する。

“`py:test1.py
print(“This stadalone program works!”)
“`

“`console:結果
$ python test1.py
This stadalone program works!
“`

#5.2 コマンドライン引数

“`py:test2.py
import sys
print(“Program arguments:”,sys.argv)
“`

“`console:結果
$ python test2.py
Program arguments: [‘test2.py’]

$ python test2.py tra la la
Program arguments: [‘test2.py’, ‘tra’, ‘la’, ‘la’]
“`

#5.3 モージュールとimport文

– **モジュール**はPythonコードを

元記事を表示

集合内包表記

“`py:1
s = set()
for i in range(10):
s.add(i)
print(s)
“`

“`:1の実行結果
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
“`

これを内包表記にすると

“`py:内包表記1
s = {i for i in range(10)}
print(s)
“`

“`:内包表記1の実行結果
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
“`

リスト内包表記の時と同様に、
3で割って余り0の数字のみ集合に入れるには

“`py:内包表記2
s = {i for i in range(10) if i % 3 == 0}
print(s)
“`

“`:内包表記2の実行結果
{0, 3, 6, 9}
“`

元記事を表示

集合のメソッド add remove clear

“`py:1
s = {1, 2, 3, 4, 5}
s.add(6)
print(s)
“`

“`:1の実行結果
{1, 2, 3, 4, 5, 6}
“`

“`py:2
s = {1, 2, 3, 4, 5}
s.remove(5)
print(s)
“`

“`:2の実行結果
{1, 2, 3, 4}
“`

“`py:3
s = {1, 2, 3, 4, 5}
s.clear()
print(s)
“`

“`:3の実行結果
set()
“`
空の辞書{}と区別する為に、
空集合はset()と表す。

元記事を表示

PythonでOSの空きポート番号を取得する

ユニットテストで一時的なサーバプロセスを立ち上げたりする際にポート番号がバッティングしないようにしたかった。

`psutil`パッケージを使用する。

“`shell
$ pip install psutil
“`

“`python
import psutil

def unused_portnumber(start=49152):
# “LISTEN” 状態のポート番号をリスト化
used_ports = [conn.laddr.port for conn in psutil.net_connections() if conn.status == ‘LISTEN’]
for port in range(start, 65535 + 1):
# 未使用のポート番号ならreturn
if port not in set(used_ports):
return port
“`

ちなみに[RFC](https://www.iana.org/assignments/service-names-por

元記事を表示

データベースのテーブルをCSVでぶっこ抜き【RとpythonからODBC接続】

皆さんCSVでデータベースのデータ抜きたい時どうしてるんですか?
よかったら教えてください!
私はこんな感じ↓↓↓

#データベースのテーブルをCSVにしたい

抽出依頼が来てデータベースに対してクエリ書いて出た結果をCSVにしたい。

社内データ分析者はSQL書いて分析用のファイルを作成したりします。
エクセルで組んでODBC接続してきてもいいのですが、どうせならそのまま統計ソフトにデータをぶち込みたい。
そのまま数値の計算ロジックや入れ替えロジックを分析ソフト側で処理してしまいたい。

#ODBCで接続

データベースとの接続の仲介をしてくれるodbcなるものがあります。
ODBCの設定やなんたるかは他のサイトに任せましょう。
データベースを自分で設定する人でなければ、誰かが使っているはずなので聞きましょう。
とりあえずデータベースサーバのIPアドレスと接続用ドライバを聞けばOKです。

方法はリンクで。
[こことかODBC](http://www.venus.dti.ne.jp/~yoshi-o/RDB/ODBC-connection.html)
[こっちもODBC](http

元記事を表示

辞書包括表記

“`py:1
name = [‘太郎’, ‘次郎’, ‘三郎’]
job = [‘勇者’, ‘戦士’, ‘魔法使い’]
d= {}

for x, y in zip(name, job):
d[x] = y

print(d)
“`

“`:1の実行結果
{‘太郎’: ‘勇者’, ‘次郎’: ‘戦士’, ‘三郎’: ‘魔法使い’}
“`

これを辞書包括表記で書くと

“`py:辞書包括表記
name = [‘太郎’, ‘次郎’, ‘三郎’]
job = [‘勇者’, ‘戦士’, ‘魔法使い’]

d = {x: y for x, y in zip(name, job)}
print(d)
“`

“`:辞書包括表記の実行結果
{‘太郎’: ‘勇者’, ‘次郎’: ‘戦士’, ‘三郎’: ‘魔法使い’}
“`

元記事を表示

GUI操作でデータを手軽にグラフ表示するツールを作ったったった

データ分析の作業をしていると、データを数字で追うのとは別にグラフ等で視覚的にデータの特徴を確認することも多々あると思います。
そういった作業が多く、データの組みあわせを自由に変えながらグラフをすぐに表示できる「Glance」というツールを作ってみました。
GUI作成にはPythonの`tkinter`というライブラリを使用しました。

ファイルは[こちら](https://gitlab.com/katsuki104/glance)にあります。
**※Windows環境で使う用に作ったのでMac環境だと多分別途修正が必要です…**

# 概要
読み込んだデータから選択してグラフ表示するだけのシンプルなツールです。
実装した動作は大きく3つあります。

1. ファイル選択からデータを読み込みそのカラムを一覧で表示する
![sample1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160512/394ea708-9f6d-4aec-bf7e-87f5d64b03e0.gif)

2. データを選択して

元記事を表示

raise で 意図的に例外を投げかける

“`py
import sys, traceback

number1 = 100
number2 = 1

print(‘start’)
try:
print(1)
raise NameError(‘意図的にネームエラーを発生させました。’)
print(2)
except NameError as e:
print(‘未定義の変数を呼び出しました。’)
sys.stderr.write(traceback.format_exc())
finally:
print(‘end’)
“`

“`:実行結果
start
1
未定義の変数を呼び出しました。
end
“`
tryブロックのraise NameError より後ろにある
print(2)は実行されないことに注意。

“`:実行時エラー
Traceback (most recent call last):
File “Main.py”, line 9, in
raise NameError(‘意図的にネームエラーを発生させました。’)
Name

元記事を表示

【Python】エクセル基本操作(読み込み、値書き込み、保存、最大列数、最大行数)

# pythonでエクセルを扱う
Pythonでエクセルを扱う方法はいくつかあるが、ここでは**openpyxl**を使った方法を紹介する。

“`python:sample.py
import openpyxl
“`
#新規エクセルファイルの作り方
ここでは、新規エクセルファイルの作り方を紹介する。

“`python:sample.py
import openpyxl

wb=openpyxl.Workbook()
ws=wb.active
ws.title=”シート名”
wb.save(“保存先のpath”) #エクセルファイルの保存
“`

#既存エクセルの読み込み
次に既存エクセルの読み込み方を紹介する。

● 読み込むために必要な物
・既存のエクセルファイル
・エクセルファイルまでのPATH 

“`python:sample.py
import openpyxl

path=r”読み込みたいファイルまでのpath”
wb=openpyxl.load_workbook(path)
ws=wb.get_sheet_by_name(“読み込みたいシート名”)
“`

元記事を表示

Python仮想環境作成コマンド

# 仮想環境とは
開発するアプリケーションによっては特定のバージョンのソフトウェアを使いたいといったシチュエーションが出てくることがあります。そこで一般的には、他の開発環境から独立した環境で開発作業を進めることになります。それが仮想環境です。Pythonには標準パッケージとして”venv”というものが組み込まれているのでそちらを使っていきます。

# 動作環境
Windows10
Python 3.8.1
Pycharm 2019.3.1 Community Edition (最強のPython IDE)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/8bb2e22f-71c3-fc8b-a977-80b0e6708453.png)

# 仮想環境の作成
PycharmのTerminalでpythonが動く事を確認したら下のコマンドを入力

“`terminal:terminal
python -m venv <ディレクトリ名>
“`

今回はそのまま”venv”とい

元記事を表示

discord.pyでニコニコ生放送の放送開始通知をDiscordに投稿するbot

# 初めに
Qiita初投稿になりますfctokyo1016ことリョウ(凌)と申します。 Twitter→[@fctokyo1016](https://twitter.com/fctokyo1016)
普段は主にPHPでの開発なんかを行ってます。
エンジニア歴数年のほぼ素人がなんとか作ったコードなので大目にみていただければ幸いです。

# 作ろうとした経緯
– ニコニコ生放送[10名ほどが所属する企画チーム](https://ch.nicovideo.jp/boxtv)に在籍していて、各々が自由に同じコミュニティで生放送が行える状態
– ニコ生のアラートが仕様変更で使えなくなってしまったので、他のメンバーの放送を見る際にURLを探すのが煩わしい
– メンバー全員が入っているDiscordのサーバーに通知が来れば楽なのでは?
– TwitchやYoutubeLiveなどのサイトは既に既存のbotがあるがニコニコには未対応
– なんとかインチキ(自作)できんのかね?

# 苦労した点
– 上記でも記載したがニコ生のアラート仕様変更でRSSもAPIもユーザー生放送には対応していない

# ア

元記事を表示

OTHERカテゴリの最新記事