PythonでExcelファイルを開くにはどうすればよいですか?


87

Pythonで読み取るためにExcelファイルであるファイルを開くにはどうすればよいですか?

たとえば、sometextfile.txtreadingコマンドを使用してテキストファイルを開きました。Excelファイルに対してそれを行うにはどうすればよいですか?


2
どのバージョンのExcelですか?Ecel 2007または2010で作成されたExcelファイルを開くことに制限できる場合は、ファイルの大部分またはすべてをXMLとして解析できるはずです。
アダムクロスランド2010

回答:


97

編集:
新しいバージョンのパンダでは、シート名をパラメーターとして渡すことができます。

file_name =  # path to file + file name
sheet =  # sheet name or sheet number or list of sheet numbers and names

import pandas as pd
df = pd.read_excel(io=file_name, sheet_name=sheet)
print(df.head(5))  # print first 5 rows of the dataframe

渡す方法の例については、ドキュメントを確認してくださいsheet_namehttps
//pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html

古いバージョン: パッケージ
も使用できます...。pandas

複数のシートを含むExcelファイルで作業している場合は、次を使用できます。

import pandas as pd
xl = pd.ExcelFile(path + filename)
xl.sheet_names

>>> [u'Sheet1', u'Sheet2', u'Sheet3']

df = xl.parse("Sheet1")
df.head()

df.head() Excelファイルの最初の5行を印刷します

1枚のシートでExcelファイルを操作している場合は、次のコマンドを使用できます。

import pandas as pd
df = pd.read_excel(path + filename)
print df.head()

2
この解決策は私の賛成を得ます。openpyxlを使用すると、「InvalidFileException:openpyxlは古い.xlsファイル形式をサポートしていません。xlrdを使用してこのファイルを読み取るか、最新の.xlsxファイル形式に変換してください」という問題が発生します。一方、パンダは.xlsファイルと.xlsxファイルの両方を処理します...また、テーブル全体を読み取るには、1行のコードしか必要ありません。
nathanielng 2016

3
xlrdExcelファイルの読み取りとExcelファイルのxlwt書き込みには、オプションの依存関係をインストールする必要があります。
Flimm 2017

32

xlrdライブラリを試してください。

[編集] -あなたのコメントからわかることから、以下のスニペットのようなものがうまくいくかもしれません。ここでは、「john」という単語を1つの列で検索していると想定していますが、さらに追加するか、これをより一般的な関数にすることができます。

from xlrd import open_workbook

book = open_workbook('simple.xls',on_demand=True)
for name in book.sheet_names():
    if name.endswith('2'):
        sheet = book.sheet_by_name(name)

        # Attempt to find a matching row (search the first column for 'john')
        rowIndex = -1
        for cell in sheet.col(0): # 
            if 'john' in cell.value:
                break

        # If we found the row, print it
        if row != -1:
            cells = sheet.row(row)
            for cell in cells:
                print cell.value

        book.unload_sheet(name) 

これが私がやりたいことかもしれないと思います:from xlrd import open_workbook book = open_workbook( 'simple.xls'、on_demand = True)for name in book.sheet_names():if name.endswith( '2'):sheet = book.sheet_by_name(name)print sheet.cell_value(0,0)book.unload_sheet(name)large_files.pyしかし、endwithを使用したくないのですが、特定の名前を含む行を見つけて印刷したいのですが...ボブではなくジョンのデータを含む巨大なエクセルシートの行を印刷したい。助けて?
novak 2010

これを別の質問として投稿し、コードをコードブロックに入れることをお勧めします。
ジョンケージ

これは、一連の関連する質問の2番目の質問です。3番目の質問では、実際のExcelファイルが1.5 GBであり、コンピューターのメモリが「十分ではない」と記述されていることが明らかになっています... stackoverflow.com/questions/3241039/を
John Machin 2010

16

これはプレーンテキストファイルを開くほど簡単ではなく、これを行うための組み込み機能がないため、何らかの外部モジュールが必要になります。ここにいくつかのオプションがあります:

http://www.python-excel.org/

可能であれば、ExcelスプレッドシートをCSVファイルとしてエクスポートしてから、組み込みのpythoncsvモジュールを使用して読み取ることを検討してください。

http://docs.python.org/library/csv.html


わかりました。CSVの内容がよくわかりません。PythonでExcelファイルをcsvモジュールとして開くにはどうすればよいですか。txtファイルに対して必要なことを実行するプログラムがあり、このExcelファイルに対しても同じことを実行したいのですが...これが最善の方法ですか?これについて詳しく教えていただけますか?
novak 2010

xlrdなどのサードパーティのPythonモジュールを使用するか、通常のExcelファイルの代わりにExcelファイルをCSVファイルで保存することができます。あなたが見逃している点は、Excelファイルがプレーンテキストファイルと類似していないということだと思います。Excelドキュメントをメモ帳で開くと、私が何を意味するかがわかります。Pythonで読みやすいCSV(カンマ区切り値)などのプレーンテキスト形式でファイルを保存するか、Excelファイルを解析できるサードパーティのモジュールをインストールして使用する必要があります。
ドナルドマイナー2010

私が抱えている問題は、ファイルが本当に大きいことです。ファイルを完全に開くことができない場合、ファイルをCSV形式で保存するにはどうすればよいですか?
novak 2010

