2018年9月9日日曜日

【Python3】pythonの教科書(6) ~コマンド引数、ファイル検索、os.path、クラス

1、コマンド引数、ファイル検索
コマンドライン引数を使用して、複数テキストファイルからテキストファイルを検索するサンプルです。

import sys
import os
if len(sys.argv) <= 1:  # sys.argvがコマンドライン引数
    print("pyファイルの後ろに引数(キーワード)を指定してください")
    sys.exit(0) # プログラムを終了する

keyword = sys.argv[1]
for root, dirs, files in os.walk("."):
    for fi in files:
        result = []

        try: #try-catchを使って、テキストファイル以外読み込んだ時のエラー防止
            path = os.path.join(root, fi)
            with open(path, encoding='utf-8') as f:
                for no, line in enumerate(f):
                    if line.find(keyword) >= 0:
                        line = line.strip()
                        s = "| {0:4}: {1}".format(no+1, line)
                        result.append(s)

        except:
            continue

       # resultに検索結果があれば結果を表示
        if len(result) > 0:
            print("+ file: " + fi)
            for li in result:
                print(li)


2、スクリプトパス
__file__でパス取得できます。
 
print __file__    # スクリプトファイルへの相対パス
print os.path.dirname(__file__) # スクリプトファイルのあるディレクトリへの相対パス
txt = os.path.join(os.path.dirname(__file__), 'input.txt') # スクリプトと同じディレクトリのファイル input.txt のパス
print txt 

print os.path.basename(__file__) # スクリプトファイル名
print os.path.abspath(__file__)  # スクリプトファイルの絶対パス

print os.getcwd()                # 実行時カレントディレクトリの絶対パス
 
 os.path にはいろいろな関数があります。
https://docs.python.jp/3/library/os.path.html
 

3、クラス
__init__が初期化関数になります。selfはインスタンス自身を表します。
  
class Clock:
    def __init__(self, hour, min, sec):
        self._hour = hour
        self._min = min
        self._sec = sec
    @property
    def hour(self):
        return self._hour

obj = Clock(11, 10, 0)
print(obj.hour) 

派生クラスは、次のように定義します。 
class 派生クラス名(基底クラス名):
  派生クラスの定義
 ...
 
派生クラスから基底クラスのメソッドを呼び出すには
super().基底クラスのメッソド()
と書きます。
 
メッソド名や変数名がアンダーバー(_)からはじまっていれば、 
非公開メソッド定義になります。
 
 
class Car:
    ''' 基底クラス '''
    def __init__(self, owner):
        self.car_type = "normal"
        self.owner = owner

   def show_status(self):
        ''' 状態を表示 '''
        print("owner:", self.owner)
        print("car_type:", self.car_type)
 
   def _test
        ''' 非公開メソッド''' 
        print("test.....") 

class Van(Car):
    ''' 派生クラス '''
    def __init__(self, owner):
        super().__init__(owner)
        self.car_type = "van"


0 件のコメント:

コメントを投稿