web-dev-qa-db-ja.com

Pythonを使用したExcel(xls)ファイルの読み取り/解析

PythonでExcel(XLS)ファイルを読み取る最良の方法は何ですか( CSV ファイルではありません)。

このタスクを実行するためにPythonでデフォルトでサポートされている組み込みパッケージはありますか?

105
qrbaQ

.xlsファイルの読み取りには xlrd を強くお勧めします。

voyagerはCOMオートメーションの使用に言及しました。数年前に自分でこれを行ったので、これを行うのは本当のPITAであることに注意してください。警告の数は膨大であり、ドキュメントは不足していて迷惑です。私は多くの奇妙なバグや落とし穴に遭遇しましたが、そのうちのいくつかは把握するのに何時間もかかりました。

更新:新しい.xlsxファイルの場合、読み取りと書き込みに推奨されるライブラリは openpyxl (ありがとう、IkarPohorský)です。

88
taleinat

パンダの使用:

import pandas as pd

xls = pd.ExcelFile("yourfilename.xls")

sheetX = xls.parse(2) #2 is the sheet number

var1 = sheetX['ColumnName']

print(var1[1]) #1 is the row number...
39
GPB83

いずれかを選択できます http://www.python-Excel.org/
_python xlrdライブラリをお勧めします。

を使用してインストールする

pip install xlrd

を使用してインポート

import xlrd

ワークブックを開く

workbook = xlrd.open_workbook('your_file_name.xlsx')

名前でシートを開く

worksheet = workbook.sheet_by_name('Name of the Sheet')

インデックスでシートを開く

worksheet = workbook.sheet_by_index(0)

セル値を読み取る

worksheet.cell(0, 0).value    
22
somil

Pandasが最善の方法だと思います。すでに1つの答えがあります here with Pandas with ExcelFile関数を使用していますが、私には適切に機能しませんでした。 here から、うまく機能するread_Excel関数が見つかりました。

import pandas as pd
dfs = pd.read_Excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))

PSread_Excel関数が機能するには、xlrdがインストールされている必要があります

5
Foad

任意のライブラリを使用できます ここにリストされています (JExcelApiに基づく Pyxlreader 、または xlwt など)、さらに COMオートメーションExcel自体を使用する ファイルの読み取りに使用しますが、そのためにOfficeをソフトウェアの依存関係として導入していますが、これは常にオプションとは限りません。

1
Esteban Küber

Xlsxの場合、以前に https://stackoverflow.com/questions/4371163/reading-xlsx-files-using-python として投稿されたソリューションが気に入っています。標準ライブラリのモジュールのみを使用しています。

def xlsx(fname):
    import zipfile
    from xml.etree.ElementTree import iterparse
    z = zipfile.ZipFile(fname)
    strings = [el.text for e, el in iterparse(z.open('xl/sharedStrings.xml')) if el.tag.endswith('}t')]
    rows = []
    row = {}
    value = ''
    for e, el in iterparse(z.open('xl/worksheets/sheet1.xml')):
        if el.tag.endswith('}v'):                                
            value = el.text
        if el.tag.endswith('}c'):                                 
            if el.attrib.get('t') == 's':
                value = strings[int(value)]
            letter = el.attrib['r']                             
            while letter[-1].isdigit():
                letter = letter[:-1]
            row[letter] = value
            value = ''
        if el.tag.endswith('}row'):
            rows.append(row)
            row = {}
    return rows

追加された改善点は、シート名でコンテンツを取得し、reを使用して列を取得し、共有文字列が使用されているかどうかを確認することです。

def xlsx(fname,sheet):
    import zipfile
    from xml.etree.ElementTree import iterparse
    import re
    z = zipfile.ZipFile(fname)
    if 'xl/sharedStrings.xml' in z.namelist():
        # Get shared strings
        strings = [element.text for event, element
                   in iterparse(z.open('xl/sharedStrings.xml')) 
                   if element.tag.endswith('}t')]
    sheetdict = { element.attrib['name']:element.attrib['sheetId'] for event,element in iterparse(z.open('xl/workbook.xml'))
                                      if element.tag.endswith('}sheet') }
    rows = []
    row = {}
    value = ''

    if sheet in sheets:
    sheetfile = 'xl/worksheets/sheet'+sheets[sheet]+'.xml'
    #print(sheet,sheetfile)
    for event, element in iterparse(z.open(sheetfile)):
        # get value or index to shared strings
        if element.tag.endswith('}v') or element.tag.endswith('}t'):
            value = element.text
        # If value is a shared string, use value as an index
        if element.tag.endswith('}c'):
            if element.attrib.get('t') == 's':
                value = strings[int(value)]
            # split the row/col information so that the row leter(s) can be separate
            letter = re.sub('\d','',element.attrib['r'])
            row[letter] = value
            value = ''
        if element.tag.endswith('}row'):
            rows.append(row)
            row = {}

    return rows
1
Hans de Ridder

(非Python)プログラムxls2csvの実行を検討することもできます。 xlsファイルをフィードすると、csvが返されます。

1
moi

Python Exceleratorもこのタスクを処理します。 http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/

DebianおよびUbuntuでも利用可能です。

 Sudo apt-get install python-excelerator
0
Jamieson Becker

古いExcelファイルには、使用されるOLE構造化ストレージ形式を読み取ることができる OleFileIO_PLモジュール があります。

0
Gavin Smith