Pythonでファイルを読み込むサンプルとしてよくあるのが、実行ファイルと同じディレクトリに対象ファイルが置いてある前提のパターンですが、利用者がファイルを指定したものを読み込ませるという方が実用的です。
“ファイルを読み込む”という基本を学ぶ点においてはそれでもいいのですが、実運用の場面を考えると「読み込みファイルは、必ずこのフォルダに置いてください!」という仕様にしてしまうのは少々もったいない。
せっかくならもっと自由に使えた方がいいと思うので、それを前提としたファイル読み込みテクニックをまとめました!
ダイアログを開いてファイルを指定する
まず、前提としてファイルを指定するところから見ていきます。
ファイルを指定するには、tkinterパッケージにあるfiledialogを使用します。
from tkinter import filedialog
# 各種引数を設定してダイアログ表示
typ = [('','*')]
dir = 'C:\Windows\System32'
fle = filedialog.askopenfilename(filetypes = typ, initialdir = dir)
これを実行すると、ファイル指定のダイアログが表示されますので、確認してみましょう。
なお、filetypesを[(”,’*’)]で指定すると、すべてのファイルが選択できるようになるため、指定する内容を絞れるのであれば、その方が扱いやすくなります。
ここはポイントとして抑えておきましょう。
from tkinter import filedialog
# 各種引数を設定してダイアログ表示
typ = [('テキストファイル','*txt')]
dir = 'C:\Windows\System32'
fle = filedialog.askopenfilename(filetypes = typ, initialdir = dir)
テキストファイルを読み込む
それでは、まずテキストファイルを読み込む場合の方法を紹介していきます。
読み込む方法としては
- 一括ですべて読み込む
- 特定の行だけ読み込む
- 一行ずつすべて読み込む
の3パターンがあり、何をしたいかによって読み込み方を選ぶとよいです。
一括ですべて読み込む
一括ですべて読み込む場合は、readメソッドを使う形となります。
from tkinter import filedialog
# 各種引数を設定してダイアログ表示
typ = [('テキストファイル','*txt')]
dir = 'C:\Windows\System32'
fle = filedialog.askopenfilename(filetypes = typ, initialdir = dir)
testf = open(fle, 'r', encoding="utf-8")
data = testf.read()
print(data)
testf.close()
<出力結果>
注意する点としては、open関数に指定するencordingの部分で、デフォルトの設定(何も指定しなかった場合の設定)が
- Windows端末…Shift-JIS
- Mac端末…UTF-8
となるため、何も指定せずにWindows端末でUTF-8のテキストを読もうとするとエラーが発生します。
このことから、読み込み対象のファイルが何でエンコードされているかで、指定要否が変わりますので、注意が必要です。
特定の行だけ読み込む
つづいて、特定の行だけ読み込む場合です。
ここではreadlinesメソッドを使う形となります。
from tkinter import filedialog
# 各種引数を設定してダイアログ表示
typ = [('テキストファイル','*txt')]
dir = 'C:\Windows\System32'
fle = filedialog.askopenfilename(filetypes = typ, initialdir = dir)
testf = open(fle, 'r', encoding="utf-8")
data = testf.readlines()
print(data[0])
print(data[2])
testf.close()
<出力結果>
dataが配列として定義されますので、配列に一行ずつ設定される形となります。
間違いやすい点があるとすると、readlineというメソッドもあり、このメソッドだと1文字ずつ配列に設定される形となってしまうので、注意が必要です。
机の引き出しをイメージしてもらえると分かりやすいです。
readlinesで設定すると図1のような形、readlineで設定すると図2のような形となります。
一行ずつすべて読み込む
一行ずつすべて読み込む場合は、for文をつかって処理を繰り替えして読み込みます。
from tkinter import filedialog
# 各種引数を設定してダイアログ表示
typ = [('テキストファイル','*txt')]
dir = 'C:\Windows\System32'
fle = filedialog.askopenfilename(filetypes = typ, initialdir = dir)
testf = open(fle, 'r', encoding="utf-8")
for line in testf:
print(line)
testf.close()
<出力結果>
繰り返し処理は、forのあとに一段下がった部分(ここでいうprint関数)を繰り返す形となり、行の読み込みはforのところで次々と読んでいく形となります。
Excelファイルを読み込む
つぎに、Excelファイルを読み込む方法です。
私がよく使うのは、Excelファイルを読み込んでファイル上にあるマクロを実行するというもので、これが出来ると、Python上でExcelの操作が可能となりますので、Pythonで生成したexeひとつでいろんな処理を自動実行出来るようになります。
なお、Excelを操作するためのライブラリにはopenpyxlとxlwingsの2種類がありますが、ここではxlwingsの方法で解説していきます。
xlwingsライブラリをインストールすると、Excelファイルを開くための関数が使えるようになるので、下記を例にコードを書いていきます。
※ライブラリのインストールは、コマンドプロンプトでpip install xlwingsで完了です。
# xlwingsライブラリのインポート
import xlwings as xw
# Excelファイルオープン
excel = xw.App(visible=False)
wb = excel.books.open('D:/Python_test/macro_test.xlsm')
ここまで書くことで、Excelを起動することが可能となります。
起動したExcelを見えるようにするか、見えないようにするかはApp関数の中のvisibleをTrueにするかFalseにするかで変更可能です。
起動したExcelを見えるようにする | True |
起動したExcelを見えないようにする | False |
Excelを起動すると、その中に設定されているマクロの実行も可能となります。
# xlwingsライブラリのインポート
import xlwings as xw
# Excelファイルオープン
excel = xw.App(visible=False)
wb = excel.books.open('D:/Python_test/macro_test.xlsm')
# 実行するマクロの指定
macro = wb.macro('test_module')
# Excelマクロ実行
macro()
# クロージング処理
wb.save()
wb.close()
excel.quit()
なお、マクロに書いたSubプロシージャに引数がある場合は、Excelマクロを実行する箇所で指定してあげると、Excel側へ引数を渡してくれます。
# xlwingsライブラリのインポート
import xlwings as xw
# Excelファイルオープン
excel = xw.App(visible=False)
wb = excel.books.open('D:/Python_test/macro_test.xlsm')
# 実行するマクロの指定
macro = wb.macro('test_module2')
# Excelマクロ実行
macro('test', 123)
# クロージング処理
wb.save()
wb.close()
excel.quit()
CSVファイルを読み込む
最後にCSVファイルを読み込むケースに関する紹介です。
CSVの読み込みには、すべてのデータを一度に読み込むパターンと、1行ずつ読み込むパターンがあります。
どちらで読むかは用途によって使い分けをしていけばいいですので、どちらも押さえておいて損はないです。
すべてのデータを読み込むパターン
pandasライブラリ
事前にpandasライブラリをインストールし、read_csv関数を使うことで、読み込むことが出来るようになります。
※ライブラリのインストールは、コマンドプロンプトでpip install pandasと打てば完了です。
# pandasライブラリ使用
import pandas as pd
import os
# tkinterモジュールのfiledialog関数を読込み
from tkinter import filedialog
# 各種引数を設定してダイアログ表示
typ = [('CSV','*.csv')]
dir = 'C:\Windows'
fle = filedialog.askopenfilename(filetypes = typ, initialdir = dir)
if fle!='':
df = pd.read_csv(fle)
print(df)
<出力結果>
CSVの中身を一度に読み込みました。
なお、この場合のdfはDataFrame形式になります。
numpyライブラリ
つづいてnumpyライブラリを使った読み込みです。
ここではloadtxt関数を使用します。
# numpyライブラリ使用
import numpy as np
import os
# tkinterモジュールのfiledialog関数を読込み
from tkinter import filedialog
# 各種引数を設定してダイアログ表示
typ = [('CSV','*.csv')]
dir = 'C:\Windows'
fle = filedialog.askopenfilename(filetypes = typ, initialdir = dir)
if fle!='':
data_array = np.loadtxt(fle, dtype='int64', encoding='shift-jis', delimiter = ',')
print(data_array)
<出力結果>
今度は配列としてデータが返ってきました。
難点があるとすると、引数にデータタイプを指定する必要があるため、数字と文字列など、複数の属性が入ったCSVを読み込めないというデメリットがあります。
引数の指定も多いことから、もし一度にデータを読み込むのであればpandasの方がやりやすいです。
一行ずつ読み込むパターン
最後に、一行ずつ読み込むパターンをご紹介します。
CSVの読み込みにはreadline関数を使用するのですが、ここで疑問に思った方もいらっしゃるかと思います。
私も最初はそう思いました。
すると…
なんと、CSVを読み込むときとテキストを読み込むときのreadline関数は行われる処理が違うんだそうで、CSV読み込みでは1行分がデータが読み込まれるとのことです。
ここはややこしい部分となりますが、しっかり押さえておきましょう。
# tkinterモジュールのfiledialog関数を読込み
from tkinter import filedialog
# 各種引数を設定してダイアログ表示
typ = [('CSV','*.csv')]
dir = 'C:\Windows'
fle = filedialog.askopenfilename(filetypes = typ, initialdir = dir)
with open(fle, encoding = 'shift-jis') as f:
while True:
data = f.readline()
data_s = data.strip()
print(data_s)
if not data :
break
<出力結果>
なお、readlineの解釈がややこしいので、別の関数を使いたい!
という場合には、csvモジュールというものがあります。
別の手として、このモジュールから参照できるreader関数を使って読み込むという手もありますので、読みやすいプログラムにするためにも参考としてみてはいかがでしょうか?
import csv
# tkinterモジュールのfiledialog関数を読み込み
from tkinter import filedialog
# 各種引数を設定してダイアログ表示
typ = [('CSV','*.csv')]
dir = 'C:\Windows'
fle = filedialog.askopenfilename(filetypes = typ, initialdir = dir)
with open(fle, encoding = 'shift-jis') as f:
data = csv.reader(f)
for data_row in data :
print(data_row)
<出力結果>
これだと似たような関数を使わずともCSVを読み込めますので、こちらも便利な機能となっています。
試しにご利用ください。
まとめ
今回は外部ファイルからデータを拾うことについて見ていきました。
他にもやり方が溢れていますが、ここで基礎を固めて、自分にも相手にも伝わりやすいコードを書いていきましょう!