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

87

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

Ich habe beispielsweise Textdateien sometextfile.txtmit dem Lesebefehl geöffnet . Wie mache ich das für eine Excel-Datei?

Novak
quelle
2
Welche Version von Excel? Wenn Sie sich darauf beschränken können, von Ecel 2007 oder 2010 erstellte Excel-Dateien zu öffnen, sollten Sie in der Lage sein, einen Großteil oder die gesamte Datei als XML zu analysieren.
Adam Crossland

Antworten:

96

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 Übergabe sheet_name:
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html

Alte Version:
Sie können auch pandasPaket 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()
Rakesh Adhikesavan
quelle
2
Diese Lösung bekommt meine Zustimmung. Bei openpyxl tritt das folgende Problem auf: "InvalidFileException: openpyxl unterstützt das alte XLS-Dateiformat nicht. Verwenden Sie xlrd, um diese Datei zu lesen oder in das neuere XLSX-Dateiformat zu konvertieren." Auf der anderen Seite verarbeitet pandas sowohl XLS- als auch XLSX-Dateien. Außerdem erfordert das Lesen einer gesamten Tabelle nur eine Codezeile.
Nathanielng
3
Sie müssen optionale Abhängigkeiten xlrdzum Lesen von Excel-Dateien und xlwtzum Schreiben von Excel-Dateien installieren .
Flimm
32

Probieren Sie die xlrd-Bibliothek aus .

[Bearbeiten] - Nach dem, was ich aus Ihrem Kommentar ersehen kann, könnte so etwas wie das folgende Snippet den Trick machen. Ich gehe hier davon aus, dass Sie nur eine Spalte nach dem Wort "John" durchsuchen, aber Sie könnten mehr hinzufügen oder dies 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) 
Jon Cage
quelle
Ich denke, dies könnte das sein, was ich möchte: von xlrd importiere open_workbook book = open_workbook ('simple.xls', on_demand = True) für den Namen 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, aber ich möchte nicht, dass es endwith verwendet. Ich möchte, dass es Zeilen findet und druckt, die einen bestimmten Namen enthalten ... wie Ich möchte, dass es die Zeile des riesigen Excel-Blattes druckt, das Johns Daten enthält und nicht Bobs. Hilfe?
Novak
Ich würde vorschlagen, dass Sie dies als separate Frage posten und den Code in einen Codeblock einfügen.
Jon Cage
Dies ist die zweite Frage einer Reihe verwandter Fragen; In der dritten Frage wird offenbart, dass die echte Excel-Datei angeblich 1,5 GB groß
John Machin
16

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

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

Wenn möglich, sollten Sie die Excel-Tabelle als CSV-Datei exportieren und dann mit dem integrierten Python-CSV-Modul lesen:

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

Donald Miner
quelle
Ok, ich verstehe das CSV-Zeug nicht wirklich. Wie kann Python meine Excel-Datei als CSV-Modul öffnen? Ich habe ein Programm, das für txt-Dateien das tut, was ich will, und ich möchte, dass es für diese Excel-Datei dasselbe tut ... was ist der beste Weg? Können Sie das bitte näher erläutern?
Novak
Sie können entweder ein Python-Modul eines Drittanbieters wie xlrd verwenden oder Ihre Excel-Datei als CSV-Datei anstelle einer normalen Excel-Datei speichern. Ich denke, der Punkt, den Sie vermissen, ist, dass eine Excel-Datei keine Ähnlichkeit mit einer Nur-Text-Datei hat. Öffnen Sie das Excel-Dokument im Editor und Sie werden sehen, was ich meine. Sie müssen die Datei entweder in einem Nur-Text-Format wie CSV (durch Kommas getrennte Werte) speichern, das mit Python einfacher zu lesen ist, oder ein Modul eines Drittanbieters installieren und verwenden, das eine Excel-Datei für Sie analysieren kann.
Donald Miner
Das Problem, das ich habe, ist, dass die Datei wirklich sehr groß ist. Wie kann ich die Datei als CSV-Format speichern, wenn ich die Datei nicht vollständig öffnen kann?
Novak
@novak: Ihr Problem ist, dass Ihre Datei 1,5 GB ist und der Speicher Ihres Computers "nicht genug" ist ...
John Machin
6

Es gibt das openpxyl- Paket:

>>> 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()
Worte dafür
quelle
1

Dies kann helfen:

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

Dies ist eine Neuschreibung des Revit Excel Dynamo-Knotens für Excel 2013, da der standardmäßig vorgefertigte Knoten immer wieder kaputt ging. Ich habe auch einen ähnlichen Leseknoten. Die Excel-Syntax in Python ist empfindlich.

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")
Apsis0215
quelle
@CodingNinja Das reicht? :)
Apsis0215
Ja viel besser
0

Dieser Code funktionierte für mich mit Python 3.5.2. Es öffnet und speichert und zeichnet sich aus. Ich arbeite derzeit daran, wie Daten in der Datei gespeichert werden, aber dies ist der Code:

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

 

J.ravat
quelle
-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)

Jetzt können Sie die Kraft von Pandas DataFrames nutzen!

Malcolm Monroe
quelle
1
Die Frage bezieht sich auf das Lesen einer Excel-Datei, nicht einer durch Kommas getrennten Textdatei. Pandas scheint eine Funktion dafür zu haben ( pandas.read_excel).
Bart