カテゴリー: Python

はじめに

先日、Pythonを使って、データを解析する機会がありました。
そんな時、「簡単なサンプルコードがあったら便利だ」と感じたため、ブログに残しておこうと思います。
サンプルコードは好きに使ってもらって構いません(大したコードではないので)
「もっとこうしたらいいのに」というご意見がありましたら、コメント欄までお願いいたします。

私の環境は以下の通りです。

  • Windows 10 64bit
  • Anaconda3 5.3.0
  • Python 3.7.0

 

例題

今回、例として用意した解析元のデータは、過去の気象データです。
この気象データは、気象庁のホームページから誰でも無料でダウンロードできます。

過去の気象データ・ダウンロード
https://www.data.jma.go.jp/gmd/risk/obsdl/index.php

ここでダウンロードできる気象データはCSVです。
Pythonはモジュールを使えばCSVも簡単に使いこなせるのですが、今回はテキストに落とし込んでいます。
(CSVファイルを開いて、テキストエディタにコピペしただけです)
以下に、解析元データ(気象データ)の一部抜粋を添付します。
この気象データを今回3つ用意しました。

weather_data1.txt / weather_data2.txt / weather_data3.txt :

ここから日付と平均気温のみを抽出することが、今回の課題です。
日付は一番左の列、平均気温は日付の隣の列です。他は不要なデータとします。

 

サンプルコード

サンプルコードは以下の通りです。

 

一つ一つ解説します。

これは、正規表現を使うようにするためのライブラリです。

 

これはファイル名です。今回ファイルが3つあるので、in_filesというリストに格納しています。

 

in_filesというリストから、ファイル名を一つ取り出してin_fileに入れています。
with openを使ってファイルを開きます。
第一引数にはファイル名を、第二引数は読み込み用でファイルを開くことを指定しています。

‘r’ とすれば、読み込みモード
‘w’ とすれば、書き込みモード
‘a’ とすれば、追記モード

ちなみにwith openで開いたファイルは、Closeが不要です。
as frで、開いたファイルを以降、frとして扱います。
for line in frで、1行ずつファイルを読み込むことができます。

 

re.matchは、文字列の先頭がパターンにマッチするかを調べます。
第一引数は検索したい正規表現を、第二引数は検索元を入力します。

正規表現の中で、カッコで囲んでいる箇所があります。
こうすることで、カッコで囲まれた部分にマッチした文字列を、”group(番号(1始まり))”とするだけでタプルで取得できます。
今回は、日付をgroup(1)、気温をgroup(2)としています。
この検索結果をm1に格納します。もし見つからなければm1にはNoneが入ります。

 

m1がNone以外、すなわち見つかった場合、日付と平均気温を出力します。
まず出力ファイル名を決めます。今回はファイル名に’convert.txt’を追加したものにしました。

出力ファイルを”追記モード”で開いて、それをfaとして扱います。
次にfa.writeで出力ファイルに書き込みます。

m1.group(1)は日付を、m1.group(2)は平均気温を意味します。
日付と平均気温の間には、タブを入れました。最後に改行をしています。

 

出力結果

以下が出力結果です。
ファイルと同じフォルダに、出力ファイルが生成されていると思います。
日付と平均気温だけが綺麗に抽出できています。

weather_data1convert.txt / weather_data2convert.txt / weather_data3convert.txt

 

以上です。

この記事がいいねと思ったら、以下のいいねボタンを押してください。
管理人のモチベーションがあがります(笑)

いいね! ←この記事いいね!
Loading...

はじめに

Pythonを使って、UART等のシリアル通信を行う場合、PySerialを使うと簡単に実現できます。
その際、PySerialを使う前の初期設定で、COMポートを指定する必要があります。

COMポートはデバイス毎に番号が変わってしまいます。
デバイスが変わる度に、デバイスマネージャからCOMポートを調べるのは面倒です。

そこで今回は、COMポートを自動的に取得するサンプルプログラムをご紹介します。
ついでに、PySerialを使ったシリアル通信のサンプルプログラムも掲載しています。
サンプルプログラムはご自由にお使いください。

私の環境は以下の通りです。

  • Windows 10 64bit
  • Anaconda3 5.3.0
  • Python 3.7.0

 

サンプルコード

まずはMain関数を説明します。

ヘッダに”serial”をimportすることで、PySerialを使用することができます。
search_com_port()は私が作成した関数です。
後ほど説明しますが、この関数は有効なCOMポートを返します。

serial.Serial関数は、serというインスタンスを作成しています。
この関数の引数には、有効なCOMポートを指定する必要があります。
その他、baundrateや、通信のタイムアウト時間を設定しています。

w_dataは、送信するデータです。
r_sizeは、受信するデータのサイズです。
uart_write_read関数は、私の作成した関数です。この中でデータの送受信を行います。

 

次に、search_com_port関数を説明します。

serial.tools.list_ports.comports関数は、PCに接続されているCOMポートをすべて返します。
それをcomlistというリストにいったん格納(append)します。

私の使用しているPCでは、使いたいCOMポートがcomlist[0]に格納されていたため、それを一旦、use_portに格納します。関数の最後で、use_portを戻り値として返しています。

 

次に、uart_write_read関数を説明します。

ser.write関数は、データを送信する関数です。これはPySerialで用意している関数です。

ser.read_until関数は、データを受信する関数です。これはPyserialで用意している関数です。
この関数の引数に、受信サイズを指定すると、指定サイズが受信されるまで待ってくれます。

最後に受信データを返しています。

 

最後に今までのソースコードをまとめて記載すると、以下のようになります。

以上です。

この記事がいいねと思ったら、以下のいいねボタンを押してください。
管理人のモチベーションがあがります(笑)

いいね! (11いいね!)
Loading...