ブクマ必須! Python入門 基礎を この1ページ集約

2021年9月25日土曜日

Python

t f B! P L

enter image description here

時間が空くと、忘れてしまいがちな、Pythonの基礎をおさらいしましょう。
基礎の詰め合わせをご賞味ください。
これを最後まで読めば、あなたとPythonの思い出が蘇ることでしょう。

スポンサーリンク

変数

明示的に宣言する必要なし。
最初に変数に値を代入した時点で、変数が宣言される。

a = 1

定数

Pythonでは定数はサポートされていない。
慣習的に大文字とアンダーバー(_)の組み合わせの変数名で宣言された変数を固定値として扱います。

MY_COUNT_VALUE = 100

基本のデータ型

Pythonでよく使うデータ型です。Pythonのデータ型は他にも色々ありますが、とりあえずこれだけ抑えておきましょう。

123         # 整数(int)
123.5       # 浮動小数点数(float)
"ABC"       # 文字列(str)
True/False  # ブール値(bool)
(1, 2, 3)   # タプル(tuple)
[1, 2, 3]   # リスト(list)
{'key': 1}   # 辞書(dict)
set([1,2,3]) # セット(set)

条件分岐

Pythonの条件分岐の書き方は、他の言語と大体同じです。ただしJavaなどでelse ifと書く部分は、Pyhonではelifと書くのがポイント。

条件式の末尾には、: (コロン)を付けます。

if a == 1:
    print("a=1")
elif a == 2:
    print("a=2")
elif a >= 3 and a % 2 == 0:
    print("偶数")
else:
    print("その他")
    print("a=" + str(a))

論理演算子には、and or not を使う

三項演算子

みんな大好き? な三項演算子。Pythonでも使えます。

【構文】
変数 = <Trueの時の代入値> if <条件式> else <Falseの時の代入値>

x = "成人" if age >= 20 else "未成年"

上の処理をJavaで書くと、x = age >= 20 ? "成人" : "未成年"のようになります。

比較演算子

Pythonで使える比較演算子です。他の言語と同じです。

演算子 意味
== 等しい
< より小さい
> より大きい
<= 以下
>= 以上
!= 等しくない

スポンサーリンク

演算子

Pythonで使える演算子です。これも他の言語と同じです。
変わった所で、//で除算と小数点の切り捨てが一発ができるので、コードがスマートになりそうです。

演算子 演算
+ 加算
- 減算
* 乗算
/ 除算
// 除算(小数点以下を切り捨て)
% 剰余
** べき乗

最大値・最小値(max/min)

指定した値のリストから、最大値・最小値を求めるときは、組み込み関数のmaxおよびmin関数を使用します。組み込み関数なので、どのモジュールもimportする必要がありません。

# 最小値
min_value = min(-10, 0, 10, 20)   # 「-10」
# 最大値
max_value = max(-10, 0, 10, 20)   # 「20」

条件分岐 (if文)

Pythonの条件分岐は、少し書き方にクセがあります。

基本の条件分岐 (if文)

Pythonでのif文はif <条件式>:の形式で記述します。

n = 1
if n == 1:
  print("n=1")

if 〜 else

n = 1
if n != 1:
  print("n!=1")
else:
  print("n=1")

if 〜 elif 〜 else (複数条件)

C言語、Javaなどにおけるelse ifは、Pythonではelifで書く。

n = 2
if n == 1:
  print("n==1")
elif n == 2:
  print("n==2")
else:
  print("nは1、2以外")

andまたはorで条件式を複数指定

a = 1
b = 5
if a == 1 and b == 5:
  print("複数条件に一致")

# もちろん「if a == 1 or b == 5:」のように書くことも可能

if文を1行で書く

:(コロン)の後ろに続けて条件にマッチした場合の処理を書く事が可能

n = 1
if n == 1: print("n=1")

スポンサーリンク

繰り返し

for文

  • 配列を繰り返し
