あまちゃんエンジニア

文系出身・独学のアマチュアエンジニアの備忘録

PythonのxlrdでExcel(エクセル)ファイルの読み込みに失敗した時の対処法

PythonExcelファイルを読み込む際、よく利用するのがライブラリxlrdです。

xlrdを利用すれば、以下のような記述でExcelファイルを読み込むことができます。

work_book = xlrd.open_workbook('開きたいExcelファイルのパスを記述')

ただし、2020年12月ごろにライブラリが更新され、xlrdではxlsxファイルを読み込む機能が外され、上述したパスにxlsxファイルを指定した場合、以下のようなエラーが発生します。

xlrd.biffh.XLRDError: Excel xlsx file; not supported

私はエラーの原因が全くわからず、自分の記述内容に誤りがあるのではないかと考え、色々と調べました。
結果、上記のライブラリ更新が原因だとわかりました。

xlsファイルを正常に読み込むことができるため、もし、xlsファイルを読み込むのであれば、そのままxlrdが利用できます。
最近では、会社で扱うExcelファイルの拡張子もxlsxが多くなっているため、できる限り、xlsxとxlsファイルの両方を読み込むことができるようにしておくのが良いと思います。

では、xlrdを使ってxlsxファイルを読み込むことはできないのか?

結論から言うと、xlrdを使ってxlsxファイルを読み込むことは可能です。
その方法について、これからご紹介します。

ライブラリxlrdのバージョンを戻すことでExcelファイルのxlsxを読み込む

あまり良い方法とは言えないかもしれないですが、xlsxファイルを読み込む機能が備わったxlrdのバージョン1.2.0に戻すことで、xlsxファイルを読み込むことが可能です。

一時的な対応ではありますが、今のところ問題なく利用でき、恐らくこれがベストな方法ではないかと思います。
他の方法でもExcelファイルを読み込むことはできるため、xlrdに拘らないのであれば、その方法を試すのも良いでしょう。

ちなみにですが、以下のコードでxlrdのバージョンを戻す(指定する)ことができます。

pip install xlrd==1.2.0

ご自身の環境で正常にxlrdを使って、xlsxファイルを読み込むことができるのか、確認してみましょう。

GoogleColabでGoogleDriveに保存したCSVファイルを読み込む方法

Pythonに限らず、プログラムでCSVファイルを読み込む場合、そのCSVファイルの保存先がデスクトップであることは極めて少ないと個人的に思います。
Googleアカウントをお持ちの方であれば、GoogleDriveにファイルを保存している方も多いのではないでしょうか。

私は普段、Pythonでデータを解析する際、GoogleColabを利用するのですが、各種ファイルはソースコードと同じフォルダ内に別フォルダを設けて保存しています。

保存したファイルをPythonを使って読み込む場合、当然ながら、ファイルの保存先(パス)を指定しなければなりません。

単純な作業かもしれませんが、最初は躓くポイントでもあるため、GoogleColabでGoogleDriveに保存したCSVファイルを読み込む方法について、ご紹介したいと思います。

GoogleDriveの保存先を単純に指定しても、ファイルが読み込めない罠

GoogleDriveに保存したファイルを読み込む際、単純にファイルの保存先(パス)を記述しても、エラーとなり、読み込むことができません。
例えば、以下のようにソースコードを記述してみます。
実行すると、

import pandas as pd
Dir = '/content/drive/MyDrive/Colab Notebooks/blog/'
customer_master = pd.read_csv( Dir + 'customer_master.csv' )

以下のような、エラーが表示されていることがわかると思います。

f:id:amachan-engineer:20210111101714j:plain
GoogleDriveで保存したファイルの読み込みエラー

最初、保存先を指定する記述を疑ってしまいがちですが、単純にGoogleDriveがアクセスを拒否しているため、いくら頑張って正しい保存先のアドレスを指定しても、エラーを解除することはできません。
私はこれだけで結構はまってしまいました・・・