@novak:あなたの問題は、ファイルが1.5GBで、コンピュータのメモリが「十分ではない」ことです...
John Machin 2010

6

openpxylパッケージがあります:

>>> from openpyxl import load_workbook
>>> wb2 = load_workbook('test.xlsx')
>>> print wb2.get_sheet_names()
['Sheet2', 'New Title', 'Sheet1']

>>> worksheet1 = wb2['Sheet1'] # one way to load a worksheet
>>> worksheet2 = wb2.get_sheet_by_name('Sheet2') # another way to load a worksheet
>>> print(worksheet1['D18'].value)
3
>>> for row in worksheet1.iter_rows():
>>>     print row[0].value()


1

これは役立つかもしれません:

これにより、2Dリスト(リストアイテムのリスト)を取得してExcelスプレッドシートにプッシュするノードが作成されます。IN []が存在するか、スローされて例外になることを確認してください。

これは、デフォルトのパッケージ済みノードが壊れ続けたため、Excel2013用のRevitExcelダイナモノードを書き直したものです。同様の読み取りノードもあります。PythonのExcel構文は扱いにくいです。

thnx @ CodingNinja-更新:)

###Export Excel - intended to replace malfunctioning excel node

import clr

clr.AddReferenceByName('Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c')
##AddReferenceGUID("{00020813-0000-0000-C000-000000000046}") ''Excel                            C:\Program Files\Microsoft Office\Office15\EXCEL.EXE 
##Need to Verify interop for version 2015 is 15 and node attachemnt for it.
from Microsoft.Office.Interop import  * ##Excel
################################Initialize FP and Sheet ID
##Same functionality as the excel node
strFileName = IN[0]             ##Filename
sheetName = IN[1]               ##Sheet
RowOffset= IN[2]                ##RowOffset
ColOffset= IN[3]                ##COL OFfset
Data=IN[4]                      ##Data
Overwrite=IN[5]                 ##Check for auto-overwtite
XLVisible = False   #IN[6]      ##XL Visible for operation or not?

RowOffset=0
if IN[2]>0:
    RowOffset=IN[2]             ##RowOffset

ColOffset=0
if IN[3]>0:
    ColOffset=IN[3]             ##COL OFfset

if IN[6]<>False:
    XLVisible = True #IN[6]     ##XL Visible for operation or not?

################################Initialize FP and Sheet ID
xlCellTypeLastCell = 11                 #####define special sells value constant
################################
xls = Excel.ApplicationClass()          ####Connect with application
xls.Visible = XLVisible                 ##VISIBLE YES/NO
xls.DisplayAlerts = False               ### ALerts

import os.path

if os.path.isfile(strFileName):
    wb = xls.Workbooks.Open(strFileName, False)     ####Open the file 
else:
    wb = xls.Workbooks.add#         ####Open the file 
    wb.SaveAs(strFileName)
wb.application.visible = XLVisible      ####Show Excel
try:
    ws = wb.Worksheets(sheetName)       ####Get the sheet in the WB base

except:
    ws = wb.sheets.add()                ####If it doesn't exist- add it. use () for object method
    ws.Name = sheetName



#################################
#lastRow for iterating rows
lastRow=ws.UsedRange.SpecialCells(xlCellTypeLastCell).Row
#lastCol for iterating columns
lastCol=ws.UsedRange.SpecialCells(xlCellTypeLastCell).Column
#######################################################################
out=[]                                  ###MESSAGE GATHERING

c=0
r=0
val=""
if Overwrite == False :                 ####Look ahead for non-empty cells to throw error
    for r, row in enumerate(Data):   ####BASE 0## EACH ROW OF DATA ENUMERATED in the 2D array #range( RowOffset, lastRow + RowOffset):
        for c, col in enumerate (row): ####BASE 0## Each colmn in each row is a cell with data ### in range(ColOffset, lastCol + ColOffset):
            if col.Value2 >"" :
                OUT= "ERROR- Cannot overwrite"
                raise ValueError("ERROR- Cannot overwrite")
##out.append(Data[0]) ##append mesage for error
############################################################################

for r, row in enumerate(Data):   ####BASE 0## EACH ROW OF DATA ENUMERATED in the 2D array #range( RowOffset, lastRow + RowOffset):
    for c, col in enumerate (row): ####BASE 0## Each colmn in each row is a cell with data ### in range(ColOffset, lastCol + ColOffset):
        ws.Cells[r+1+RowOffset,c+1+ColOffset].Value2 = col.__str__()

##run macro disbled for debugging excel macro
##xls.Application.Run("Align_data_and_Highlight_Issues")

@CodingNinjaそれで十分ですか?:)
Apsis0215 2018年

はい、はるかに優れています

0

このコードはPython3.5.2で動作しました。開いて保存し、優れています。私は現在、データをファイルに保存する方法に取り組んでいますが、これはコードです:

import csv
excel = csv.writer(open("file1.csv", "wb"))

 


-1
import pandas as pd 
import os 
files = os.listdir('path/to/files/directory/')
desiredFile = files[i]
filePath = 'path/to/files/directory/%s'
Ofile = filePath % desiredFile
xls_import = pd.read_csv(Ofile)

これで、パンダDataFramesのパワーを使用できます!


1
問題は、コンマ区切りのテキストファイルではなく、Excelファイルの読み取りに関するものです。パンダにはそのための機能があるようです(pandas.read_excel)。
バート2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.