Pythonプログラミング入門・サンプル・チュートリアル

Pythonプログラミング入門・サンプル・チュートリアル

【Pythonプログラミング入門】海外の株価データ取得API

株価データ取得先

このサイトで公開されているAPIで株価データを取得できます。 iextrading.com

※日本の株式市場に上場されている株価データは取得できるかわかりませんでした。

株価データ取得サンプル

Pythonで書いています。

import requests

# AAPLはアップルの株価コード
url = "https://api.iextrading.com/1.0/stock/AAPL/quote"

result = requests.get(url)
print(result.json())

こんな感じでいろいろなデータが取得できます。 f:id:fjswkun:20180512150859p:plain

他のAPIについて

こちらでドキュメントがありました。

iextrading.com

【Pythonプログラミング入門】Djangoのフォームでカスタムのバリデーションをする

はじめに

HTMLのフォームで入力された内容のバリデーションにFormクラスが使用されます。クラス変数で定義された内容で入力有無、文字数などの単純なバリデーションをしてくれます。それ以外のアプリケーション独自のバリデーションを行いたい場合があります。そのときはFormクラスにメソッドを追加することで実現することができます。

カスタムのバリデーション

Formクラス(サブクラス)はクラス変数で定義されているバリデーションを行なった後、clean_という名前のメソッドを実行する。はクラス変数名が入る。

  • クラス変数にemail変数が定義されている場合
  • abcd@example.comまたはefgh@example.com以外は不正とする場合
from django import forms

class CustomForm(forms.Form):
    email = forms.CharField(max_length=100)

    # デフォルトのバリデーションが行われた後に下記のバリデーションが行われる
    def clean_email():
        email = clean_data['email']
        if email in ['abcd@example.com', 'efgh@example.com']:
            return email
        else:
            raise forms.ValidationError('this email is invalid')

【Pythonプログラミング入門】Djangoでstartprojectコマンド使わずにHello Worldを作る

はじめに

Django公式のチュートリアルを読んで、startprojectコマンドやstartappコマンドを読んでいて、これらのコマンドは何をやっているのだろう?これらのコマンドを使わないとWebアプリを作れないのかな?と思っていました。

下記の書籍の第1章を読んで、startprojectコマンドを使わなくても、Webアプリが作れることがわかりました。

Lightweight Django

Hello worldサンプル

Hello worldを表示するのに必要なこと - view関数(view.pyがやっていること) - URLとView関数の紐付け(urls.pyがやっていること) - 設定(settings.pyがやっていること) - 起動(manage.pyがやっていること)

ソース

# hello_world.pyファイル
import sys

from django.conf import settings


# 設定(settings.pyがやっていること)
settings.configure(
    DEBUG=True,
    SECRET_KEY='thisisthesecretkey',
    ROOT_URLCONF=__name__,
    MIDDLEWARE_CLASSES=(
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ),
)

from django.conf.urls import url
from django.http import HttpResponse

# view関数(view.pyがやっていること)
def index(request):
    return HttpResponse('Hello World')

# URLとView関数の紐付け(urls.pyがやっていること)
urlpatterns = (
    url(r'^$', index),
)

# 起動(manage.pyがやっていること)
if __name__ == "__main__":
    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

実行

python3 hello_world.py runserver

http://127.0.0.1:8000にアクセスすると、「Hellow World」と表示されます。

学習書籍

【Pythonプログラミング入門】Djangoでnginx+uWSGIを使う設定したときのエラー対応

Djangoでnginx+uWSGIを使う設定したときのエラー対応

nginxを使おうとして、ネット上の記事を参考に設定した。

参考にさせていただいたのはこちらの記事。 www.sejuku.net

しかし、エラーになるーー f:id:fjswkun:20170911070020p:plain

参考にした記事には書かれていないが、自分のMacで何か設定が漏れているのだろう。 検索&設定変更を繰り返し、わかったのは下記設定が漏れていたこと。

nginx.confにsites-enabled配下を読み込む設定

/usr/local/etc/nginx/nginx.confに下記の1行を追加する。
追加する場所はhttp{・・・}の中。

include /usr/local/etc/nginx/sites-enabled/*;

nginxやuWSGIを再起動し、アクセスしたら成功! f:id:fjswkun:20170911070348p:plain

修正後のnginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8080;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    include servers/*;
    include /usr/local/etc/nginx/sites-enabled/*;
}

学習書籍

【Pythonプログラミング入門】トレースバック(スタックトレース)を文字列で取得する

tracebackモジュールのformat_exc()関数を使うと取得することができる。
例外が発生したときにログに出力しておくことでデバッグ時の参考とすることができる。

import traceback

try:
    raise Exception('トレースバックを文字列で取得する')
except:
    error_info_file = open('error_info_file.txt', 'w')
    error_info_file.write(traceback.format_exc())
    error_info_file.close()

    print('トレースバックをファイルに書き込みました')

error_info_file.txtというファイルが作成され、中身は下記の通りとなる。

Traceback (most recent call last):
  File "getTraceback.py", line 4, in <module>
    raise Exception('トレースバックを文字列で取得する')
Exception: トレースバックを文字列で取得する

学習書籍

【Pythonプログラミング入門】「退屈なことはPythonにやらせよう」の「9.7.1 選択コピー」の自己回答

はじめに

「退屈なことはPythonにやらせよう」の演習問題「9.7.1 選択コピー」の自己回答です。

import os, shutil


def copyFile(src, dst, ext_list):
    for (dirpath, dirnames, filenames) in os.walk(src):
        for f in filenames:
            root, ext = os.path.splitext(f)

            if ext in ext_list:
                source_path = os.path.join(dirpath, f)
                target_path = os.path.join(dst, f)
                shutil.copy(source_path, target_path)


# コピー元ディレクトリパス
source_dir_path = 'copyDirectory'
# コピー先ディレクトリパス
destination_dir_path = os.path.join(os.getcwd(), 'targetDirectory')
# コピー対象の拡張子リスト
target_ext_list = ['.pdf', '.jpg', '.png']

# コピー実行
copyFile(source_dir_path, destination_dir_path, target_ext_list)

学習書籍

【Pythonプログラミング入門】正規表現の中にコメントを書いてわかりやすくする

はじめに

正規表現にコメントを書き、後から自分や他の人が読むときに理解しやすくする

re.VERBOSEを使う

reモジュールのcompile関数で、第2引数にre.VERBOSEを指定すると正規表現の中にコメントを書くことができる

サンプルコード

import re

search_regex = re.compile(r'''
    (.+?)-    # 名前
    (\d{2})    # 年齢
    .txt
''', re.VERBOSE
)

sample = 'tom-23.txt'
matched = search_regex.search(sample)
print(matched.group(1))
print(matched.group(2))

学習書籍