質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

8233閲覧

Python_openpyxl_loadworkbookのファイルパス指定について

nachan_naito

総合スコア1

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

openpyxl

openpyxlは、Excel2007以降のファイル(xlsx/xlsm/xltx/xltm)を読み書きするためのPythonライブラリです。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/27 05:07

前提・実現したいこと

Pythonで指定されたフォルダにあるxlsx.を参照して、他のエクセルへコピペする機能を実装中にエラーメッセージが発生しました。

※本当はload_workbook('')のパス指定にワイルドカードを使用できれば問題は即座に解決します。
それができないので、指定されたフォルダ内にはいっているエクセルファイルを認識させ、そいつのフルパスをもってくるというコードにしました。

発生している問題・エラーメッセージ

Traceback (most recent call last):
File "c:\Users\testsample\Desktop\Python_test\ukeiresijisyo.py", line 12, in <module>
wb1 = px.load_workbook('file_path')
File "C:\Program Files\Python39\lib\site-packages\openpyxl\reader\excel.py", line 313, in load_workbook
reader = ExcelReader(filename, read_only, keep_vba,
File "C:\Program Files\Python39\lib\site-packages\openpyxl\reader\excel.py", line 124, in init
self.archive = _validate_archive(fn)
File "C:\Program Files\Python39\lib\site-packages\openpyxl\reader\excel.py", line 94, in _validate_archive
raise InvalidFileException(msg)
openpyxl.utils.exceptions.InvalidFileException: openpyxl does not support file format, please check you can open it with Excel first. Supported formats are: .xlsx,.xlsm,.xltx,.xltm

エラーメッセージ

### 該当のソースコード # ライブラリを取り込む import openpyxl as px from openpyxl import Workbook import os import re import glob #読み込むエクセルの名前取得 file_path = glob.glob('C:\Users\ten09048\Desktop\test_ukeire\読み込み\*.xlsx') # EXCELを開いて読み込む wb1 = px.load_workbook('file_path') wb2 = px.load_workbook('C:\Users\ten09048\Desktop\test_ukeire\受入検査指示書.xlsx') ws1 = wb1['Sheet1'] ws2 = wb2['Sheet1'] ```Python ### 試したこと 読み込むファイルパスにワイルドカードを使用してみたが失敗。 globによりパス名を取得後、split関数を使用して、ファイル名を+して指定してみたりしましたがうまくいきませんでした。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

python

1wb1 = px.load_workbook('file_path')

これだと、file_pathという名前のxlsxファイル(中身はxlsxだけどわざわざリネームして拡張子を取った状態)を開こうとしてますね。


python

1file_name = 'Book1.xlsx' 2wb1 = px.load_workbook(file_name)

とすると(カレントディレクトリの)Book1.xlsxを開きます。

これと同じことをするコードが

python

1wb1 = px.load_workbook('Book1.xlsx')

ですね。質問のコードはこちら。カレントディレクトリのfile_pathを開きます。


glob関数の結果はリストのはずです。([]が付いてませんか?)

python

1wb1 = px.load_workbook(file_path[0])

としてみたらどうでしょう。

投稿2021/01/27 05:52

編集2021/01/27 13:33
quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nachan_naito

2021/01/27 06:49

コメントありがとうございます。 #読み込むエクセルの名前取得 file_path = glob.glob('C:\Users\ten09048\Desktop\test_ukeire\読み込み\*.xlsx') によって、指定フォルダのエクセルのパスを取得して # EXCELを開いて読み込む wb1 = px.load_workbook('file_path') で読み込むパスを指定するにはどのような操作が追加で必要でしょうか。 名前を取得してみたりしましたが、load_workbookにはフルパスの指定しかできないのでしょうか?
quickquip

2021/01/27 06:57

ファイルが複数あった時の挙動はどうしたいのでしょう? まず file_path がどういうデータか確認していますか? file_path と 'file_path' の違いが分からないということでしょうか? > load_workbookにはフルパスの指定しかできないのでしょうか? そんなわけはないのですが、上記のことも含めて「どこが分からないのか?」という手がかりがなかったので「こうするといい」ということは回答しませんでした。
nachan_naito

2021/01/27 07:12

コメントありがとうございます。 ファイルが復数ある場合は想定していないです。 目的は、指定フォルダに入っている.xlsxを読み込むことにあります。 (なので、ファイルの読み込みに*が使えれば問題は解決すると思っています。 リネームせずに読み込ませたいという思いです。 file_pathと'file_path'の違いは確認してみます。 ウェブで似たようなコードを改良して、試して、を繰り返していますので 本質的な部分は理解していないことが多いと思います。
nachan_naito

2021/01/27 07:14

file_pathはglobで取得してきた、フルパスがプリントされます。
quickquip

2021/01/27 07:27

> リネームせずに読み込ませたいという思いです。 解決したい問題=プログラムに求める仕様はこれですね。 プログラムの利用者から見て、 指定フォルダに1つだけ.xlsxが入っている状態で動かしてください その.xlsxの名前はなんでも大丈夫です という仕様でプログラムを作りたいということですね。それならリーズナブルなものとして納得できます。
nachan_naito

2021/01/27 07:36

コメントありがとうございます。 その通りです。 もし可能ならば、どのようなコードが参考になるのかアドバイスをいただけると幸甚に存じます。
nachan_naito

2021/01/29 00:58

コメントありがとうございます。 下記にしてみたら、実行できました。 #読み込むエクセルの名前取得 file_path = glob.glob('C:\Users\ten09048\Desktop\test_ukeire\読み込み\*.xlsx') # EXCELを開いて読み込む wb1 = px.load_workbook(file_path[0]) wb2 = px.load_workbook('C:\Users\ten09048\Desktop\test_ukeire\受入検査指示書.xlsx') ws1 = wb1['Sheet1'] ws2 = wb2['Sheet1'] しかし、理解ができていないのでもしよかったら[0]が何を意味するのかご教授願います。
quickquip

2021/01/29 01:33

リスト型を知らないと言うことは「何も知らないままいじっている」ということですね。 Python公式ドキュメントのチュートリアル4ぐらいまでは最低読まないといけないかと。 リストはこのあたりです https://docs.python.org/ja/3/tutorial/introduction.html#lists
nachan_naito

2021/01/29 02:47

ありがとうございます。 読むようにします。
guest

0

ファイルフォーマットが間違っている。
まず、エクセルでそのファイルを開けるかどうかやってみてください。

というエラーメッセージですね。

エクセルで開けましたか?

投稿2021/01/27 05:20

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nachan_naito

2021/01/27 05:23

コメントありがとうございます。 ファイル自体は開くことができますので、上記のコードでwb1 = px.load_workbook('file_path')のパス指定がフルパスでないことで、load.workbookが動いていないのではないかと推測しました。
ppaul

2021/01/27 05:49

もしそれで動かなければFileNotFoundErrorが出ます。 InvalidFileExceptionが出ているということは、openに成功して中身を読んだら変だと言っています。 念のため確認ですが、もともと受入検査指示書.csvとか受入検査指示書.xlsというファイルだったものを、名前だけ受入検査指示書.xlsxに変えたりはしていないですね。
nachan_naito

2021/01/27 05:55

コメントありがとうございます。用語を認識していない部分があるかもしれません。 読み込み先のファイルはもともとxls.ファイルのものを変換して保存しています。 書き出しファイルはもともとxslx.でした。 wb1 = px.load_workbook('file_path')←このパス指定では、引数?を使って代入しても問題ないという解釈ですか?
ppaul

2021/01/27 06:05

変換というのが、エクセルで受入検査指示書.xlsを開き、名前を付けて保存で、Excelブック(*.xlsx)を指定して保存したのならそれで問題はありません。 もしも、エクスプローラーで拡張子のxlsをxlsxに変更しただけなら、InvalidFileExceptionが起こります。 どちらの操作をしたのでしょうか。
nachan_naito

2021/01/27 06:43

コメントありがとうございます。 前者のエクセルで開き、指定して保存しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問