web-dev-qa-db-ja.com

Excel列のデータをPythonリストに読み込みます

Excel 2013でpython xlwingsを使用してデータの列を読み取っています。列Aには数値が入力されています。この列をpythonリストpy_listにインポートするには、次のコードを使用します。

import xlwings as xw

wb = xw.Book('BookName.xlsm')
sht = xw.Book('SheetName')
py_list = sht.range('A2:A40').value

上記のコードは、列データがA2:A40に入力されている場合に機能します。ただし、列データは増え続ける可能性があります。データはA2:A46またはA2:A80に拡大および拡張できます。最後の行は空です。コンパイル時には、この列に何行のデータがあるかはわかりません。

py_listがデータの範囲を読み取れるように、最後の行で空のセルを検出するようにコードを変更するにはどうすればよいですか?

私は他のpythonライブラリを使用して、xlwings以外のExcelデータを読み取ることができます。 python v3.6を使用しています

8
user3848207

これはcsvまたはExcelからのファイルの読み取りについて多くのことを言いますが、 pandas を使用します。

import pandas as pd

df = pd.read_Excel('filename.xlsm', sheetname=0) # can also index sheet by name or fetch all sheets
mylist = df['column name'].tolist()

別の方法としては、'A2:A40'の代わりにExcelのOFFSETなどの何かを使用して動的な数式を使用するか、名前付き範囲を使用しますか?

13
Stael

これは古い質問ですが、 openpyxl を使用することもできます

from openpyxl import load_workbook
wb = load_workbook("BookName.xlsx")  # Work Book
ws = wb.get_sheet_by_name('SheetName')  # Work Sheet
column = ws['A']  # Column
column_list = [column[x].value for x in range(len(column))]

ノート:

  • Pandas は素晴らしいライブラリですが、Excelの列をリストに読み込むためだけにインストールするのは、やりすぎです。

  • xlrd は維持されなくなりました。 xlrd github page から

    注意:このライブラリには現在アクティブなメンテナがいません。代わりにOpenPyXLを使用することをお勧めします。

3
Bitto Bennichan

多くの試行錯誤の末、私は自分の質問に答えます。

この質問の鍵は、列Aの行数を見つけることです。

行数は、以下のxlwingsを使用してこの1行で見つけることができます。

rownum = sht.range('A1').end('down').last_cell.row

答えを得るには、APIドキュメントを注意深く読む必要があります。

http://docs.xlwings.org/en/stable/api.html#xlwings.Range

行の数がわかると、残りの行を見つけるのは簡単です。

2
user3848207

私は何かを探すためにxlwingsのドキュメントを調べましたが、このようなものは見つかりませんでしたが、いつでもこれを試してみてください:

temp = [x for x in xw.Range('A2:A200').value if x != None] #A200 just put a big number..

または私はこれを試すことを知りません:

from itertools import takewhile
temp =[takewhile(lambda x: x != None, xw.Range('A2:A70').value)]
while True:
    try:
         next(temp)
    except StopIteration:
         break

2行目では、最初に次のようなことを試みました。

temp =[lambda x: x for x in xw.Range('D:D').values if x != None else exit()] #or to replace this with quit() but there is no option to break lambdas as far as I know

別のオプション:

temp = iter(xw.Range('A:A').value)
list = []
a = next(temp)               #depending your first cell starts at row 1
while a != None:             #might want zeros or '' etc
    list.append(a)
    a = next(temp)
1
eladgl

これは、Excelの列全体からリストを作成する最も簡単な方法であることがわかりました。 import pandas as pd import numpy as np

#Insert complete path to the Excel file and index of the worksheet
df = pd.read_Excel("PATH.xlsx", sheet_name=0)
# insert the name of the column as a string in brackets
list1 = list(df['Column Header 1']) 
list2 = list(df['Column Header 2'])

print(list1)
print(list2)
1