for i in [0,1,2,3,4,5]:
  print(i)
  • range()で指定された数を繰り返し
# 0〜5(計6回繰り返し)
for i in range(6):
  print(i)
  
# 1〜5(計5回繰り返し)
for i in range(1, 6):
  print(i)
  • 繰り返し処理で、要素のインデックスが欲しい場合 (enumerate)

enumerate関数を使用すると、ループのインデックス(カウンタ)が取得出来る。

for i, value in enumerate(["A","B","C"]):
  print("index=" + str(i) + " value=" + value)
  • break (ループを途中でやめる)
for i in range(6):
  print(i)
  if i == 3:
    break
  • continue (次のループ処理に移る)
for i in range(6):
  if i == 3:
    continue
  print(i)

while文

i = 0
while i < 6:
  print(i) 
  i += 1

ちなみに、カウンタのインクリメントは i++にしたい所ですが、Pythonでは出来ません。

文字列処理

文字列結合

  • stringの連結
# +(プラス)で文字列を連結
print( 'チャーシュー' + 'ラーメン' + '食べたいな' )

# 文字列リテラルを並べてもOK
print( 'チャーシュー''ラーメン''食べたいな' )

# 複数行に渡る文字列結合は、バックスラッシュで連結
s = 'aaa'\
    'bbb'\
    'ccc'
print(s)
  • string + int の連結
# intは、str()で文字列に変換してから連結
print( 'ラーメン ' + str(100) )

文字の切り取り

s = "abcd"
sub = s[1:3]  #-> "bc"

文字列の分割

文字列を「,」 (カンマ)で区切って、リストで取得する例

str = "りんご,バナナ,プリン"
str.split(",")
 #-> ['りんご', 'バナナ', 'プリン']

区切り文字を指定して、リストを文字列に変換

str_list = ['Python', 'Hello', 'World']
','.join(str_list)
 #-> 'Python,Hello,World'

置換

src = "Hello World"
dst = src.replace('World', 'Hello')
print(dst)
#-> "Hello Hello"

フォーマット (format)

a = "私の名前は %s です。 自宅警備院 %d 年目です!" % ("山田太郎", 5)

%s は文字、%d は整数、%f は浮動小数点、%x は16進数、%o は8進数
%は %%でエスケープする

print "|%5s|" % 'ABC'        #=> |  ABC| : 右寄せ5文字分
print "|%-5s|" % 'ABC'       #=> |ABC  | : 左寄せ5文字分
print "|%5d|" % 123          #=> |  123| : 右寄せ5桁
print "|%-5d|" % 123         #=> |123  | : 左寄せ5桁
print "|%+5d|" % 123         #=> | +123| : 符号付き
print "|%5.2f|" % 1.23       #=> | 1.23| : 全体桁数.少数点以下の桁数
print "|%05d|" % 123         #=> |00123| : 0埋め

文字数を取得

len("abc")  #-> 3

空文字判定 (Empty判定)

Pythonには、文字列の空文字判定を行う専用関数はありません。そのため、以下2つの書き方で空文字判定を行います。

  • len で判定するやりかた
s = ""  # チェック対象がNoneの場合、TypeErrorが発生する
if len(s) == 0:  #
  print("空文字です")
  • not で判定するやりかた
s = ""  # Noneでも正しく空文字判定できる
if not s:  
  print("空文字です")

空白の除去 (strip)

Pythonで空白を除去する場合はstrip()関数を使う。(他の言語でのtrim()相当)

  • 前後の空白を除去(strip)
s = "   123   "
s.strip()  #-> "123"
  • 前方の空白を除去(lstrip)
s = "   123   "
s.lstrip()  #-> "123   "
  • 後方の空白を除去(rstrip)
s = "   123   "
s.rstrip()  #-> "   123"

リスト(list)・タプル(tuple)・ディクショナリ(dict)

リスト (list)

  • 宣言
lst = [1, 2, 3]
  • 値の取得/設定
