@frswataru (本石 渉)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

python Excelシートデータが空っぽであれば処理をスキップ

Q&A

Closed

解決したいこと

pythonでExcelファイルの結合を実装しています。
結合したいExcelブックにはSheet1とSheet2というファイルがあります。
いずれかのSheetの中身が空であればエラーが立ちます。

if df.empty:などを使ってからであればスキップ処理をスキップしたいのですが、、、

解決方法を教えて下さい。
image.png

発生している問題・エラー

ValueError: Length mismatch: Expected axis has 0 elements, new values have 43 elements

該当するソースコード

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import pandas as pd
from glob import glob
import openpyxl
# ~$ファイルは削除すること https://qiita.com/ponsuke0531/items/906f029e74f829a9618a


# In[2]:


filepaths= glob('*期/**.xlsx')
new_filepaths = []
for filepath in filepaths:
    if not '~$' in filepath:
        new_filepaths.append(filepath)


# In[3]:


def extract(filepath):
    df = pd.read_excel(filepath, sheet_name= 'Sheet1')
    df2 = pd.read_excel(filepath, sheet_name= 'Sheet2')

    df.columns=['構成品 No.', 
                    '記述',
                    'オーダー 数量',
                    '出庫 数量',
                    '単位',
                    'オーダー数量 (2次単位)',
                    '出庫数量 (2次単位)',
                    '2次 単位',
                    '行 タイプ',
                    '有効 原料',
                    '顧客',
                    '要求 日付',
                    '構成 事業所',
                    '保管場所',
                    'ロット/ シリアル番号',
                    '出庫/ 入荷',
                    '仕入先',
                    '作業 順序番号',
                    'ロット 等級',
                    'ロット 濃度',
                    'メモ・ロット1',
                    'メモ・ロット2',
                    '下限 濃度',
                    '上限 濃度',
                    '部品表 タイプ',
                    '下限 等級',
                    '上限 等級',
                    '作業 仕損',
                    '出庫 コード',
                    '資材 状況',
                    '構成品 改訂',
                    '固定/変動',
                    '構成品 番号',
                    '構成品 第2品目番号',
                    '構成品 第3品目番号',
                    '単位原価',
                    '単位原価の一時変更',
                    '合計 原価',
                    'キー 会社',
                    '関連購買/受注 オーダー番号',
                    '関連オーダー・ タイプ',
                    '関連購買/受注 オーダー行番号',
                    'オーダー 番号'
                    ]
    df2.columns=['構成品 No.', 
                    '記述',
                    'オーダー 数量',
                    '出庫 数量',
                    '単位',
                    'オーダー数量 (2次単位)',
                    '出庫数量 (2次単位)',
                    '2次 単位',
                    '行 タイプ',
                    '有効 原料',
                    '顧客',
                    '要求 日付',
                    '構成 事業所',
                    '保管場所',
                    'ロット/ シリアル番号',
                    '出庫/ 入荷',
                    '仕入先',
                    '作業 順序番号',
                    'ロット 等級',
                    'ロット 濃度',
                    'メモ・ロット1',
                    'メモ・ロット2',
                    '下限 濃度',
                    '上限 濃度',
                    '部品表 タイプ',
                    '下限 等級',
                    '上限 等級',
                    '作業 仕損',
                    '出庫 コード',
                    '資材 状況',
                    '構成品 改訂',
                    '固定/変動',
                    '構成品 番号',
                    '構成品 第2品目番号',
                    '構成品 第3品目番号',
                    '単位原価',
                    '単位原価の一時変更',
                    '合計 原価',
                    'キー 会社',
                    '関連購買/受注 オーダー番号',
                    '関連オーダー・ タイプ',
                    '関連購買/受注 オーダー行番号',
                    'オーダー 番号'
                    ]
    df=pd.concat([df, df2])
    return df



# In[ ]:


df = extract(filepath)


# In[4]:


df = pd.DataFrame()

for filepath in new_filepaths:
    _df = extract(filepath)
    df = pd.concat([df, _df])


# In[6]:


df.to_excel('output/all_data_2.xlsx',index=False)



0 likes

1Answer

空のセルを全て確認する方法を使って、空のシートか確認できるのではないでしょうか。

Sheet1のケース
import openpyxl

wb = openpyxl.load_workbook('hoge.xlsx')
ws = wb['Sheet1']
null_count = 0
cell_count = 0
for row in ws:
    for cell in row:
        if cell.value == None:
            null_count += 1
        cell_count += 1
if null_count == cell_count:
    print('空です。')

こんな感じで確認できます。今、シートが二つあるので、

sheet1とsheet2が共に空のシートかを確認する関数
def judge_null_file_xlsx(file_name):
    wb = openpyxl.load_workbook(file_name)
    wss = [wb['Sheet1'], wb['Sheet2']]
    null_count = 0
    cell_count = 0
    for ws in wss:
        for row in ws:
            for cell in row:
                if cell.value == None:
                    null_count += 1
                cell_count += 1
    if null_count == cell_count:
        return True
    else:
        return False

今データシートが'Sheet1'、'Sheet2'なので、judge_null_file_xlsx()にエクセルファイルを入れてTrueなら空のシート、Falseならデータがあるシートという関数を作っておきました。良かったらしっかり動くか確認の上使ってみてください。

参考資料:https://kirinote.com/python-none-color/

1Like

Comments

  1. @frswataru

    Questioner

    ありがとうございます。
    参考にさせて頂きます。

Your answer might help someone💌