PythonによるExcel(xls)ファイルの読み取り/解析


117

Python(ではなく)でExcel(XLS)ファイルを読み取る最良の方法は何ですか CSVファイルで)。

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



18
@voyager:彼はそれらを書き込まずにファイルを読み取ることを望んでいます
John Machin

回答:


91

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

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

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


5
Excel 2007+ファイル(.xlsx)の場合、おそらくOpenPyXLを使用します
IkarPohorský15年

48

パンダを使用する:

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...

1
パンダはxlrdを使用して読み取りを行っています。依存関係としてxlrdもインストールする必要があります
congusbongus

25

それらのいずれかを選択できます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    

「セル値の読み取り」は機能しません... TypeErrorが発生します: 'Sheet'オブジェクトは呼び出し可能ではありません。残りはすべてうまくいきました。
Newbielp

13

パンダが一番いい方法だと思います。Pandas 関数を使用してここにすでに1つの答えがありExcelFileますが、私には適切に機能しませんでした。ここから私はread_excelうまく機能する機能を見つけました:

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

PS機能を動作xlrdさせるには、インストールが必要ですread_excel

更新21-03-2020:ここに表示さているように、xlrdエンジンに問題があり、廃止される予定です。openpyxl最良の代替品です。したがって、ここで説明するように、正規構文は次のようになります。

dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")

AttributeError: 'dict' object has no attribute 'head'
lopezdp

4

xlsxについては、以前にhttps://web.archive.org/web/20180216070531//programming/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'):  # Example: <v>84</v>                            
            value = el.text
        if el.tag.endswith('}c'):  # Example: <c r="A3" t="s"><v>84</v></c>                                 
            if el.attrib.get('t') == 's':
                value = strings[int(value)]
            letter = el.attrib['r']  # Example: AZ22                         
            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

私の答えを復活させてくれてありがとう!
コリンアンダーソン

2

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


6
(1)pyxlreaderは絶対poxです。あなたはそれを試したことがないはずです。ここに私のコメントを参照してください:stackoverflow.com/questions/1243545/…(2)xlwtWriTesファイル。xlrdReaDファイルに使用します。
John Machin、

2

古いXLS形式が必要な場合。以下のansii 'cp1251'のコード。

import xlrd

file=u'C:/Landau/task/6200.xlsx'

try:
    book = xlrd.open_workbook(file,encoding_override="cp1251")  
except:
    book = xlrd.open_workbook(file)
print("The number of worksheets is {0}".format(book.nsheets))
print("Worksheet name(s): {0}".format(book.sheet_names()))
sh = book.sheet_by_index(0)
print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols))
print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3)))
for rx in range(sh.nrows):
   print(sh.row(rx))


0

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


3
しかし、ポスターには彼がPythonに読み込む必要があると書かれています...を実行しxls2csvcsvからPythonから解析することを提案していますか?
hcarver '25 / 11/12

Python-exceleratorには、Pythonコンバーターの実行可能なpy_xls2csvラッパーが含まれています。
fatal_error 2015


0
    with open(csv_filename) as file:
        data = file.read()

    with open(xl_file_name, 'w') as file:
        file.write(data)

組み込みのパッケージを使用して、上記のようにCSVをExcelに変換できます。CSVはdictreaderとdictwriterの組み込みパッケージで処理でき、Python辞書と同じように機能します。これにより、非常に簡単になりました。現在、組み込みのExcel用パッケージを認識していませんが、openpyxlに遭遇しました。また、これは非常に単純明快でシンプルでした

    import openpyxl
    book = openpyxl.load_workbook(filename)
    sheet = book.active 
    result =sheet['AP2']
    print(result.value)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.