# インデックスを指定して値を取得
lst[0] # -> 1

# 要素の中身を変更 
lst[0] = 2

# リストの件数を取得
lenVal = len(lst)
  • リストの最後(一番後ろ)の値を取得する

Pythonでは、配列のインデックスにマイナスを渡すと、配列の後ろからアクセスできる

lst = [1, 2, 3]
lst[-1]  #=> 3
  • 範囲指定で値を取得する

Pythonでは、配列インデックスの範囲を指定して、値を取得することができます。

lst = [1, 2, 3, 4, 5]

#開始位置と終了位置を指定
lst[1:3]  #=> [2,3]

#開始位置を指定して、それ以降の値を取得
lst[1:]  #=> [2,3,4,5]

#終了位置を指定して、それより前の値を取得
lst[:4]  #=> [1,2,3,4]
  • 検索
lst = ["A", "B", "C", "C"]

# Aのインデックスを調べる
lst.index("A") #=> 0

# 同じ値が複数存在する場合、先頭のインデックスが返ってくる
lst.index("C") #=> 2

# リストに存在しない値を指定すると、エラーになる
lst.index("D") #=> ValueError: 'D' is not in list
  • 追加

値を1件追加

lst = [1, 2, 3]
lst.append(4)   #=> [1, 2, 3, 4]

別のリストの要素を追加

lst = [1, 2, 3]
lst.extend([4, 5, 6])  #=> [1, 2, 3, 4, 5, 6]

リストを連結して、新しいリストを作成する

lst1 = [1, 2, 3]
lst2 = [4, 5, 6]
lst3 = lst1 + lst2 + [7, 8]
  #=> [1, 2, 3, 4, 5, 6, 7, 8]
  • 削除

リストのクリア (clear)

lst.clear()

指定した位置の要素を削除し、値を取得 (pop)

# 指定した位置の要素を削除
val = lst.pop(0);

# pop()関数の引数を省略した場合、末尾の要素が削除される
val = lst.pop();

指定した値と同じ要素を検索し、見つかった最初の要素を削除 (remove)

lst = ["AA", "CC", "BB", "CC"]

# 先頭の"CC"を削除
lst.remove("CC")
  #=> ["AA", "BB", "CC"]

範囲指定で要素を削除

# delを使った削除も行える
lst = [0, 1, 2, 3, 4]

# 2番目の要素を削除
del lst[1]
  #=> [0, 2, 3, 4]
  
# 1〜2番目の要素を削除
del lst[1:3] 
  #=> [0, 3, 4]

指定した値と同じ要素を検索し、見つかった最初の要素を削除

タプル(tuple)

# 宣言
a = (1, 2, 3)

# 要素から値を取得
print( a[0] ) # -> 1

# タプル(tuple)は、要素の値を後から変更できない
a[0] = 2  # -> TypeError: 'tuple' object does not support item assignment

セット (set)

セットは、値の重複がない集合型。
宣言は、要素を波カッコ{}でくくって書くか、set()関数を使って宣言します。

# 波カッコでくくって宣言する方法
a = {1, 2, 3, 4, 5}

# set()関数で宣言する方法
a = set([1, 2, 3, 4, 5])

# 空のセットを宣言する場合は、set()関数で宣言する
a = set()

試しに値を重複させて宣言してみると…

a = {100, 200, 200}
a.add(300)
a.add(100)

print(a)
#-> {100, 200, 300}  ※重複したデータは削除されている
  • 値の追加
a.add(300)
  • 値の削除
a.add(300)
  • セット (set) -> リスト (list)
a = {1, 2, 3, 4, 5}
list(a)
#-> [1, 2, 3, 4, 5]
  • セット (set) -> タプル (tuple)
a = {1, 2, 3, 4, 5}
tuple(a)
#-> (1, 2, 3, 4, 5)

ディクショナリ(dict)

  • 宣言
