Pythonの学習 6章 ファイルの読み書き

Pythonスタートブック 6章 「ファイルの読み書き」をまとめます。

ファイルの読み書き

  • まず、ファイルを入れるためのオブジェクトtest_fileへファイルを入れる
  • ここでは、ソースファイルと同じディレクトリに「test.txt」を作成した

    ファイルを呼び出す

    書き込みモード

  • 関数openを呼び出すと、file型のデータが戻り値として返ってくる
  • 一つ目の引数は、開きたいテキストファイル名。二つ目の引数は、モード選択。モード選択'w'は書き込みモードで開くということ
test_file=open('test.txt','w')
  • 開いたファイルへ、helloと書き込む
test_file.write('hello')
  • 書き込みを確実に完了させる関数を実行
test_file.flush()
  • 開いたファイルを閉じる関数を実行
test_file.close()

読み込みモード

  • ファイルを読み込むread modeで実行
test_file=open('test.txt','r')
  • 開いたファイルを一行づつ読み込む。読み込んだ行はread_strへ入れる
read_str=test_file.readline()
  • 開いたファイルを閉じる関数を実行
test_file.close()
  • 読み込んだ一行を確認のために表示してみる。
print(read_str)

複数行への書き込み、読み込み

複数行への書き込み①(\nで改行する)

今回は「test2.txt」をソースコードと同じディレクトリに作成しておく

#書き込みモードで開く
test_file=open('test2.txt','w')
#改行して、2行書き込む
test_file.write('hello\nPython')
  • 書き込みを確実に完了させる関数を実行
test_file.flush()
  • 開いたファイルを閉じる関数を実行
test_file.close()

複数行の読み込み

test_file=open('test2.txt','r')
  • 複数行を読み込んでくれるreadlinesを使う
  • 取り出された行はリスト型。例えばA[0]は'hello'を指定するものとなる
A=test_file.readlines()
  • 開いたファイルを閉じる関数を実行
test_file.close()
  • 実行するとわかるが、このままだと\nが表示されてしまう
print(A)

*\nを取り除くには、stripメソッドを使用する。 stripメソッドは文字列の前後にある空白や制御文字列(改行とか)を取り除いて、文字列だけにしてくれる

print(A[0].strip())

複数行への書き込み②writelines

  • 書き込みモードで開く
test_file=open('test3.txt','w')
  • 書き込むデータを用意
data=['1,2,3\n','4,5,6\n','7,8,9\n']
  • writelinesでいっきに書き込み
test_file.writelines(data)
  • 書き込みを確実に完了させる関数を実行
test_file.flush()
  • 開いたファイルを閉じる関数を実行
test_file.close()

forを使った複数行の取り出し

  • 読み込みモードで開く
test_file=open('test3.txt','r')
  • 複数行の取り出し
for B in test_file:
        print(B.strip())
#開いたファイルを閉じる関数を実行
test_file.close()

forを使った複数行に書き加えて取り出し

#読み込みモードで開く
test_file=open('test3.txt','r')
#forを使った複数行に書き加え
for B in test_file:
        #temp_listへ改行取り除くstrip()、指定した文字列(今回は',')で分割するsplitで処理したtest_fileリストリストを入れる
        temp_list=B.strip().split(',')
        #先ほどのtemp_listへタブによる空欄を差し込む
        #joinメソッドは指定したリストのすべての要素の間に文字列を挿入する
        #'\t'はタブを表す文字列
        output_line='\t'.join(temp_list)
        print(output_line)
#開いたファイルを閉じる関数を実行
test_file.close()

Pythonの学習 4章 データの入れ物

Pythonスタートブック4章 「データの入れ物」をまとめます。

データ型の型

コード中の「print( )」は全て出力させるための記載

list型

A=list(range(0,10))
print('Lsit A=',A)

辞書型

  • 辞書型はkeyと値を関連付けてデータを格納する
B={1:'America',15:'China',39:'Japan'}
print('Lsit B=',B)
  • 辞書型から一つ取り出してみる(Chineと表示される)
print(B[15])
  • 辞書に追加
B[22]='イタリア'
print('Lsit B=',B)
  • 上書きも可能
B[22]='Italia'
print('Lsit B=',B)
  • 辞書内のデータの削除(key 1に関連付けられたデータを削除)
B.pop(1)
print('Lsit B=',B)
  • 空っぽの辞書の作成
C={}
print('Lsit C=',C)
  • 中身を入れる
