私は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行まで印刷されることです。スプレッドシート間のコンテンツの量はさまざまであるため、空の行を検出して分割する方法を理解するのに役立つ一般的なソリューション(他のオプションのライブラリに依存しない)をいただければ幸いです。
最初:セルの値を取得し、それが空かどうかを確認するには、質問の回答で説明されている方法の1つを使用します 検出方法xlrdライブラリを使用してExcelファイルを読み取るときにセルが空の場合?
cell_val= cs.cell(row_index, col_index).value
を使用して値を取得する場合:if cell_vel == ''
_と書くだけです。cell_object = cs.cell(row_index, col_index)
を使用して値を取得する場合:cell_type = cs.cell_type(row_index, col_index)
を取得しますif cell_type == xlrd.XL_CELL_EMPTY
_を確認します2番目:行全体が空かどうかを確認するには、次のようにします。
コード:
_# 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を使用したセル値の検証
単一のセルが空であるかどうかを確認するには、その 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...