a = { 'name': "山田太郎", 'age': 20, 'address': "日本のどっか" }
  • 値の取得・設定
# 値の取得
print( a['name'] )   # -> "山田太郎"

# 値の設定
a['name'] = "鈴木太郎"
  • 要素の削除

すべての要素をクリアする

d = {'key1': 1, 'key2': 2, 'key3': 3}
d.clear()
print( len(d) )
#-> 0

キーを指定して要素を削除

# キーを指定してその要素を削除し、削除された要素の値を取得
remove_value = d.pop('key1')

# delを使用して要素を削除
del d['key1']
  • キーの存在チェック
'name' in a.keys()  #=> true
'tel' in a.keys()   #=> false

# 複数のキーの存在チェックを行う場合 
a.keys() >= {'name', 'age'}   #=> true
a.keys() >= {'name', 'tel'}   #=> false
  • キーが存在するか分からない状態で、ディクショナリにアクセスする

dict[key]で存在しないキーにアクセスすると、KeyErrorが発生する。

print( a['存在しないキー'] )
  #-> KeyError

事前にキーの存在チェックを行えばよいが、アクセスするキーの数が多いと、煩雑なコードになってしまう。
そんな時は、下のように書けば1行で記述する事ができる。

a = { 'key1': "値1", 'key2': "値2" }

a.get('key1', "デフォルト値")
  => "値1"

a.get('key3', "デフォルト値")
  => "デフォルト値"

※ キーが存在する場合は、そのキーに設定されている値。
 存在しない場合は、第2引数で指定したデフォルト値が返る。

  • ディクショナリ(dict)のループ
a = {"key1": 1, "key2": 2}

# キーに対してループ
for k in a.keys():
  print(k)
#-> key1
#-> key2
  
# 値に対してループ
for v in a.values():
  print(v)
#-> 1
#-> 2

# キーと値のタプルでループ
for k,v in a.items():
  print(k, v)
#-> key1 1
#-> key2 2

リスト内包表記

リストのフィルタ、演算など、リストに対する一括処理を、簡潔に記述できます。

  • フィルタ

偶数値だけを取り出すサンプル

ary = [1, 2, 3, 4]
[n for n in ary if (n % 2) == 0]  #-> [2, 4]
  • 演算

各要素を2乗するサンプル

ary = [1, 2, 3, 4]
[n**2 for n in ary]  #-> [1, 4, 9, 16]

タプル内包表記

リスト内包表記とほぼ同じ。(戻り値がタプル型となる)

偶数値だけを取り出すサンプル

ary = [1, 2, 3, 4]
(n for n in ary if (n % 2) == 0)  #-> (2, 4)

set内包表記

Pythonのset型でも内包表記が使えます。

{num for num in range(5)}

dict内包表記

以外と知られていませんが、dict型でも内包表記が使えます。以外と便利なので覚えておいて損はないと思います。キー:値の形式で指定します。

{str(num):num for num in range(5)}

スポンサーリンク

関数

【構文】 def 関数名( 引数, 引数, ...):

def my_func(n):
  return n * 2

my_func(2) # -> 4

デフォルト値を持つ引数

def my_func(n1, n2 = 2):
  return n1 * n2

my_func(2)    # -> 4
my_func(2, 3) # -> 6

クラス

Pythonでのクラスは次のように作成する。

class MyClass:
    PI = 3.14  #クラス変数 (Javaで言う public static変数)
    
    def __init__(self):
        """
        コンストラクタ
        """
        self.name = "" #インスタンス変数 (Javaで言う public変数)
        
    def method1(self):
        """
        引数なしのメソッド
        """
        print("method1")

    def method2(self, args1):
        """
        引数1つのメソッド
        """
        print("method2 args1=" + args1)

クラスにプライベート関数を定義する

    def __private_method(self, args1):
        print("プライベート関数")

クラスメソッドを定義する

    @classmethod
    def class_method(cls):
        print("クラス関数")