C[100]='パン'
print('Lsit C=',C)

タプル型(ダブル型ではない)

  • 丸括弧を用いて記述。要素の追加や削除ができないのが特徴
T=(1,3,8,'ばなな')
print('Lsit T=',T)
  • データの取り出しは可能
print(T[3])
  • リスト型への変更も可能(変更した証拠に丸括弧が四角括弧になる)
D=list(T)
print(D)

セット型

  • セット型は箱を作って、その中にどんどんデータを入れるだけの型
#セット型のSを作成
S=set()
  • 要素の追加
S.add(3)
S.add(100)
S.add('リンゴ')
print(S)
  • セット型のSの中に指定したデータがあるかどうかを調べる'in'
print(3 in S)
print(10 in S)
  • セット型の中のデータを削除
S.remove('リンゴ')
print(S)

Pythonの学習 5章「条件分岐と繰り返し」

Pythonスタートブック 第5章「条件分岐と繰り返し」をまとめます。

繰り返し① for文

for文

・リストを使って練習

listA=[1111.0,4802.0,5531.0,7893.0]  
listB=[1.1,5.2,88,0,9,9]   

・forを使用して一括表示

for val in listA:       
    print(val)

平均の計算①

平均を入れるための変数avgを定義

avg=0.0  

・平均を計算

for val in listA:  
    avg+=val  
avg /=len(listA)  

・平均の表示

print(avg)  

平均の計算② (辞書型)

・小技。一行が長くて見にくいとき、'\'を挟むことで改行しても1行と認証してくれる。

fruits_jisho={'apple':1.0,'mikan':0.5,'suika':10.0,\  
'banana':0.7,'goma':0.1}  

・平均を入れるための変数avgを定義

avg=0.0 

・平均を計算

for val in fruits_jisho:  
    avg +=fruits_jisho[val]  
avg /=len(fruits_jisho)  

・平均の表示

print(avg)  

f:id:t-hiro712:20181011195112p:plain

繰り返し② while文

ランダムを使用した練習

import random  

・関数randintは二つの引数の範囲で一つの乱数を出力する

random.randint(0,9)

・ここで、4が出るまでrandom.randint(0,9)を繰り返す関数をつくる

rundX=0  
while rundX !=4:  
    rundX  =random.randint(0,9)  
    print(rundX)  

同様のプログラムをif文も使って書いみる

rundX=0  

・Tureになるまで続ける

while Ture:  
    #rundXへ、乱数を入れて、表示    
    rundX  =random.randint(0,9)     
    print(rund)  
   #4でないなら、続ける  
    if rundX !=4:  
            continue  
   #それ以外(4なら)ブレイク  
    else:  
            break  

f:id:t-hiro712:20181012155217p:plain

if文

基本

・真偽
a=1>0
b=1<0
print(a,b)

・日付を使って練習
import datetime

・todayへ、今日の日付を入れて、表示する
today=datetime.datetime.now()
print(today)

今日が平日ならば、「がんばれ!」と表示するプログラム

・平日かどうかは、今日が何曜日かを出力するコードで判断する。0-4平日。5,6土日。
Youbi=today.weekday()

・もし平日なら
if today.weekday()<5:
・「がんばれ!」と表示する
print('がんばれ!')
else:
print('休みだ!')

・平日の中でも金曜日なら、「あと少しで休み!」を追加 if today.weekday()<5:
#「がんばれ!」と表示する print('がんばれ!') elif today.weekday()==4: print('あと少しで休み!') else: print('休みだ!') f:id:t-hiro712:20181012155652p:plain

Pythonの学習 8章 関数

Pythonスタートブック8章 関数をまとめます。

関数の作成

組み込み関数

今まで使用してきたのは元々用意されていた関数(組み込み関数)である。
例えば、「リスト型データ」の長さを図る関数に"len"がある

test_list=[12,4,3,99]  
print(len(test_list))  

長さを図るのにlenを使用せずに図る場合は以下のようになる

length=0  
for i in test_list:  
    length+=1
print(length)

上記のように、関数を一から書くと長くなってしまうので、オリジナルの関数は必要不可欠である。

オリジナルの関数(引数なし)

では、オリジナルの関数を作成してみる(def)
引数を取らない、「i=3」表示する関数。"kansu"を作成する

def kansu():
    print("i=3")

関数を呼び出してみると、i=3が表示される

kansu()

オリジナルの関数(引数あり)

