ฉันจะเปิดไฟล์ 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.