静的(Static)関数を定義する

    @staticmethod
    def static_method():
        print("スタティック関数")

コンストラクタに引数を渡す

class MyClass:
    def __init__(self, args1, args2):
        self.p1 = args1
        self.p2 = args2


cls = MyClass(1, 'A')
print(cls.p1) #-> 1
print(cls.p2) #-> 'A'

インスタンス変数(メンバ変数)

インスタンス変数は、クラスのインスタンスごとに独立した値をが持てる変数である。インスタンス変数の宣言は、基本的にはクラスのコンストラクタ(__init__)で行います。

class SampleClass:
    def __init__(self): # コンストラクタ
        self.value = 1  # インスタンス変数 value を宣言し、初期値に1を設定

インスタンス変数の初期値を外部から渡したい場合は、コンストラクタの引数で渡すことになるでしょう。

class SampleClass:
    def __init__(self, text): # コンストラクタ
        self.value = text     # コンストラクタの引数をインスタンス変数 value へセット

プロパティ

プロパティは、クラスのインスタンス変数のようにアクセスできる関数です。関数であるため、値の取得・設定時に独自の処理を入れることができます。プロパティとして定義したい関数に@property デコレーターを設定することで、その関数は変数のようにアクセスすることができます。

以下のサンプルコードは、変数 xy の合計値を変えるプロパティの xyを宣言する例である。

class SampleClass:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    @property
    def xy(self):
        return self.x + self.y

プロパティは変数のようにアクセスできるため、上の xy プロパティを参照する場合は次のように書く。

point = SampleClass(10, 20)
point.xy  # 30

`@property` デコレーターを宣言した関数は `getter` 関数となるため、値を代入をすることはできない。 `setter` のプロパティを宣言する場合は、`@プロパティ名.setter` デコレーターを定義した関数を作成する。
@property
def x(self): # getter
    return self._x      

@x.setter
def x(self, value):  # setter
    self._x = value     

日付

Pythonで日付を扱う場合、datetime モジュールをインポートします。
主に以下の4つのクラスを用途によって使い分けます。

datetime.datetime : 日時(日付+時刻)
datetime.date : 日付だけ
datetime.time : 時刻だけ
datetime.timedelta : 経過時間

日付+時刻を扱う (datetime.datetime)

  • 現在時刻を取得する
from datetime import datetime

datetime.now().strftime("%Y/%m/%d %H:%M:%S")
#-> 2018/12/05 12:00:00
  • 日時を指定して datetimeオブジェクトを取得する
datetime(year=2018, month=1, day=30, hour=12, minute=0, second=0, microsecond=0, tzinfo=None)

日付を扱う (datetime.date)

  • 今日の日付を取得する
from datetime import date

date.today().strftime("%Y/%m/%d")
#-> 2018/12/05

日付 → 文字列変換 (日付フォーマット)

日付オブジェクト(date, datetime)を、文字列にフォーマットするには、strftime(format)関数を使います。

datetime.now().strftime("%Y/%m/%d %H:%M:%S")

よく使いそうな、日付書式のディレクティブは以下の通りです。

ディレクティブ 意味
%w 曜日を10進表記した文字列を表示します。0 が日曜日で、6 が土曜日を表します。
%d 0埋めした10進数で表記した月中の日にち。
%m 0埋めした10進数で表記した月。
%y 0埋めした10進数で表記した世紀無しの年。
%Y 西暦 (4桁) の 10 進表記を表します。
%H 0埋めした10進数で表記した時 (24時間表記)。
%I 0埋めした10進数で表記した時 (12時間表記)。
%p ロケールの AM もしくは PM と等価な文字列になります。
%M 0埋めした10進数で表記した分。
%S 0埋めした10進数で表記した秒。
%f 10進数で表記したマイクロ秒 (左側から0埋めされます)。
%z UTCオフセットを +HHMM もしくは -HHMM の形式で表示します (オブジェクトがnaiveであれば空文字列)。
%Z タイムゾーンの名前を表示します (オブジェクトがnaiveであれば空文字列)。
%j 0埋めした10進数で表記した年中の日にち。
%U 0埋めした10進数で表記した年中の週番号 (週の始まりは日曜日とする)。新年の最初の日曜日に先立つ日は 0週に属するとします。
%W 0埋めした10進数で表記した年中の週番号 (週の始まりは月曜日とする)。新年の最初の月曜日に先立つ日は 0週に属するとします。