次に引数ありの関数を作成する。与えた数を2倍にする関数"kansu2" を作成する。

def kansu2(x):
    print(2*x)

作成した関数を呼び出してみると、"6"が表示される

kansu2(3)

モジュールを作成する

組み込みモジュール

Pythonには多くの関数があらかじめ用意されていて、機能ごとにモジュールとしてまとめられている。
例えば"random"モジュールを使用してみる。
モジュールをインポートして

import random 

randomモジュールの中の「0以上1未満の少数をランダムに返す"random()"」を使用する

a=random.random()
print(a)

指定した区間でランダムに値を返すrandintを使用してみる

b=random.randint(1,10)

オリジナルのモジュールの作成

同じプロジェクト内に、先ほど試した2倍にする関数を"test_module.py"としてを作成し、実行してみる。これからわかる通り、モジュールとは、Pythonスクリプトファイル(.pyファイルのこと) と同義である。

#test_module.py
def function(x):
    print(2*x)

作成したモジュールを呼びだす。

import test_module
test_module.function(2)

別の記載方法でもモジュールは呼び出せる。module.pyを作成して試してみる

#module.py
def ichi():
    print("1")

module.pyを呼び出してみる

from module1 import ichi
ichi()

関数を変数に代入する

"len"は長さを返す関数である.以下を実行すると6が買える

print(len("banana"))

関数を変数に代入する

Nagasa=len

同様に使用できる

print(Nagasa("Apple"))

関数を引数にとる

"str"は引数を文字列へ変換してくれる関数

print(str(3))

"map"関数は引数を2つとる 1つ目は関数、2つ目はリスト リストの全要素へ関数を適用して、リスト型で返す 今回は先ほど作成した2倍にするモジュールを、リスト[0,1,3,5]へ適用する

list(map(test_module.function,[0,1,3,5]))

Pythonの学習 7章 Pythonで画を描く

Pythonスタートブック7章 Pythonで画を描く

基本

  • 画を書くためにturtleモジュールを使用する
import turtle
  • 末尾の待機動作のためtimeのインポート
import time
  • turtleモジュールの中のTurtle型の初期化メソッドを呼び出す。この操作でできたTurtle型のインスタンスにKameという変数名をつけることにする。
Kame=turtle.Turtle()
  • このままだと表示される図形は矢印なので、turtle.Turtle型のshapeメソッドを使って亀の形にする。
Kame.shape('turtle')
  • 大きさはturtle.Turtle型のshapesizeメソッドで変更できる。引数は縦、横、輪郭の線の太さの順
Kame.shapesize(2,2,3)

亀を動かす

  • turtle.Turtle型のforwardメソッドで亀を前進させられる(下は150ピクセル移動)
Kame.forward(150)
  • turtle.Turtle型のshapesizeメソッドで亀を前進させられる(下は150ピクセル移動)
Kame.backward(150)
  • 左右への方向転換(90度回転する)
Kame.left(90)
Kame.right(90)
Kame.circle(150)

操作する

  • 一つ前の動作の取り消し
Kame.undo()
  • 亀を中央に戻して、全ての記載を削除する
Kame.home()
Kame.clear()
  • 表示されるウィンドウの現在のサイズを把握するメソッド
a=Kame.getscreen().window_height
b=Kame.getscreen().window_width
#表示する
print("縦=",a,",横=",b)
  • 亀の現在いる位置を把握するメソッド
c=Kame.position()
#表示する
print(c)

三角形を描く

  • 普通に三角形を描いてみる(1辺200)
Kame.forward(200)
Kame.left(120)
Kame.forward(200)
Kame.left(120)
Kame.forward(200)

Kame.home()
  • for文を使用して三角形(一辺120)を描く
    この例では、三角形(一辺120)を描くためにfor文で書かれたコードを三回繰り返すのでrange関数で長さ3のリストをつくる(for文の書き方はfor文参照)
for i in range(3):
    Kame.right(120)
    Kame.forward(120)

星を描く

Kame.home()
Kame.clear()
for i in range(5):
    Kame.right(144)
    Kame.forward(200)

ランダムに亀を動かしてみる

Kame.home()
Kame.clear()

#方向性をランダムにするには以下で可能
a=random.randint(1,360)
  • Tureの間、永遠に繰り返すので、半径200の円をはみ出したら、動作終了とするランダム動作を作る。
    まず、半径200の円を描く(オリジナルの関数を作成して、呼び出した。作り方は8章参照)
