

過去にも類似の投稿があり、同じところでエラーが出ていたので、回答を参考にして "file_path_dic"
に変更したところ、そこは通過しましたがすぐ下で下記のような別なエラーが出てしまいました。

このエラーに対処出来ずに困ってます。ご教授いただければ幸いです。

[Pythonのコードで定義したつもりが、not definedと表示される](https://ja.stackoverflow.com/q/77901)

**エラーメッセージ:**

[code]

    ----------------------------------------------------------------
    EDINETへのアクセスを開始
    0日目：2021-02-22を開始
    50日目：2021-04-13を開始
    100日目：2021-06-02を開始
    150日目：2021-07-22を開始
    200日目：2021-09-10を開始
    250日目：2021-10-30を開始
    300日目：2021-12-19を開始
    350日目：2022-02-07を開始
    四半期報告書ファイルのDLを開始
    0ファイル目を開始
    有価証券報告書ファイルのDLを開始
    0ファイル目を開始
    四半期報告書データの変換を開始
    0ファイル目を開始
    ---------------------------------------------------------------------------
    BadZipFile                                Traceback (most recent call last)
    ~\AppData\Local\Temp/ipykernel_7852/759562761.py in <module>
        142 
        143 #XBRLからデータ形式を変換
    --> 144 all_df_dic = zip_to_df(file_path_dic)
        145 
        146 #営業利益部分抽出
    
    ~\AppData\Local\Temp/ipykernel_7852/759562761.py in zip_to_df(file_path_dic)
        116             if company_name not in df_dic:# 会社が辞書中に存在しない場合
        117                 df_dic[company_name] = {}
    --> 118                 df_dic[company_name] = read_xbrl_from_zip(company_zip)[0]
        119             elif company_name in df_dic:# 会社が辞書中に存在する場合
        120                 df_dic[company_name] = pd.concat( [df_dic[company_name],read_xbrl_from_zip(company_zip)[0]])
    
    ~\OneDrive\デスクトップ\EDINET\Zip\Kiseno\xbrl_reader_for_edinet_20180702-00\xbrl_proc.py in read_xbrl_from_zip(xbrl)
         25 戻り値 pandas.DataFrame のリスト"""
         26     # zipからファイルデータ取得
    ---> 27     file_datas = xbrl_zip_get_xbrl_files(
         28         xbrl,
         29         RE_XBRL_FILE_MATCH,
    
    ~\OneDrive\デスクトップ\EDINET\Zip\Kiseno\xbrl_reader_for_edinet_20180702-00\xbrl_zip.py in get_xbrl_files(file, re_xbrl_file_match)
         15 
         16     # zipオブジェクト作成
    ---> 17     with ZipFile(file, 'r') as zip_obj:
         18         # ファイルリスト取得
         19         infos = zip_obj.infolist()
    
    ~\anaconda3\lib\zipfile.py in __init__(self, file, mode, compression, allowZip64, compresslevel, strict_timestamps)
       1255         try:
       1256             if mode == 'r':
    -> 1257                 self._RealGetContents()
       1258             elif mode in ('w', 'x'):
       1259                 # set the modified flag so central directory gets written
    
    ~\anaconda3\lib\zipfile.py in _RealGetContents(self)
       1322             raise BadZipFile("File is not a zip file")
       1323         if not endrec:
    -> 1324             raise BadZipFile("File is not a zip file")
       1325         if self.debug > 1:
       1326             print(endrec)
    
    BadZipFile: File is not a zip file
    ---------------------------------------------------------
    
[/code]

ソースコードを改めて記載します。下記ソースコードにはページの作者による自作のPython ライブラリをダウンロードして使うことになっています。

  * [EDINET XBRLを読み込むPythonライブラリ](https://srbrnote.work/archives/1430)
  * [xbrl_reader_for_edinet_20180702-00.zip](https://srbrnote.work/wp-content/uploads/2018/07/xbrl_reader_for_edinet_20180702-00.zip)

**実行環境:**

Windows 11  
Pyhton 3.9.7  
Jupyter Notebook

* * *

**ソースコード:**

[code]

    from datetime import date,timedelta
    import requests
    import json
    from zipfile import ZipFile
    import os
    import sys
    import pandas as pd
    import glob
    #XBRLをpython形式に変換するライブラリのフォルダパス
    sys.path.append(r"C:\Users\Osamu\OneDrive\デスクトップ\EDINET\Zip\Kiseno\xbrl_reader_for_edinet_20180702-00")
    from xbrl_proc import read_xbrl_from_zip
    import urllib3
    from urllib3.exceptions import InsecureRequestWarning
    urllib3.disable_warnings(InsecureRequestWarning)
    
    def get_list(start,end,company_list):
        '''指定した期間、報告書種類、会社で報告書を取得し、取得したファイルのパスの辞書を返す'''
        #取得期間の日付リストを作成
        day_term = [start + timedelta(days=i) for i in range((end - start).days)]
        
        #データ抜出時に使用する、有価証券報告書および四半期報告書のコードの設定
        ordinance_code = "010"
        form_code_quart ="043000" # 四半期報告書
        form_code_securities ="030000" #有価証券報告書
        
        #EDINETのAPIで、書類一覧を取得し、各日ごとに必要な書類の項目を抜き出し
        quart_list =[] # 四半期報告書のリスト
        securities_list =[] # 四半期報告書のリスト
    
        print('EDINETへのアクセスを開始')
        for i,day in enumerate(day_term):
            url = "https://disclosure.edinet-fsa.go.jp/api/v1/documents.json"
            params = {"date": day, "type": 2}
            
            #進捗表示
            if i % 50 == 0:
                print(f'{i}日目：{day}を開始')
            
            #EDINETから1日の書類一覧を取得
            res = requests.get(url, params=params, verify=False)
            
            #必要な書類の項目を抜き出し
            if res.ok:
                json_data = res.json()
                
                for data in json_data['results']:
                    #指定した会社の指定した書類を抜き出し
                    if data['ordinanceCode'] == ordinance_code and data['formCode'] == form_code_quart and data['filerName'].replace('株式会社', '') in company_list:
                        quart_list.append(data)
                    elif data['ordinanceCode'] == ordinance_code and data['formCode'] == form_code_securities and data['filerName'].replace('株式会社', '') in company_list:
                        securities_list.append(data)
                        
            else:
                print(f'アクセス失敗かも{day}')
        
        list_dic = {'四半期報告書':quart_list,'有価証券報告書':securities_list} 
        
        return list_dic
    
    def get_zip(list_dic,quart_dir_path,securities_dir_path):
        '''取得したいデータをzipファイルで取得してファイルパスのリストを返す'''
        
        dir_path_dic = {'四半期報告書':quart_dir_path,'有価証券報告書':securities_dir_path}
        file_path_dic = {'四半期報告書':[],'有価証券報告書':[]} # ダウンロードした有価証券報告書のパスを格納する辞書   
    
        for key in list_dic.keys():
            
            #すでにzipをDLしている場合のため、既存のdocIDリストを取得
            files = os.listdir(dir_path_dic[key])
            existing_docID_list = [file.split('.')[0].split('_')[1] for file in files if os.path.isfile(os.path.join(dir_path_dic[key], file))]
            
            print(f'{key}ファイルのDLを開始')
            for i, doc in enumerate(list_dic[key]):
                #zipファイルパスのリストの作成
                file_name = doc['filerName'].replace('株式会社', '') + '_' + doc['docID']
                file_path =  os.path.join(dir_path_dic[key], file_name + ".zip")
                file_path_dic[key].append(file_path)
                
                #所有していないファイルの場合はDLを行う
                if doc['docID'] not in existing_docID_list:
                    #ファイルを取得
                    url_zip = "https://disclosure.edinet-fsa.go.jp/api/v1/documents/" + doc['docID']
                    params_zip = {"type": 1}
    
                    #進捗表示
                    if i % 100 == 0:
                        print(f'{i}ファイル目を開始')
    
                    #データのDL
                    res_zip = requests.get(url_zip, params=params_zip, verify=False, stream=True)
    
                    #zipとして保存
                    if res_zip.status_code == 200:
                        with open(file_path, 'wb') as f:
                            for chunk in res_zip.iter_content(chunk_size=1024):
                                if chunk:
                                    f.write(chunk)
                                    f.flush()
    
        return file_path_dic
    
    def zip_to_df(file_path_dic):
        '''ダウンロードしたzipをdfに変換して各会社のdicにして返す'''
        
        all_df_dic = {}
        for key in file_path_dic.keys():
            print(f'{key}データの変換を開始')        
            df_dic = {}
            for i,company_zip in enumerate(file_path_dic[key]):
                # 進捗表示
                if i % 100 == 0:
                    print(f'{i}ファイル目を開始')
                company_name = os.path.splitext(os.path.basename(company_zip))[0].split('_')[0]
                doc_name = os.path.splitext(os.path.basename(company_zip))[0].split('_')[1]
    
                if company_name not in df_dic:# 会社が辞書中に存在しない場合
                    df_dic[company_name] = {}
                    df_dic[company_name] = read_xbrl_from_zip(company_zip)[0]
                elif company_name in df_dic:# 会社が辞書中に存在する場合
                    df_dic[company_name] = pd.concat( [df_dic[company_name],read_xbrl_from_zip(company_zip)[0]])
            
            all_df_dic[key] = df_dic
    
        return all_df_dic
    
    #会社のリストを読み込み
    company_list = ['ホウスイ','カネコ種苗']
    
    #取得期間の設定：直近n日分
    delta_day = 400
    end = date.today()
    start = date.today() - timedelta(days=delta_day)
    
    #ダウンロードしたデータのフォルダパス
    quart_dir_path = r"C:\Users\Osamu\OneDrive\デスクトップ\EDINET\Zip\Kiseno\quart"
    securities_dir_path = r"C:\Users\Osamu\OneDrive\デスクトップ\EDINET\Zip\Kiseno\securities"
    
    
    #XBRLデータの取得 
    list_dic = get_list(start,end,company_list)
    file_path_dic = get_zip(list_dic,quart_dir_path,securities_dir_path)
    
    #XBRLからデータ形式を変換
    all_df_dic = zip_to_df(file_path_dic)
    
    #営業利益部分抽出
    quart = all_df_dic['四半期報告書']['カネコ種苗']
    quart_oi = quart[(quart['tag'] == 'OperatingIncome') & (quart['context'] == 'CurrentYTDDuration')]
    quart_oi = quart_oi[['第N期','終了日','値']].sort_values('終了日')
    quart_oi = quart_oi.rename({'終了日':'Date','値':'OperatingIncome'},axis=1).reset_index(drop=True)
    quart_oi['type'] = '四半期報告書'
    
    securities = all_df_dic['有価証券報告書']['カネコ種苗']
    securities_oi = securities[(securities['tag'] == 'OperatingIncome') & (securities['context'] == 'CurrentYearDuration')]
    securities_oi = securities_oi[['第N期','終了日','値']].sort_values('終了日')
    securities_oi = securities_oi.rename({'終了日':'Date','値':'OperatingIncome'},axis=1).reset_index(drop=True)
    securities_oi['type'] = '有価証券報告書'
    
    oi_df = pd.concat([quart_oi,securities_oi]).sort_values('Date').reset_index(drop=True)
    
    #各四半期ごとの営業利益や、前年同期比の売上高営業利益率の変化を計算
    oi_df['tempOperatingIncome'] =  oi_df['OperatingIncome'] - oi_df['OperatingIncome'].shift(1)
    oi_df['CalcOperatingIncome'] = oi_df['OperatingIncome'].mask(oi_df['第N期'] == 0, oi_df['tempOperatingIncome'])
    oi_df['CalcOperatingIncome'] = oi_df['CalcOperatingIncome'].mask(oi_df['第N期'] == 3, oi_df['tempOperatingIncome'])
    oi_df['CalcOperatingIncome'] = oi_df['CalcOperatingIncome'].mask(oi_df['第N期'] == 2, oi_df['tempOperatingIncome'])
    oi_df['CalcOperatingIncome_YoYchangerate'] = oi_df['CalcOperatingIncome'] / oi_df['CalcOperatingIncome'].shift(4)
    
    #棒グラフで可視化
    oi_df.plot.bar(x='Date', y='CalcOperatingIncome', rot=45)
    
    oi_df.plot.bar(x='Date', y='CalcOperatingIncome_YoYchangerate', rot=45)
    
[/code]


CC BY-SA 4.0
2022-03-29T06:23:07.907
88084
2022-03-30T00:39:52.083
2022-03-30T00:39:52.083
3060
51310
question
python edinet
"BadZipFile: File is not a zip file" エラーが解消できない