全てのディレクティブを知りたい場合は、以下の公式ドキュメントを参照してください。

Python - 基本的な日付型および時間型 (公式ドキュメント)

文字列 → 日付

文字列を日付に変換する場合は、strptime(str, format)を使います。引数の2つ目に指定するフォーマットは、前の表で示したものを使用。

from datetime import datetime

tstr = '2021-03-29 12:50:37'
dt = datetime.strptime(tstr, '%Y-%m-%d %H:%M:%S')

日付の加減算

datetimeモジュールの、timedeltaを使って、日付・時刻の加減算を行う。

from datetime import datetime, timedelta
d = datetime.now()

#3日後
d + timedelta(days=3) 

#3日前
d - timedelta(days=3)   # これでもOK ⇒ d + timedelta(days=-3)  

#1日と1時間加算
d + timedelta(days=1, hours=1) 

timedeltaの引数に指定可能なものは、以下の通り

timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

日付の妥当性チェック

datetime.strptime()を使用し、変換に失敗してエラーになるかで、判定する。

try:
  tmp = datetime.strptime("<チェックを行う日付文字列>", "%Y/%m/%d %H:%M")
except ValueError:
  #不正な日付の場合、ValueErrorが発生する

日付の比較

datetimedateなどの日付オブジェクトの比較は、普通に比較演算子が使える。

dt1 = datetime.strptime("2021-03-12 00:00:00", '%Y-%m-%d %H:%M:%S')
dt2 = datetime.strptime("2021-03-12 12:00:00", '%Y-%m-%d %H:%M:%S')
if dt1 < dt2:
  print("dt1の方が小さい")

スポンサーリンク

型判定

型名を取得

type("ABC")   
 #-> <class 'str'>

型判定

type("ABC") is str
  #-> True

複数の型の内、いずれかに一致するか判定する場合 、inと複数の型をタプルで指定する。(OR条件)

type("ABC") in (int, str)
  #-> True

型変換

文字列 → 整数に変換

int("123")    # -> 123
int(1.5)      # -> 1
int(True)     # -> 1
int(False)    # -> 0
int("ABC")    # -> ValueError: invalid literal for int() with base 10: 'ABC'
int("123.5")  # -> ValueError: invalid literal for int() with base 10: '123.5

※実数を変換すると、小数点以下が切り捨てられる模様

文字列/整数 → 実数に変換

float("123.5")  # -> 123.5
float(2)        # -> 2.0

数値 → 文字列に変換

str(100)     # -> "100"
str(123.5)   # -> "123.5"
str(True)    # -> "True"
str(False)   # -> "False"

None

他の言語での nullは、PythonではNoneで表現する。
Noneかどうかの判定は、以下の通り。

if value is None:
    # Noneの時の処理

例外

例外をキャッチ

try:
    a = 5 / 0  #ゼロ除算を意図的に発生させる
except ZeroDivisionError:
    print("ZeroDivisionError!!")
  • 例外の情報を取得する場合
try:
    a = 5 / 0  #ゼロ除算を意図的に発生させる
except ZeroDivisionError as e:
    print("type:{0}".format(type(e)))
    print("args:{0}".format(e.args))
    print("message:{0}".format(e.message))
    print("{0}".format(e))
  • 全ての例外をキャッチする
try:
    #例外が発生しそーな処理
except:
    print("エラー発生!!")
  • 組み込み例外

Pythonであらかじめ定義されている例外

