การอ่าน / แยกวิเคราะห์ไฟล์ Excel (xls) ด้วย Python


117

วิธีใดเป็นวิธีที่ดีที่สุดในการอ่านไฟล์ Excel (XLS) ด้วย Python (ไม่ใช่ไฟล์ CSV )

มีแพ็คเกจในตัวที่รองรับโดยค่าเริ่มต้นใน Python เพื่อทำงานนี้หรือไม่



18
@voyager: เขาต้องการอ่านไฟล์ไม่ได้เขียน
John Machin

คำตอบ:


92

ฉันขอแนะนำxlrdสำหรับการอ่าน.xlsไฟล์

นักเดินทางกล่าวถึงการใช้ COM อัตโนมัติ หลังจากทำสิ่งนี้ด้วยตัวเองเมื่อไม่กี่ปีที่ผ่านมาขอเตือนว่าการทำเช่นนี้เป็น PITA จริง ข้อควรระวังมีจำนวนมากและเอกสารขาดและน่ารำคาญ ฉันพบข้อบกพร่องและ gotchas แปลก ๆ หลายตัวซึ่งบางตัวใช้เวลาหลายชั่วโมงในการคิดออก

อัปเดต: สำหรับ.xlsxไฟล์ที่ใหม่กว่าไลบรารีที่แนะนำสำหรับการอ่านและเขียนดูเหมือนจะเป็นopenpyxl (ขอบคุณ Ikar Pohorský)


5
สำหรับ Excel 2007 ขึ้นไปไฟล์ ( .xlsx) คุณอาจจะใช้OpenPyXL
Ikar Pohorský

48

การใช้แพนด้า:

import pandas as pd

xls = pd.ExcelFile("yourfilename.xls")

sheetX = xls.parse(2) #2 is the sheet number

var1 = sheetX['ColumnName']

print(var1[1]) #1 is the row number...

1
แพนด้าใช้ xlrd ในการอ่าน คุณจะต้องติดตั้ง xlrd เป็นการพึ่งพาด้วย
Congusbongus

25

คุณสามารถเลือกรายการใดก็ได้http://www.python-excel.org/
ฉันขอแนะนำไลบรารี python xlrd

ติดตั้งโดยใช้

pip install xlrd

นำเข้าโดยใช้

import xlrd

เพื่อเปิดสมุดงาน

workbook = xlrd.open_workbook('your_file_name.xlsx')

เปิดแผ่นงานตามชื่อ

worksheet = workbook.sheet_by_name('Name of the Sheet')

เปิดแผ่นงานตามดัชนี

worksheet = workbook.sheet_by_index(0)

อ่านค่าเซลล์

worksheet.cell(0, 0).value    

"อ่านค่าเซลล์" ไม่ทำงาน ... มันทำให้เกิด TypeError: วัตถุ "แผ่นงาน" ไม่สามารถเรียกใช้ได้ ส่วนที่เหลือทั้งหมดทำงานได้ดี
Newbielp

13

ฉันคิดว่านุ่นเป็นวิธีที่ดีที่สุด มีอยู่แล้วหนึ่งคำตอบที่นี่กับนุ่นโดยใช้ExcelFileฟังก์ชั่น แต่มันไม่ได้ทำงานอย่างถูกต้องสำหรับผม จากที่นี่ฉันพบread_excelฟังก์ชั่นที่ใช้งานได้ดี:

import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))

ปล.คุณต้องมีการxlrdติดตั้งเพื่อให้read_excelฟังก์ชันทำงานได้

อัปเดต 21-03-2020: ดังที่คุณเห็นที่นี่มีปัญหาเกี่ยวกับxlrdเครื่องยนต์และกำลังจะเลิกใช้งาน openpyxlเป็นทดแทนที่ดีที่สุด ดังนั้นตามที่อธิบายไว้ที่นี่ไวยากรณ์ที่ยอมรับควรเป็น:

dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")

AttributeError: วัตถุ 'dict' ไม่มีแอตทริบิวต์ 'head'
lopezdp

4

สำหรับ xlsx ผมชอบวิธีการแก้ปัญหาที่โพสต์ก่อนหน้านี้เป็นhttps://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python ฉันใช้โมดูลจากไลบรารีมาตรฐานเท่านั้น

def xlsx(fname):
    import zipfile
    from xml.etree.ElementTree import iterparse
    z = zipfile.ZipFile(fname)
    strings = [el.text for e, el in iterparse(z.open('xl/sharedStrings.xml')) if el.tag.endswith('}t')]
    rows = []
    row = {}
    value = ''
    for e, el in iterparse(z.open('xl/worksheets/sheet1.xml')):
        if el.tag.endswith('}v'):  # Example: <v>84</v>                            
            value = el.text
        if el.tag.endswith('}c'):  # Example: <c r="A3" t="s"><v>84</v></c>                                 
            if el.attrib.get('t') == 's':
                value = strings[int(value)]
            letter = el.attrib['r']  # Example: AZ22                         
            while letter[-1].isdigit():
                letter = letter[:-1]
            row[letter] = value
            value = ''
        if el.tag.endswith('}row'):
            rows.append(row)
            row = {}
    return rows

การปรับปรุงที่เพิ่มเข้ามาคือการดึงเนื้อหาตามชื่อแผ่นงานโดยใช้ re เพื่อรับคอลัมน์และตรวจสอบว่ามีการใช้สตริงที่ใช้ร่วมกันหรือไม่

