ฉันจะเปิดไฟล์ Excel ใน Python ได้อย่างไร


87

ฉันจะเปิดไฟล์ที่เป็นไฟล์ Excel เพื่ออ่านใน Python ได้อย่างไร

ฉันได้เปิดไฟล์ข้อความsometextfile.txtด้วยคำสั่งอ่าน ฉันจะทำเช่นนั้นสำหรับไฟล์ Excel ได้อย่างไร


2
Excel เวอร์ชันใด หากคุณสามารถ จำกัด ตัวเองให้เปิดไฟล์ Excel ที่สร้างโดย Ecel 2007 หรือ 2010 ได้คุณควรแยกวิเคราะห์ไฟล์เป็น XML ได้มากหรือทั้งหมด
— Adam Crossland

คำตอบ:


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

เวอร์ชั่นเก่า:
ใช้pandaspackage ได้เช่นกัน ....

เมื่อคุณทำงานกับไฟล์ 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() จะพิมพ์ 5 แถวแรกของไฟล์ Excel ของคุณ

หากคุณกำลังทำงานกับไฟล์ Excel ด้วยแผ่นงานเดียวคุณสามารถใช้:

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

2
โซลูชันนี้ทำให้ฉันได้รับคะแนนโหวตมากขึ้น ด้วย openpyxl ฉันพบปัญหาต่อไปนี้ "InvalidFileException: openpyxl ไม่รองรับรูปแบบไฟล์. xls แบบเก่าโปรดใช้ xlrd เพื่ออ่านไฟล์นี้หรือแปลงเป็นรูปแบบไฟล์. xlsx ล่าสุด" ในทางกลับกันแพนด้าจัดการทั้งไฟล์. xls และ. xlsx ... นอกจากนี้การอ่านทั้งตารางจะใช้โค้ดเพียงบรรทัดเดียว
— nathanielng

3
คุณจะต้องติดตั้งการอ้างอิงเพิ่มเติมxlrdสำหรับการอ่านไฟล์ Excel และxlwtสำหรับการเขียนไฟล์ Excel
— Flimm

32

ลองห้องสมุด xlrd

[แก้ไข] - จากสิ่งที่ฉันเห็นจากความคิดเห็นของคุณข้อมูลโค้ดด้านล่างอาจใช้เคล็ดลับได้ ฉันสมมติว่าที่นี่คุณกำลังค้นหาคำว่า 'john' เพียงคอลัมน์เดียว แต่คุณสามารถเพิ่มมากขึ้นหรือทำให้เป็นฟังก์ชันทั่วไปได้

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) 

ฉันคิดว่านี่อาจเป็นสิ่งที่ฉันต้องการให้ทำ: จาก xlrd import open_workbook book = open_workbook ('simple.xls', on_demand = True) สำหรับชื่อใน 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 ฉันต้องการให้ค้นหาและพิมพ์บรรทัดที่มีชื่ออนุภาค ... เช่น ฉันต้องการให้พิมพ์บรรทัดของแผ่นงาน excel ขนาดใหญ่ที่มีข้อมูลของจอห์นไม่ใช่ของบ๊อบ ช่วยด้วย?
— โนวัค

ฉันขอแนะนำให้คุณโพสต์เป็นคำถามแยกต่างหากและใส่รหัสในบล็อกรหัส
— Jon Cage

นี่เป็นคำถามที่สองของชุดคำถามที่เกี่ยวข้อง ในคำถามที่ 3 มีการเปิดเผยว่าไฟล์ excel จริงถูกกล่าวหาว่า 1.5 GB และหน่วยความจำของคอมพิวเตอร์อธิบายว่า "ไม่เพียงพอ" ... ดู stackoverflow.com/questions/3241039/…
— John Machin

16

สิ่งนี้ไม่ตรงไปตรงมาเหมือนกับการเปิดไฟล์ข้อความธรรมดาและจะต้องใช้โมดูลภายนอกบางประเภทเนื่องจากไม่มีอะไรในตัวเพื่อทำสิ่งนี้ นี่คือตัวเลือกบางส่วน:

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

หากเป็นไปได้คุณอาจต้องการส่งออกสเปรดชีต excel เป็นไฟล์ CSV จากนั้นใช้โมดูล python csv ในตัวเพื่ออ่าน:

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


ตกลงฉันไม่เข้าใจสิ่งที่เป็น CSV จริงๆฉันจะให้ python เปิดไฟล์ excel เป็นโมดูล csv ได้อย่างไร ฉันมีโปรแกรมที่ทำสิ่งที่ฉันต้องการสำหรับไฟล์ txt และฉันต้องการให้มันทำสิ่งเดียวกันกับไฟล์ excel นี้ ... วิธีไหนดีที่สุด คุณช่วยอธิบายให้ละเอียดได้ไหม
— โนวัค

คุณสามารถใช้โมดูล python ของบุคคลที่สามเช่น xlrd หรือบันทึกไฟล์ excel ของคุณเป็นไฟล์ CSV แทนไฟล์ Excel ปกติ ฉันคิดว่าประเด็นที่คุณขาดหายไปคือไฟล์ excel ไม่มีความคล้ายคลึงกับไฟล์ข้อความธรรมดา เปิดเอกสาร Excel ใน notepad แล้วคุณจะเห็นว่าฉันหมายถึงอะไร คุณต้องบันทึกไฟล์ในรูปแบบข้อความธรรมดาเช่น CSV (ค่าที่คั่นด้วยจุลภาค) ซึ่งง่ายต่อการอ่านด้วย python หรือติดตั้งและใช้โมดูลของบุคคลที่สามที่สามารถแยกวิเคราะห์ไฟล์ Excel ให้คุณได้
— Donald Miner

ปัญหาที่ฉันพบคือไฟล์มีขนาดใหญ่มาก ฉันจะบันทึกไฟล์เป็นรูปแบบ CSV ได้อย่างไรหากฉันไม่สามารถเปิดไฟล์ได้ทั้งหมด?
— โนวัค

@novak: ปัญหาของคุณคือไฟล์ของคุณมีขนาด 1.5GB และหน่วยความจำของคอมพิวเตอร์ "ไม่เพียงพอ" ...
— John Machin

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 [] มีอยู่หรือจะโยนและยกเว้น

นี่คือการเขียนซ้ำของโหนดไดนาโม Revit excel สำหรับ excel 2013 เนื่องจากโหนดที่จัดเตรียมไว้เป็นค่าเริ่มต้นยังคงทำลายอยู่ ฉันยังมีโหนดการอ่านที่คล้ายกัน ไวยากรณ์ excel ใน Python เป็นแบบสัมผัส

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

ใช่ดีกว่ามาก

0

รหัสนี้ใช้ได้กับฉันกับ Python 3.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)
— บาร์ต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.