(公式) 5. 組み込み例外
https://docs.python.jp/3/library/exceptions.html

例外をスローする

raise ValueError

独自の例外を作成

独自の例外は、Exceptionを継承したクラスを作成する。
Exceptionの派生クラスを継承するのでもOK。

class ValidateError(Exception):
    """
    チェックでエラーが発生した時にスローされる例外
    """
    def __init__(self, code, message):
        super().__init__()
        self.code = code
        self.message = message

上の独自例外をスローしてみる

raise ValidateError("E0001", "エラーメッセージ")

スポンサーリンク

ファイル関連操作

Pythonでよく使うファイル系操作について、まとめました。

ファイルの存在確認

指定したパスに、ファイルまたはディレクトリが存在するかチェックするには、以下のように書きます。

import os
path = "path/to/file"
os.path.exists(path) #ファイルが存在する場合、Trueが返る

チェック対象をファイルだけに絞りたい場合は、以下のように書きます。

os.path.isfile(path)

ディレクトリの存在チェックは、以下のように書きます。

os.path.isdir(path)

ファイルの一覧を取得

ファイル一覧の取得はglobを使います。* (アスタリスク)でワイルドカード検索もできます。

import glob

files = glob.glob("path/to/dir/*")
for file in files:
    print(file)

* (アスタリスク) 以外にも、以下の特殊文字が使えます。

  • *: 0文字以上の任意の文字
  • ?: 1文字の任意の文字
  • [ab]: 括弧の中のいずれかの文字

サブディレクトリ内のファイルの一覧を取得する場合は `**`のようにアスタリスクを2つ付けて、フォルダ名もワイルドカードにします。
import glob

files = glob.glob("path/to/**/*")
for file in files:
    print(file)

現在のディレクトリとサブディレクトリも含めてファイルの一覧を取得する場合は、globメソッドの引数にrecursive=Trueを設定します。

次のコードは、path/toディレクトリと、そのサブディレクトリを内で、拡張子が「.xlsx」のファイル一覧を取得する例です。

files = glob.glob("path/to/**/*.xlsx", recursive=True)
for file in files:
    print(file)

ファイルの読み込み

open関数を使う。modeオプションにrを指定すると読み取りモードでファイルを開く。

f = open('path/to/file.txt',mode='r')

for row in f:
  print row.strip()

f.close()

次のように、with句を使えば、ブロックを抜けると自動的にファイルをクローズしてくれる。こちらの方がファイルの閉じ忘れがないため、一般的にwith句を使った方法が用いられる。

with open('path/to/file.txt', mode='r') as f:
  for row in f:
    print (row.strip())

ファイルの書き込み(上書き)

modeオプションにwを指定すると、書き込みモードでファイルを開く。ファイルが存在しない時は新規作成され、既にファイルが存在する時は上書きされる。

with open('path/to/file.txt', mode='w') as f:
  f.write('ファイルに書き込む内容\n')

ファイルへの追記

modeオプションにaを指定すると、ファイルの末尾に追記するモードとなる。ファイルが存在しない時は新規作成される。

with open('path/to/file.txt', mode='a') as f:
  f.write('ファイルに書き込む内容\n')

エンコーディングを指定してファイルを開く

エンコーディングは、encodingオプションで指定します。

with open('path/to/file.txt', mode='r', encoding='utf-8') as f:
  for row in f:
    print (row.strip())

ファイルの中身をクリア(0バイトクリア)

ファイルの中身をクリアしたい場合は、truncate関数でファイルの中身を0バイトにして中身をクリアできます。

with open('path/to/file.txt', 'r+') as f:
  f.truncate(0)

ファイルの削除

import os
os.remove('path/to/file.txt')

フォルダの削除

import shutil
shutil.rmtree('data')

パスの操作

パスからファイル名取得

ディレクトリ名を含むパス文字列からファイル名を取得には、os.path.basename関数を使います。

import os
filename = os.path.basename("path/to/file.txt")
print(filename)   #=> file.txt