import cycle200
cycle200.cycle()
  • 半径200の円をはみ出さない限り、繰り返し
while True:
    Kame.pencolor('red')
    Kame.left(random.randint(1,360))
    Kame.forward(25)
    #永遠に動かないように条件を追加する
    #半径200の円をはみ出したら、動作終了とする
    if Kame.distance(0,0)>200:
        Kame.home()
        #3秒待ってから、whileから抜け出す
        time.sleep(3)
        break
  • 200を超えたら、円内に亀が戻るプログラム
while True:
    Kame.pencolor('green')
    Kame.left(random.randint(1,360))
    Kame.forward(50)
    #永遠に動かないように条件を追加する
    #半径200の円をはみ出したら一つ前の動作へ戻る
    #戻るので、線が円をはみ出さない
    if Kame.distance(0,0)>200:
        #whileから抜け出す
        Kame.undo()
  • 5秒待つ。これを書かないとすぐにウィンドウが閉じてしまう
time.sleep(5)

Python学習(番外編) Visual studioにおけるディレクトリの構成

Pythonの学習において、visual studio環境でのディレクトリの構成を把握しておかないとつまずくので参考書「Pythonスタートブック」の内容から外れますがまとめておきます。

新しいプロジェクトの作成

プロジェクトの新規作成する際、「新しいプロジェクト」から作成する。
ここでの各項目から、ディレクトリの構成を把握していく。
以下に「新しいプロジェクト」の記載例を示す。 f:id:t-hiro712:20181102153941p:plain 「名前」はプロジェクトにつく名前のこと(ここではSction8)
「ソリューション名」はこのソリューションの名前(ここではPythonPractice6)

作成すると、「ソリューションフォルダ」の中に、「ソリューションファイル(.sin)」と「プロジェクトフォルダ」が作成され、「プロジェクトフォルダ」の中に「プロジェクトファイル(.pyproj)」と「スクリプトファイル(.py)」が作成させる。

ソリューションエクスプローラーの見方

先ほどのようにプロジェクトを新規作成すると、ディレクトリの構成が「ソリューションエクスプローラー」で確認できる。ここではソリューションエクスプローラーの見方をまとめる。

今回、ソリューション名にPythonPractice6、名前にsection8を入れてプロジェクトを作成した。
先ほど述べたとおり、「プロジェクトフォルダ」の中に「プロジェクトファイル(.pyproj)」と「スクリプトファイル(.py)」が入っている。
ここでのプロジェクトファイルはsection8(section8.pyprojのこと。拡張子が省略ている)で、その中にスクリプトファイルsection8.pyが作成されている。

スクリプトの追加

ソリューション‘section8‘を左クリック、「新しい項目の追加」でスクリプトファイルを増やせる。

ちなみに同一プロジェクト内のスクリプトファイル(.py)は、"from module import + スクリプトファイル名"で一度インポートすることで、ほかのスクリプトファイルから呼び出せる。
f:id:t-hiro712:20181102154026p:plain

プロジェクトの追加

同一ソリューション内(ここではPythonPractice6)内に新しくプロジェクトを定義する。
「ファイル」→「追加」→「新しいプロジェクト」で作成できる。 今回は「section9」を追加した(スクリプトファイル名も「section9」)

今までの操作をしたソリューションエクスプローラーと、ディレクトリの構成は以下のようになる

ディレクトリの構成 f:id:t-hiro712:20181102160615p:plain

Pythonの学習④OSのシェルからプログラムを実行

visual studio 上で普段実行しているのですが、OSのシェルからプログラムを実行する手順を書きます。参考書の内容から外れるのですが、OSのシェルからプログラムを実行することが必要な場合もありますのでメモです。

コマンドライン引数

OSのシェルからプログラムを実行するときに関数へ渡す引数をコマンドライン引数といいます
・OSのシェルからPythonプログラムを実行する
python’+’実行するプログラムのファイル名’+’コマンドライン引数’ のように書く

練習

例えばOSのシェル(コマンドプロンプト)とかからプログラムを実行せよ。という問題の際、そのままコマンドプロンプトを用いない。メニューの「VS 2017用....」を使用する。

f:id:t-hiro712:20181006212610p:plain コードは以下で、import sys はコマンドライン引数を扱うためのモジュール。このモジュールを読み込むと、プログラムの中でsys.argvという変数を通じてコマンドライン引数を取り出せる。 f:id:t-hiro712:20181011193159p:plain

f:id:t-hiro712:20181011191933p:plain