Python3を用いたファイルを操作する関数を紹介しています。テキストファイルやCSVの読込、保存やPandasデータフレームやNumpyによる方法、ファイルやフォルダの存在の有無やパスの取得など具体的なサンプルプログラムを掲載しています。
他のフォルダにあるファイルを参照
設定ファイルや関数などを別のファイルで作成したいときに利用します。
import sys
という標準ライブラリを使用します。
sys.path.append('パス')
import sys sys.path.append('../')
ファイルの読込と保存
ファイルの読込と保存(書き出し)について説明します。PandasやNumpyでの操作が楽ですよ。
テキスト
あまり使う機会はない。しかし、ログなどを吐き出しで使うかもしれないので、さらっと紹介です。
# 読込 with open(path) as f: print(f) # 読込(全体を文字列とする場合は with open(path) as f: txt = f.read() # 一行毎に読み込み f = open(path, 'r') while True: txt = f.readline() if data == '': break f.close() # 保存 with open(filename, mode='w') as f: f.write(txt) # 追記 with open(filename, mode='a') as f: f.write(txt)
CSV
csv
という標準ライブラリを使用します。標準ですのでインストールは不要です。
import csv # csvライブラリをインポート # 読込 with open(filename, 'r') as f: data = csv.reader(f) for line in data: # 一行ずつ読み込む print(line) # 保存 with open(filename, 'w') as f: writer = csv.writer(f) writer.writerows(data)
JSON
読込
open()
でファイルを開きます。- 開いたファイルを
json.load()
で読み込みます。連想配列の型になっています。 - 見やすくする際は、
json.dumps( 連想配列, indent=2)
とすると見やすくなります。dump
ではありません。
import json f = open('test.json', 'r') print(test) # <_io.TextIOWrapper name='test.json' mode='r' encoding='UTF-8'> data = json.load(f) print(data) # {'bbb': {'1': 2, '4': 5}, 'ccc': {'1': 3, '4': 6}} print(json.dumps(data)) # {"bbb": {"1": 2, "4": 5}, "ccc": {"1": 3, "4": 6}} print(json.dumps(data, indent=2)) # { # "bbb": { # "1": 2, # "4": 5 # }, # "ccc": { # "1": 3, # "4": 6 # } # }
保存
open
で書込用としてファイルを開きます。json.dump(辞書型, 開いたファイル)
で出力します。dumps
ではありません。
data = {"Tokyo":{"tel":"03"}, "Osaka":{"tel":"06"}, "Kyoto":{"tel":"075"}} with open('test2.json', mode='w') as f: json.dump(data, f)
他にもいろいろありますが、普段使うのはこれくらいです。
その他の詳しい情報は以下のドキュメントを参照してください。
Pandas(データフレーム
以下のページで、その他のExcelやJSON、HTMLなどを紹介しています。
Python|Pandasデータフレームのファイル出力・読込
CSV
読込
# 自動的に一行目がカラム名になる df = pd.read_csv('filename.csv') # カラム名なし df = pd.read_csv('filename.csv', header=None) # カラム名を指定 df = pd.read_csv('filename.csv', names=('A', 'B', 'C', 'D')) # インデックスの指定 df = pd.read_csv('filename.csv', index_col=0)
保存
保存の際にインデックスを含めない場合は、, index=False
とパラメーターを追加してください。
# 保存 df.to_csv("filename.csv") # ヘッダーとインデックを含めない df.to_csv("filename.csv", header=False, index=False) # 文字コードを指定する(読み込むファイルの文字コードを指定する df.to_csv("filename.csv", encoding="shift_jis")
Numpy
CSVファイル
読み込みの際に1行目のヘッダーを含めない場合は、, skiprows=1
とパラメーターを入れてください。
# 読込 data = np.loadtxt("filename.csv", delimiter=",") # 出力 np.savetxt('filename.csv', data, delimiter=',')
ファイルやフォルダの操作など
import os
という標準ライブラリを使用します。様々な情報が取得できます。詳しくはドキュメントを参照してください。
ファイルやフォルダの有無
import os if os.path.isfile(file_path) == False: print("ファイルがありません") if os.path.isdir(dir_path) == False: print("フォルダがありません")
os.path.isdir(dir_path)
にファイル名を含むパスを指定すると、パス自体が存在していてもFalse
を返すので注意しましょう。現在の実行中のファイル名
__file__
はターミナルで利用できますが、Jupyter Notebookでは利用できません。
import os # 拡張子あり print(os.path.basename(__file__)) # 拡張子なし print(os.path.splitext(os.path.basename(__file__))[0])
現在の実行中のファイル名と絶対パス
__file__
はターミナルで利用できますが、Jupyter Notebookでは利用できません。
import os os.path.abspath(__file__)
現在の実行中のファイルの絶対パス
os.getcwd()
はJupyter Notebookでも利用できます。
import os print(os.path.dirname(os.path.abspath(__file__))) print(os.getcwd())
フォルダ内の一覧
指定したパス内のフォルダやファイルの一覧をリスト形式で取得できます。
フォルダのみ、ファイルのみを取得することはできないので、一覧を取得後に、リストをループで回してos.path.isfile
とos.path.isdir
を使って振り分けるしかないかと思います。
import os os.listdir(path)
フォルダ(ディレクトリ)の作成
os.makedirs(フォルダのパス, exist_ok=True)
- フォルダのパス:階層化されたパスを指定した場合、存在しない階層のフォルダも同時に作成する。
exist_ok
:True
にすると既にあるフォルダを指定してもエラーにならない。デフォルトはFlase
。
import os dir_path = "temp/" print(os.path.isdir(dir_path)) # False os.makedirs(dir_path, exist_ok=True) print(os.path.isdir(dir_path)) # True
ファイルの削除
os.remove(ファイルパス)
import os file_path = "test.txt" with open(file_path, 'w') as f: f.write('') print(os.path.isfile(file_path)) # True os.remove(file_path) print(os.path.isfile(file_path)) # False
フォルダ(ディレクトリ)の削除
os.rmdir(ディレクトのパス)
フォルダ(ディレクトリ)内にファイルやフォルダがあるとエラーになります。
以下のように事前にフォルダ内のファイルやフォルダを削除する必要があります。
または、ライブラリのshutilを使用するとフォルダ内のファイルやフォルダの有無に関わらず削除することができます。
import os dir_path = "temp/" file_path = dir_path + "test.txt" os.makedirs(dir_path, exist_ok=True) print(os.path.isdir(dir_path)) # True with open(file_path, 'w') as f: f.write('') print(os.path.isfile(file_path)) # True os.remove(file_path) print(os.path.isfile(file_path)) # False os.rmdir(dir_path) print(os.path.isfile(dir_path)) # False
フォルダ(ディレクトリ)の削除(一括削除)
フォルダ内のファイルやフォルダの有無に関わらず、フォルダを削除することができます。
shutil.rmtree(フォルダのパス)
- 標準ライブラリをインポートする必要があります。
import shutil
import os import shutil dir_path = "temp/" file_path = dir_path + "test.txt" os.makedirs(dir_path, exist_ok=True) print(os.path.isdir(dir_path)) # True with open(file_path, 'w') as f: f.write('') print(os.path.isfile(file_path)) # True shutil.rmtree(dir_path) print(os.path.isfile(file_path)) # False print(os.path.isfile(dir_path)) # False
アプリの起動(ファイルを開く)
subprocessという標準ライブラリを使用します。標準ですのでインストールは不要です。
WindowsとMacでは挙動が異なるようです。
コメントアウトしているのがWindowsです。
下の2行がMacですが、フルパスでなくても開くようです。Windowsはフルパスでないと駄目みたいです。
import subprocess # subprocess.Popen(r"/Users/xxxxxx/Desktop/python/blog/test.xlsx") # subprocess.Popen(['open', '/Users/xxxxxx/Desktop/python/blog/test.xlsx']) subprocess.Popen(['open', 'test.xlsx'])