拡張子なしのファイル名を取得

filename_without_ext = os.path.splitext(os.path.basename("path/to/file.txt"))[0]
print(filename_without_ext) #=> file

UUID

「Universally Unique IDentifier」の略称で、オブジェクトを一意に識別するための128ビットの文字列です。
認定機関に登録する必要もなく、いつでも誰でも生成ができますが、生成さらた値は世界中で唯一のIDと表現されます。生成方法によって重複する確率が極めて低いと言われている点も特徴です。

import uuid

#UUID version 1(MAC アドレスを利用)
u1 = str(uuid.uuid1())    # => '68496776-02b1-11e9-8c17-d46a6aae23b8'

#UUID version 4(完全ランダム)
u4 = str(uuid.uuid4())    # => 'bd48b541-5401-42be-a467-b974976f5a62'

sleep処理(スリープ)

他の言語と同じように、Pythonでもsleepで処理を一時停止することができます。

import time
time.sleep(秒数)

sleep(スリープ)する時間をミリ秒で指定する

Pythonのtime.sleepには、秒でしたスリープ時間を渡せないため、ミリ秒(1/1000秒)で指定します。

import time
time.sleep(100 / 1000)  #100ミリ秒スリープする

コメント

  • 行コメント
#コメントです
  • ブロックコメント
"""
ブロックコメント
ブロックコメント
"""

Pythonにはブロックコメントはありません。
代わりに、複数行の文字列リテラルで代用します。

コードのエンコーディング

日本語を扱うコードの場合、ファイルの先頭にエンコーディングを指定する

UTF8の場合

# coding: UTF-8

その他のエンコーディング

# coding: Shift_JIS
# coding: cp932
# coding: EUC-JP

エスケープシーケンス

改行、タブなどの特殊文字はエスケープシーケンスで表します。
エスケープシーケンスは、\と表現する特殊文字の組み合わせで指定します。

すべてではありませんが、Pythonで使用できるエスケープシーケンスは下記表の通りです。

エスケープシーケンス 意味
\newline 文字列を途中で改行する
\ バックスラッシュ ()
一重引用符 (’)
" 二重引用符 (")
\a 端末ベル (BEL)
\b バックスペース (BS)
\f フォームフィード (FF)
\n 行送り (LF)
\r 復帰 (CR)
\t 水平タブ (TAB)
\v 垂直タブ (VT)
\ooo 8進数oooを持つASCII文字
\xhh 16進数hhを持つASCII文字

おわりに

時間が空いたり、他の言語をやっていたりすると、意外と基本を忘れますね。
これを見て、一気に復習しましょう!

<関連記事>

MacにPython3をインストールする! (サクッとインストールしたい人向け)

Mac環境に、Python3を簡単にインストールする方法を紹介しています。

Flaskでソースの変更を検知して、Webアプリを自動リロードする[Python Tips]

Flaskの開発で、ソースを更新したら、自動的にWebアプリをリロードする方法です。

Flaskで REST API開発する! 直ぐに実行できるサンプルコードで解説 【Python Tips】

Pythonの軽量Webフレームワークである、FlaskでREST APIを作るまでの流れを、紹介します。

Flask-RESTful を使って、REST APIを作る【Python Tips】

Flaskと、Flask-RESTfulを使って、REST APIを作ります。
Flask-RESTfulを使うと、オブジェクト思考な感じで、REST APIが作れます。

Pythonで小数点の四捨五入/切り捨て/切り上げを行う

Pythonのdecimalモジュールを使って、小数点の丸めを行う方法です。

pipコマンドまとめ! 忘れても思い出せばいい! 【Python TIPS】

よく使うpipコマンドをまとめました。

Pythonで正規表現を使って数値/英字チェックを実装する (コピペ用)

数値/半角英字などのチェック処理を、Pythonの正規表現を使って実装します。
コピペで簡単に使えるようになっています。

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