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

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

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

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

Q&A

解決済

2回答

22177閲覧

エラーの解決方法がわかりません。BadZipFile: File is not a zip file     Python

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2021/10/03 06:51

編集2021/10/03 08:00

下記内容で、エラーが出力されます。ZIPファイルを作成するまでの部分を出力してもエラーは出ていません。
「これだけだとエラーは出ません」
lists2 = [df1[0],df2[0]]
all_list2 = []
for i in lists2:
all_list2.append(list(i))

folder_list2 = list(range(1,3)) #rangeにて値を取得
so_dict2 = dict(zip(folder_list2,all_list2))
この部分だけ出力する時にはエラーはでないのですが、解決方法がわかりません。
お手数おかけしますが、ご教授お願いいたします。

Python

1import openpyxl 2import datetime 3import os 4 5#テスト用に1,2フォルダのみ抜粋 6lists2 = [df1[0],df2[0]] 7all_list2 = [] 8for i in lists2: 9 all_list2.append(list(i)) 10 11folder_list2 = list(range(1,3)) #rangeにて値を取得 12so_dict2 = dict(zip(folder_list2,all_list2)) 13 14hh = datetime.date.today().year#シート名取得のための記述 15sheet_name = (str(hh - 1992) + '期')#コピー先シート名取得 16wb1 = openpyxl.load_workbook('C:\Users\**\OneDrive\デスクトップ\テスト用\本番1.xlsm',data_only=True)#コピー元ブック読込 17ws1 = wb1['検針表 (2)']#コピー元シート読込 18 19for key, value in so_dict2.items():#コピー先ファイル取得 20 for v in value: 21 wb = openpyxl.load_workbook(f'C:\Users\**\OneDrive\デスクトップ\テスト用\個別表2\{key}\{v}.xlsx') 22 ws = wb[sheet_name]#コピー先シート取得 23 qq = ws1.cell(row = 1,column = 5).value 24 ws.cell(row = ws.max_row,column = 3, value = qq) 25 wb.save(f'C:\Users\abcab\OneDrive\デスクトップ\テスト用\個別表2\{key}\{v}.xlsx') 26 27「エラー」 28--------------------------------------------------------------------------- 29BadZipFile Traceback (most recent call last) 30<ipython-input-13-c2e42be596d5> in <module> 31 19 for key, value in so_dict2.items():#コピー先ファイル取得 32 20 for v in value: 33---> 21 wb = openpyxl.load_workbook(f'C:\Users\**\OneDrive\デスクトップ\テスト用\個別表2\{key}\{v}.xlsx') 34 22 ws = wb[sheet_name]#コピー先シート取得 35 23 qq = ws1.cell(row = 1,column = 5).value 36 37~\anaconda3\lib\site-packages\openpyxl\reader\excel.py in load_workbook(filename, read_only, keep_vba, data_only, keep_links) 38 313 39 314 """ 40--> 315 reader = ExcelReader(filename, read_only, keep_vba, 41 316 data_only, keep_links) 42 317 reader.read() 43 44~\anaconda3\lib\site-packages\openpyxl\reader\excel.py in __init__(self, fn, read_only, keep_vba, data_only, keep_links) 45 122 def __init__(self, fn, read_only=False, keep_vba=KEEP_VBA, 46 123 data_only=False, keep_links=True): 47--> 124 self.archive = _validate_archive(fn) 48 125 self.valid_files = self.archive.namelist() 49 126 self.read_only = read_only 50 51~\anaconda3\lib\site-packages\openpyxl\reader\excel.py in _validate_archive(filename) 52 94 raise InvalidFileException(msg) 53 95 54---> 96 archive = ZipFile(filename, 'r') 55 97 return archive 56 98 57 58~\anaconda3\lib\zipfile.py in __init__(self, file, mode, compression, allowZip64, compresslevel, strict_timestamps) 59 1267 try: 60 1268 if mode == 'r': 61-> 1269 self._RealGetContents() 62 1270 elif mode in ('w', 'x'): 63 1271 # set the modified flag so central directory gets written 64 65~\anaconda3\lib\zipfile.py in _RealGetContents(self) 66 1334 raise BadZipFile("File is not a zip file") 67 1335 if not endrec: 68-> 1336 raise BadZipFile("File is not a zip file") 69 1337 if self.debug > 1: 70 1338 print(endrec) 71 72BadZipFile: File is not a zip file

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

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

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

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

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

guest

回答2

0

ベストアンサー

エラーメッセージに書かれているとおり、開こうとしている.xlsxファイルがzip形式のファイルでないためです。

Excelファイル操作をプログラミングする前に、まずはxlsxをzipに変えて内部構造を見てみように書かれているように、.xlsxファイルは複数のxmlファイルをzip圧縮したものです。

このようなエラーが起こる原因は、ファイルの拡張子とファイルの形式の違いを理解していない人が、.csvファイルとか.xlsファイルの拡張子をxlsxに書き換えていることが多いです。

python

1for key, value in so_dict2.items():#コピー先ファイル取得 2 for v in value: 3 wb = openpyxl.load_workbook(f'C:\Users\**\OneDrive\デスクトップ\テスト用\個別表2\{key}\{v}.xlsx') 4 ws = wb[sheet_name]#コピー先シート取得 5 qq = ws1.cell(row = 1,column = 5).value 6 ws.cell(row = ws.max_row,column = 3, value = qq) 7 wb.save(f'C:\Users\abcab\OneDrive\デスクトップ\テスト用\個別表2\{key}\{v}.xlsx') 8

python

1for key, value in so_dict2.items():#コピー先ファイル取得 2 for v in value: 3 print(f'C:\Users\**\OneDrive\デスクトップ\テスト用\個別表2\{key}\{v}.xlsx') 4 wb = openpyxl.load_workbook(f'C:\Users\**\OneDrive\デスクトップ\テスト用\個別表2\{key}\{v}.xlsx') 5 ws = wb[sheet_name]#コピー先シート取得 6 qq = ws1.cell(row = 1,column = 5).value 7 ws.cell(row = ws.max_row,column = 3, value = qq) 8 wb.save(f'C:\Users\abcab\OneDrive\デスクトップ\テスト用\個別表2\{key}\{v}.xlsx') 9

に書き換えて実行し、エラーが出る直前に表示された名前のファイルをExcelで開いてみてください。
間違っている場合はExcelが教えてくれます。

投稿2021/10/03 08:45

ppaul

総合スコア24666

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

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

退会済みユーザー

退会済みユーザー

2021/10/04 01:55

ppaul様 ご返信ありがとうございます。 頂いた内容も読んで勉強させていただきます。
guest

0

質問にある処理「ZIPファイルを作成するまでの部分」はzipファイルを作っているところではありません。

python

1so_dict2 = dict(zip(folder_list2,all_list2))

このzip関数は、二つのリストから1つずつ内容を取り出してペアを作るもので、zipファイルとは関係ありません。

では、エラーにあるzipエラー「BadZipFile: File is not a zip file」がどうして出るかというと、実はxlsxファイルというのは複数のファイルをまとめてzipファイルにしたものなので、たぶん、その内容がおかしいのでしょう。

対象となるxlsxファイルはエクセルで問題なく開けますか?

投稿2021/10/03 08:42

TakaiY

総合スコア12745

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

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

退会済みユーザー

退会済みユーザー

2021/10/04 01:56

TakaiY様 ご返信ありがとうございます。 ファイルを新しくしたらエラーが出ませんでした。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問