Đọc / phân tích cú pháp tệp Excel (xls) bằng Python


117

Cách tốt nhất để đọc tệp Excel (XLS) bằng Python (không phải tệp CSV ) là gì.

Có gói tích hợp nào được hỗ trợ theo mặc định bằng Python để thực hiện tác vụ này không?



18
@voyager: anh ấy muốn ĐỌC các tệp không viết chúng
John Machin,

Câu trả lời:


91

Tôi thực sự khuyên bạn nên xlrd để đọc .xlstệp.

voyager đã đề cập đến việc sử dụng tự động hóa COM. Bản thân tôi đã làm điều này một vài năm trước, hãy cảnh báo rằng làm điều này là một PITA thực sự. Số lượng cảnh báo là rất lớn và tài liệu thiếu và gây khó chịu. Tôi đã gặp phải nhiều lỗi và lỗi kỳ lạ, một số trong số đó mất nhiều giờ để tìm ra.

CẬP NHẬT: Đối với các .xlsxtệp mới hơn , thư viện được đề xuất để đọc và ghi dường như là openpyxl (cảm ơn, Ikar Pohorský).


5
Đối với tệp Excel 2007+ ( .xlsx), bạn có thể sẽ sử dụng OpenPyXL .
Ikar Pohorský

48

Sử dụng gấu trúc:

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
gấu trúc đang sử dụng xlrd để đọc; bạn sẽ cũng cần phải cài đặt xlrd như một sự phụ thuộc
congusbongus

25

Bạn có thể chọn bất kỳ một trong số chúng http://www.python-excel.org/
Tôi muốn giới thiệu thư viện xlrd python.

cài đặt nó bằng cách sử dụng

pip install xlrd

nhập khẩu bằng cách sử dụng

import xlrd

để mở một sổ làm việc

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

mở trang tính theo tên

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

mở trang tính theo chỉ mục

worksheet = workbook.sheet_by_index(0)

đọc giá trị ô

worksheet.cell(0, 0).value    

"Giá trị ô đọc" không hoạt động ... nó tạo ra Lỗi TypeError: Đối tượng 'Trang tính' không thể gọi được. Tất cả những thứ còn lại đều hoạt động tốt.
Newbielp

13

Tôi nghĩ Pandas là cách tốt nhất để đi. Đã có một câu trả lời ở đây với ExcelFilechức năng sử dụng Pandas , nhưng nó không hoạt động đúng với tôi. Từ đây tôi thấy read_excelchức năng hoạt động tốt:

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

PS Bạn cần xlrdcài đặt để read_excelchức năng hoạt động

Cập nhật 21-03-2020: Như bạn có thể thấy ở đây , có vấn đề với xlrdcông cụ và nó sẽ không được dùng nữa. Là openpyxlsự thay thế tốt nhất. Vì vậy, như được mô tả ở đây , cú pháp chuẩn phải là:

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

AttributeError: Đối tượng 'dict' không có thuộc tính 'head'
lopezdp

4

Đối với xlsx, tôi thích giải pháp được đăng trước đó là https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python . Tôi chỉ sử dụng các mô-đun từ thư viện tiêu chuẩn.

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

Các cải tiến được thêm vào là tìm nạp nội dung theo tên trang tính, sử dụng re để lấy cột và kiểm tra xem các chuỗi chia sẻ có được sử dụng hay không.

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

Cảm ơn đã làm sống lại câu trả lời của tôi!
Collin Anderson

2

Bạn có thể sử dụng bất kỳ thư viện nào được liệt kê ở đây (như Pyxlreader dựa trên JExcelApi hoặc xlwt ), cộng với tự động hóa COM để sử dụng chính Excel để đọc các tệp, nhưng bạn đang giới thiệu Office như một phần phụ thuộc của phần mềm của mình, mà có thể không phải lúc nào cũng là một lựa chọn.


6
(1) pyxlreader là pox tuyệt đối. Chắc hẳn bạn chưa từng thử. Xem nhận xét của tôi tại đây: stackoverflow.com/questions/1243545/… (2) xlwtTệp WriTes; sử dụng xlrdcho các tệp ReaD.
John Machin,

2

Nếu bạn cần định dạng XLS cũ. Dưới đây là mã cho 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

Bạn cũng có thể cân nhắc chạy chương trình (không phải python) xls2csv. Cung cấp cho nó một tệp xls và bạn sẽ nhận lại một csv.


3
Nhưng người đăng nói rằng anh ta cần phải đọc sang Python ... Bạn có đề xuất chạy xls2csv, sau đó phân tích cú pháp csvtừ Python?
hcarver

Python-excelerator chứa trình bao bọc py_xls2csv có thể thực thi xung quanh trình chuyển đổi python.
fat_error


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

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

Bạn có thể biến CSV thành excel như trên bằng các gói có sẵn. CSV có thể được xử lý bằng một gói trình đọc và viết có sẵn sẽ hoạt động giống như cách hoạt động của từ điển python. điều này làm cho nó dễ dàng hơn rất nhiều Tôi hiện không biết về bất kỳ gói sẵn có nào cho excel nhưng tôi đã gặp openpyxl. Nó cũng khá dễ hiểu và đơn giản. Bạn có thể xem đoạn mã bên dưới, hy vọng điều này sẽ hữu ích

    import openpyxl
    book = openpyxl.load_workbook(filename)
    sheet = book.active 
    result =sheet['AP2']
    print(result.value)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.