Python'da bir Excel dosyasını nasıl açabilirim?


87

Python'da okumak için Excel dosyası olan bir dosyayı nasıl açarım?

Örneğin, sometextfile.txtokuma komutuyla metin dosyalarını açtım . Bunu bir Excel dosyası için nasıl yaparım?


2
Excel'in hangi sürümü? Kendinizi Ecel 2007 veya 2010 tarafından oluşturulan Excel dosyalarını açmakla sınırlandırabilirseniz, dosyanın çoğunu veya tamamını XML olarak ayrıştırabilmeniz gerekir.
Adam Crossland

Yanıtlar:


97

Düzenleme:
Pandaların yeni sürümünde, sayfa adını parametre olarak iletebilirsiniz.

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

Nasıl geçirileceğine ilişkin örnekler için belgelere bakın sheet_name:
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html

Eski sürüm: paketi
de kullanabilirsiniz ....pandas

Birden çok sayfalı bir excel dosyasıyla çalışırken şunları kullanabilirsiniz:

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 dosyanızın ilk 5 satırını yazdıracak

Tek sayfalı bir Excel dosyasıyla çalışıyorsanız, şunları kullanabilirsiniz:

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

2
bu çözüm olumlu oyumu alıyor. openpyxl ile şu sorunla karşılaşıyorum: "InvalidFileException: openpyxl eski .xls dosya biçimini desteklemiyor, lütfen bu dosyayı okumak için xlrd kullanın veya daha yeni .xlsx dosya biçimine dönüştürün". Öte yandan, pandalar hem .xls hem de .xlsx dosyalarını yönetir ... ayrıca, bir tablonun tamamını okumak yalnızca bir satır kod alır.
nathanielng

3
xlrdExcel dosyalarını okumak ve xlwtExcel dosyaları yazmak için isteğe bağlı bağımlılıklar yüklemeniz gerekecektir .
Flimm

32

Xlrd kitaplığını deneyin .

[Düzenle] - Yorumunuzdan görebildiğim kadarıyla, aşağıdaki ön bilgi gibi bir şey işe yarayabilir. Burada 'john' kelimesi için sadece bir sütun aradığınızı varsayıyorum, ancak daha fazlasını ekleyebilir veya bunu daha genel bir işlev haline getirebilirsiniz.

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) 

Sanırım yapmasını istediğim şey bu olabilir: kitap.sheet_names () içindeki ad için xlrd import open_workbook book = open_workbook ('simple.xls', on_demand = True): if name.endswith ('2'): sheet = book.sheet_by_name (name) print sheet.cell_value (0,0) book.unload_sheet (name) large_files.py ancak endwith kullanmasını istemiyorum, belirli bir ad içeren satırları bulmasını ve yazdırmasını istiyorum ... gibi Bob'un verilerini değil john'un verilerini içeren devasa excel sayfasının satırını yazdırmasını istiyorum. Yardım?
novak

Bunu ayrı bir soru olarak göndermenizi ve kodu bir kod bloğuna koymanızı öneririm.
Jon Cage

Bu, bir dizi ilgili sorunun ikinci sorusudur; 3. soruda gerçek excel dosyasının iddia edildiği gibi 1.5 GB olduğu ve bilgisayarın belleğinin "yeterli değil" olarak tanımlandığı ortaya çıkıyor ... bkz. stackoverflow.com/questions/3241039/…
John Machin

16

Bu, düz bir metin dosyasını açmak kadar kolay değildir ve bunu yapmak için hiçbir şey yerleşik olmadığı için bir tür harici modül gerektirecektir. İşte bazı seçenekler:

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

Mümkünse, excel elektronik tablosunu bir CSV dosyası olarak dışa aktarmayı ve ardından bunu okumak için yerleşik python csv modülünü kullanmayı düşünebilirsiniz:

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


Tamam, CSV ile ilgili şeyleri gerçekten anlamıyorum. Python, excel dosyamı bir csv modülü olarak nasıl açtırabilirim? Txt dosyaları için istediğimi yapan bir programım var ve bu excel dosyası için de aynı şeyi yapmasını istiyorum ... Bu gitmek için en iyi yol mu? Bunu biraz daha açabilir misiniz lütfen?
novak

Ya xlrd gibi bir 3. parti python modülü kullanabilir ya da excel dosyanızı normal bir Excel dosyası yerine bir CSV dosyası olarak kaydedebilirsiniz. Bence eksik olduğunuz nokta, bir excel dosyasının düz metin dosyasıyla hiçbir benzerliğinin olmamasıdır. Excel belgesini not defterinde açın ve ne demek istediğimi göreceksiniz. Dosyayı, python ile okunması daha kolay olan CSV (virgülle ayrılmış değerler) gibi düz metin biçiminde kaydetmeniz veya sizin için bir Excel dosyasını ayrıştırabilecek bir 3. taraf modülü kurmanız ve kullanmanız gerekir.
Donald Miner

Yaşadığım sorun, dosyanın gerçekten çok büyük olması. Dosyayı tamamen açamazsam, dosyayı CSV formatında nasıl kaydedebilirim?
novak

@novak: Sizin sorununuz, dosyanızın 1.5GB olması ve bilgisayarınızın belleğinin "yeterli olmaması" ...
John Machin

6

Orada openpxyl paketi:

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

Bu yardımcı olabilir:

Bu, bir 2B Liste (liste öğeleri listesi) alan ve bunları excel elektronik tablosuna iten bir düğüm oluşturur. IN [] 'lerin mevcut olduğundan emin olun veya fırlatır ve istisna oluşturur.

varsayılan önceden paketlenmiş düğüm bozulmaya devam ettiği için bu, Excel 2013 için Revit excel dinamo düğümünün yeniden yazılmasıdır. Ayrıca benzer bir okuma düğümüm var. Python'daki excel sözdizimi dokunaklı.

thnx @CodingNinja - güncellendi:)

###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 Bu yeterli mi? :)
Apsis0215

Evet çok daha iyi

0

Bu kod benim için Python 3.5.2 ile çalıştı. Açar, kaydeder ve mükemmelleşir. Şu anda verilerin dosyaya nasıl kaydedileceği üzerinde çalışıyorum ama kod bu:

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)

Artık pandaların DataFrame'lerinin gücünü kullanabilirsiniz!


1
Soru, virgülle ayrılmış bir metin dosyası değil, bir Excel dosyasını okumakla ilgilidir. Pandaların bunun için bir işlevi var gibi görünüyor ( pandas.read_excel).
Bart
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.