def xlsx(fname,sheet):
    import zipfile
    from xml.etree.ElementTree import iterparse
    import re
    z = zipfile.ZipFile(fname)
    if 'xl/sharedStrings.xml' in z.namelist():
        # Get shared strings
        strings = [element.text for event, element
                   in iterparse(z.open('xl/sharedStrings.xml')) 
                   if element.tag.endswith('}t')]
    sheetdict = { element.attrib['name']:element.attrib['sheetId'] for event,element in iterparse(z.open('xl/workbook.xml'))
                                      if element.tag.endswith('}sheet') }
    rows = []
    row = {}
    value = ''

    if sheet in sheets:
    sheetfile = 'xl/worksheets/sheet'+sheets[sheet]+'.xml'
    #print(sheet,sheetfile)
    for event, element in iterparse(z.open(sheetfile)):
        # get value or index to shared strings
        if element.tag.endswith('}v') or element.tag.endswith('}t'):
            value = element.text
        # If value is a shared string, use value as an index
        if element.tag.endswith('}c'):
            if element.attrib.get('t') == 's':
                value = strings[int(value)]
            # split the row/col information so that the row leter(s) can be separate
            letter = re.sub('\d','',element.attrib['r'])
            row[letter] = value
            value = ''
        if element.tag.endswith('}row'):
            rows.append(row)
            row = {}

    return rows

ขอบคุณที่รื้อฟื้นคำตอบของฉัน!
Collin Anderson

2

คุณสามารถใช้ไลบรารีใดก็ได้ที่ระบุไว้ที่นี่ (เช่นPyxlreaderที่ขึ้นอยู่กับ JExcelApi หรือxlwt ) รวมทั้งระบบอัตโนมัติ COM เพื่อใช้ Excel เองสำหรับการอ่านไฟล์ แต่สำหรับสิ่งนั้นคุณกำลังแนะนำ Office ให้เป็นที่พึ่งพาของซอฟต์แวร์ของคุณ ซึ่งอาจไม่ใช่ทางเลือกเสมอไป


6
(1) pyxlreader เป็นโรคฝีแน่นอน คุณต้องไม่เคยลอง ดูความคิดเห็นของฉันที่นี่: stackoverflow.com/questions/1243545/… (2) xlwtไฟล์ WriTes; ใช้xlrdกับไฟล์ ReaD
John Machin

2

หากคุณต้องการรูปแบบ XLS แบบเก่า ด้านล่างรหัสสำหรับ ansii 'cp1251'

import xlrd

file=u'C:/Landau/task/6200.xlsx'

try:
    book = xlrd.open_workbook(file,encoding_override="cp1251")  
except:
    book = xlrd.open_workbook(file)
print("The number of worksheets is {0}".format(book.nsheets))
print("Worksheet name(s): {0}".format(book.sheet_names()))
sh = book.sheet_by_index(0)
print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols))
print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3)))
for rx in range(sh.nrows):
   print(sh.row(rx))


0

คุณอาจลองเรียกใช้โปรแกรม (ไม่ใช่ python) xls2csv ป้อนไฟล์ xls และคุณควรได้รับ csv กลับคืนมา


3
แต่ผู้โพสต์บอกว่าเขาต้องอ่านเป็น Python ... คุณแนะนำให้รันxls2csvแล้วแยกวิเคราะห์csvจาก Python หรือไม่?
hcarver

Python-excelerator มี wrapper py_xls2csv ที่รันได้รอบ ๆ ตัวแปลง python
fatal_error


0
    with open(csv_filename) as file:
        data = file.read()

    with open(xl_file_name, 'w') as file:
        file.write(data)

คุณสามารถเปลี่ยน CSV ให้เป็น Excel ได้เหมือนข้างบนด้วยแพ็คเกจที่สร้างขึ้น CSV สามารถจัดการได้ด้วยชุดโปรแกรมอ่านตามคำสั่งและตัวเขียนในตัวซึ่งจะทำงานในลักษณะเดียวกับงานพจนานุกรม python ซึ่งทำให้มันง่ายมากตอนนี้ฉันไม่รู้ว่ามีแพ็คเกจ inbuilt ใด ๆ สำหรับ excel แต่ฉันเจอ openpyxl มันค่อนข้างตรงไปตรงมาและเรียบง่ายคุณสามารถดูข้อมูลโค้ดด้านล่างหวังว่านี่จะช่วยได้

    import openpyxl
    book = openpyxl.load_workbook(filename)
    sheet = book.active 
    result =sheet['AP2']
    print(result.value)

0

สำหรับรุ่นเก่า .xlsไฟล์คุณสามารถใช้ไฟล์xlrd

คุณสามารถใช้xlrdโดยตรงโดยการนำเข้า ชอบด้านล่าง

import xlrd
wb = xlrd.open_workbook(file_name)

หรือจะใช้pd.read_excel()วิธีแพนด้าก็ได้ แต่อย่าลืมระบุเอ็นจิ้นแม้ว่าค่าดีฟอลต์จะเป็นxlrdก็ต้องระบุ

pd.read_excel(file_name, engine = xlrd)

ทั้งสองใช้งานได้กับ.xlsไฟล์รูปแบบเก่า Infact ฉันเจอสิ่งนี้เมื่อฉันใช้OpenPyXLฉันได้รับข้อผิดพลาดด้านล่าง

InvalidFileException: openpyxl does not support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.