web-dev-qa-db-de.com

Wie kann ich eine Excel-Datei in Python öffnen?

Wie öffne ich eine Datei, die eine Excel-Datei zum Lesen in Python ist? 

Ich habe Textdateien geöffnet, zum Beispiel sometextfile.txt mit dem Lesebefehl. Wie mache ich das für eine Excel-Datei?

68
novak

Bearbeiten: 
In der neueren Version von Pandas können Sie den Blattnamen als Parameter übergeben. 

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

In den Dokumenten finden Sie Beispiele für die Weitergabe von sheet_name
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_Excel.html

Alte Version: 
Sie können auch pandas package verwenden.

Wenn Sie mit einer Excel-Datei mit mehreren Blättern arbeiten, können Sie Folgendes verwenden:

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() druckt die ersten 5 Zeilen Ihrer Excel-Datei

Wenn Sie mit einer Excel-Datei mit einem einzelnen Blatt arbeiten, können Sie einfach Folgendes verwenden:

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

Versuchen Sie die xlrd-Bibliothek .

[Edit] - Soweit ich aus Ihrem Kommentar ersehen kann, könnte so etwas wie das folgende Snippet den Trick tun. Ich gehe hier davon aus, dass Sie nur eine Spalte nach dem Wort 'john' durchsuchen, aber Sie könnten weitere hinzufügen oder diese zu einer allgemeineren Funktion machen.

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) 
31
Jon Cage

Dies ist nicht so einfach wie das Öffnen einer Nur-Text-Datei und erfordert eine Art externes Modul, da dazu nichts eingebaut ist. Hier sind einige Optionen: 

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

Wenn möglich, sollten Sie in Betracht ziehen, die Excel-Tabelle als CSV-Datei zu exportieren und dann das eingebaute Python-CSV-Modul zu verwenden, um sie zu lesen:

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

16
Donald Miner

Es gibt das Paket 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()
6
wordsforthewise

Das kann helfen:

Dadurch wird ein Knoten erstellt, der eine 2D-Liste (Liste der Listenelemente) übernimmt und diese in die Excel-Tabelle schiebt. Stellen Sie sicher, dass die IN [] vorhanden sind oder eine Ausnahme auslösen.

hierbei wird der Revit Excel-Dynamoknoten für Excel 2013 neu geschrieben, da der standardmäßig vorgepackte Knoten ständig bricht. Ich habe auch einen ähnlichen Leseknoten. Die Excel-Syntax in Python ist heikel.

thnx @CodingNinja - aktualisiert:)

###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")
1
Apsis0215

Sie können das xlpython-Paket verwenden, für das nur xlrd erforderlich ist. Finden Sie es hier https://pypi.python.org/pypi/xlpython Und seiner Dokumentation hier https://github.com/morfat/xlpython

1
Morfat Mosoti