web-dev-qa-db-ja.com

最初の空の行にxlrdがあるスプレッドシートの読み取りを停止するにはどうすればよいですか?

私はxlrdを使用してディレクトリ構造を調べ、スプレッドシートを引き出し、2行目(行1)を下に読んで「何かをする」のです。問題は、最初の空の行で読み取り/印刷を停止する方法がわからないことです。行が「空の」オブジェクトではないことは理解していますが、すべてのセルが空であるかどうかを確認する方法を示すために少し助けていただければ幸いです。これが私が作業しているコードです:

import xlrd
import os

def Excel_file_filter(filename, extensions=['.xls', '.xlsx']):
    return any(filename.endswith(e) for e in extensions)

def get_filenames(root):
    filename_list = []
    for path, subdirs, files in os.walk(root):
        for filename in filter(Excel_file_filter, files):
            filename_list.append(os.path.join(path, filename))
    return filename_list

spreadsheets = get_filenames('C:\\Temp')
for s in spreadsheets:
    with xlrd.open_workbook(s) as wb:
        cs = wb.sheet_by_index(0)
        num_cols = cs.ncols
        for row_index in range(1, cs.nrows):
            print('Row: {}'.format(row_index))
            for col_index in range(0, num_cols):
                cell_object = cs.cell(row_index, col_index)
                if cell_obj is not xlrd.empty_cell:
                    print('Col #: {} | Value: {}'.format(col_index, cell_obj))

最終的に発生するのは、最初の例である25行にコンテンツが含まれている場合に、ほぼ1000行まで印刷されることです。スプレッドシート間のコンテンツの量はさまざまであるため、空の行を検出して分割する方法を理解するのに役立つ一般的なソリューション(他のオプションのライブラリに依存しない)をいただければ幸いです。

5
auslander

最初:セルの値を取得し、それが空かどうかを確認するには、質問の回答で説明されている方法の1つを使用します 検出方法xlrdライブラリを使用してExcelファイルを読み取るときにセルが空の場合?

  1. cell_val= cs.cell(row_index, col_index).valueを使用して値を取得する場合:
    • 空かどうかを確認するには:_if cell_vel == ''_と書くだけです。
  2. cell_object = cs.cell(row_index, col_index)を使用して値を取得する場合:
    • 空かどうかを確認するには:
      -最初にcell_typecell_type = cs.cell_type(row_index, col_index)を取得します
      -次に_if cell_type == xlrd.XL_CELL_EMPTY_を確認します

2番目:行全体が空かどうかを確認するには、次のようにします。

  1. カウンター(count_empty = 0)を定義して、行とブール値(empty_cell = False)の空のセルの数をカウントします。
  2. セルが空かどうかを確認します
    >の場合、カウンターをインクリメントし、empty_cellをTrueに変更します
    そうでない場合> empty_cell Falseを設定します
  3. Empty_cellがFalseかどうかを確認>セルの値を出力
  4. 行の列をループした後
    count_emptyが列の数と等しい場合>は行全体が空であることを意味します>行を中断してループを停止します

コード:

_# define empty_cell boolean
empty_cell= False
with xlrd.open_workbook(s) as wb:
    cs= wb.sheet_by_index(0)
    num_cols= cs.ncols
    num_rows= cs.nrows
    for row_index in range(1, num_rows):
        # set count empty cells
        count_empty = 0
        print('Row: {}'.format(row_index))
        for col_index in range(0,num_cols):
            # get cell value
            cell_val= cs.cell(row_index, col_index).value
            # check if cell is empty
            if cell_val== '': 
                # set empty cell is True
                empty_cell = True
                # increment counter
                count_empty+= 1
            else:
                # set empty cell is false
                empty_cell= False

            # check if cell is not empty
            if not empty_cell:
                # print value of cell
                print('Col #: {} | Value: {}'.format(col_index, cell_val))

        # check the counter if is = num_cols means the whole row is empty       
        if count_empty == num_cols:
            print ('Row is empty')
            # stop looping to next rows
            break     
_

注:セルの値を取得するために最初のメソッドcell_val= cs.cell(row_index, col_index).valueを使用しました。他の方法を使用する場合は、以下を変更します。

_    cell_val= cs.cell(row_index, col_index) # remove .value
    cell_type= cs.cell_type(row_index, col_index) # add this line
    # check if cell is empty
    if cell_type == xlrd.XL_CELL_EMPTY: # change if cell_val== '':
_

セルが空かどうかを確認する方法を理解するのに役立つ他のリンク:
xlrd.XL_CELL_EMPTY および XLRDを使用したセル値の検証

9
user7609283

単一のセルが空であるかどうかを確認するには、その ctype 属性を調べます。行全体をチェックするには、 リスト内包all 関数を使用します。

workbook = xlrd.open_workbook(filepath)
sheet = workbook.sheets()[0]
rows = sheet.get_rows()
next(rows) # skip first row
for row in rows:
    if all([cell.ctype in (xlrd.XL_CELL_EMPTY, xlrd.XL_CELL_BLANK)
            for cell in row]):
        break
    # process this non-empty row here...