Pythonのファイルの読込と保存、ファイルとフォルダの有無やパス、一覧などを取得

スポンサーリンク

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)
追記する際は、改行コード(\n)を先頭に入れると、改行されて区切りになりますのできれいです。

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)

他にもいろいろありますが、普段使うのはこれくらいです。
その他の詳しい情報は以下のドキュメントを参照してください。

json — JSON encoder and decoder — Python 3.9.5 documentation

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という標準ライブラリを使用します。様々な情報が取得できます。詳しくはドキュメントを参照してください。

os — Miscellaneous operating system interfaces — Python 3.9.5 documentation

ファイルやフォルダの有無

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.isfileos.path.isdirを使って振り分けるしかないかと思います。

import os

os.listdir(path)

フォルダ(ディレクトリ)の作成

os.makedirs(フォルダのパス, exist_ok=True)

  • フォルダのパス:階層化されたパスを指定した場合、存在しない階層のフォルダも同時に作成する。
  • exist_okTrueにすると既にあるフォルダを指定してもエラーにならない。デフォルトは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'])

 

タイトルとURLをコピーしました