では、どのようにすれば、GoogleDriveに保存したファイルを読み込むことができるのか。
その方法についてご紹介します。

GoogleColabで GoogleDriveをマウントする方法

GoogleDriveに保存したファイルを読み込むには、GoogleDriveをマウントしなければなりません。

「マウント」とは、今回のケースで言えば、GoogleDriveに対して、GoogleDriveに接続したアプリ(GoogleColab)を認識させ、GoogleDriveを利用できる状態にすることを言います。

つまり、GoogleDriveへのアクセスを許可するような記述や作業が必要となります。

GoogleColabではいくつか、GoogleDriveをマウントする方法があり、それらの方法についてご紹介します。

GoogleColabのクリック操作でGoogleDriveをマウントする方法

GoogleColabを使って、GoogleDriveをマウントする方法で、一番簡単なのがクリック操作による方法です。
個人で利用する分では、恐らくほとんどの人が、この操作だけで十分だと思います。

仕事で活用する人にとっては、クリック操作は個人の環境に依存してしまうため、おすすめはしません。
あくまで個人で利用することを想定した方法となります。

では、早速、操作方法を見てみましょう。

まず、GoogleColabの左メニュー「ファイル」をクリックし、表示された3つのアイコンのうち、一番右のGoogleDriveのアイコンをクリックします。

f:id:amachan-engineer:20210111102338j:plain
左メニュー「ファイル」から「GoogleDriveをマウント」をクリック

GoogleDriveのアイコンをクリックすると、GoogleColabからGoogleDriveへのアクセス許可が求められますので、「GOOGLEドライブに接続」をクリックします。

f:id:amachan-engineer:20210111102632j:plain
GoogleDriveへのアクセス許可

これで、GoogleDriveへのマウントが完了です。

では、エラーが解消されているか、コードを実行して結果みてみましょう。

import pandas as pd
Dir = '/content/drive/MyDrive/Colab Notebooks/blog/'
customer_master = pd.read_csv( Dir + 'customer_master.csv' )

customer_master.head()
"GoogleDriveからCSVファイルを読み込んだ結果"
GoogleDriveからCSVファイルを読み込んだ結果

GoogleDriveのファイルが正常に読み込まれ、表示もファイルの内容と一致していることが確認できます。

GoogleDriveの保存先のパスを取得する方法

GoogleDriveに保存したファイルを読み込むには、対象ファイルの保存先のパスが必要になります。
パスに誤りがあると、正常にファイルが読み込めないので気を付けましょう。

例えば、以下の指定だとエラーになり、「ファイルが見つからない」と怒られます。

import pandas as pd
Dir = '/MyDrive/Colab Notebooks/blog/'
customer_master = pd.read_csv( Dir + 'customer_master.csv' )

一見、間違っていないように見えますが、MyDriveよりも上位のフォルダは存在しており、これだと正確なパスになっておらず、エラーが出てしまいます。

では、どのようにして正確なパスは取得できるのか。
GoogleColabではめちゃくちゃ簡単な方法で、パスを取得できます。

GoogleColabを利用して、ファイルのパスを取得する方法について、ご紹介します。

GoogleColabでは左メニューのフォルダ構成から、対象のファイルまでクリックして、フォルダを開きます。

f:id:amachan-engineer:20210111104445j:plain
GoogleDriveのファイルパスを取得

対象ファイルまでたどり着けたら、その対象ファイルにカーソルをあてると、ファイル名の右側に三つの丸マークがあるので、それをクリックします。
「パスをコピー」をクリックすると、保存先のファイルのパスを取得できます。

GoogleColabを使えば、簡単にGoogleDriveのファイルが読み込める

GoogleColabは私のような独学かつ初心者にとっては、最高のツールです。
今回のようなGoogleDriveのフィルを読み込む作業も、ほとんどクリック操作だけでできてしまうので、悩む時間も少なく、作業を終えることができます。

GoogleDriveを活用したファイルの読み込みは、色々なプログラミングの場面でも活用できるため、覚えておいて損はありません。