Membaca / mengurai file Excel (xls) dengan Python


Jawaban:


91

Saya sangat merekomendasikan xlrd untuk membaca .xlsfile.

voyager menyebutkan penggunaan otomatisasi COM. Setelah melakukan ini sendiri beberapa tahun yang lalu, berhati-hatilah karena melakukan ini adalah PITA yang nyata. Jumlah peringatan sangat besar dan dokumentasinya kurang dan mengganggu. Saya menemukan banyak bug dan gotcha aneh, beberapa di antaranya membutuhkan waktu berjam-jam untuk mengetahuinya.

PEMBARUAN: Untuk .xlsxfile yang lebih baru , perpustakaan yang disarankan untuk membaca dan menulis tampaknya openpyxl (terima kasih, Ikar Pohorský).


5
Untuk file Excel 2007+ ( .xlsx) Anda mungkin akan menggunakan OpenPyXL .
Ikar Pohorský

48

Menggunakan panda:

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
pandas menggunakan xlrd untuk melakukan pembacaan; Anda juga perlu menginstal xlrd sebagai dependensi
congusbongus

25

Anda dapat memilih salah satu dari mereka http://www.python-excel.org/
Saya akan merekomendasikan pustaka python xlrd.

instal menggunakan

pip install xlrd

impor menggunakan

import xlrd

untuk membuka buku kerja

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

buka lembar dengan nama

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

buka lembar demi indeks

worksheet = workbook.sheet_by_index(0)

membaca nilai sel

worksheet.cell(0, 0).value    

"Nilai sel baca" tidak berfungsi ... ini memunculkan TypeError: objek 'Sheet' tidak dapat dipanggil. Sisanya bekerja dengan baik.
Newbielp

13

Saya pikir Panda adalah cara terbaik untuk pergi. Sudah ada satu jawaban di sini dengan Pandas menggunakan ExcelFilefungsi, tapi tidak bekerja dengan baik untuk saya. Dari sini saya menemukan read_excelfungsi yang berfungsi dengan baik:

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

PS Anda harus xlrdmenginstal agar read_excelfungsi dapat bekerja

Pembaruan 21-03-2020: Seperti yang Anda lihat di sini , ada masalah dengan xlrdmesin dan itu akan ditinggalkan. The openpyxladalah pengganti terbaik. Jadi seperti yang dijelaskan di sini , sintaks kanonik harus:

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

AttributeError: objek 'dict' tidak memiliki atribut 'head'
lopezdp

4

Untuk xlsx saya suka solusi yang diposting sebelumnya sebagai https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python . Saya menggunakan modul dari perpustakaan standar saja.

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

Perbaikan yang ditambahkan adalah mengambil konten dengan nama sheet, menggunakan re untuk mendapatkan kolom dan memeriksa apakah string bersama digunakan.

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

Terima kasih telah menghidupkan kembali jawaban saya!
Collin Anderson

2

Anda dapat menggunakan salah satu pustaka yang tercantum di sini (seperti Pyxlreader yang didasarkan pada JExcelApi, atau xlwt ), ditambah otomatisasi COM untuk menggunakan Excel itu sendiri untuk membaca file, tetapi untuk itu Anda memperkenalkan Office sebagai ketergantungan perangkat lunak Anda, yang mungkin tidak selalu menjadi pilihan.


6
(1) pyxlreader adalah cacar mutlak. Anda pasti tidak pernah mencobanya. Lihat komentar saya di sini: stackoverflow.com/questions/1243545/… (2) xlwtfile WriTes; gunakan xlrduntuk ReaD file.
John Machin

2

Jika Anda membutuhkan format XLS lama. Di bawah kode untuk 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

Anda mungkin juga mempertimbangkan untuk menjalankan program (non-python) xls2csv. Beri makan file xls, dan Anda harus mendapatkan kembali csv.


3
Tapi posternya mengatakan dia perlu membaca Python ... Apakah Anda menyarankan untuk menjalankan xls2csv, lalu mengurai csvdari Python?
hcarver

Python-excelerator berisi pembungkus py_xls2csv yang dapat dieksekusi di sekitar konverter python.
fatal_error


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

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

Anda dapat mengubah CSV menjadi unggul seperti di atas dengan paket bawaan. CSV dapat ditangani dengan paket built-in dari dictreader dan dictwriter yang akan bekerja dengan cara yang sama seperti kamus python. yang membuatnya sangat mudah Saat ini saya tidak mengetahui adanya paket inbuilt untuk excel tetapi saya telah menemukan openpyxl. Itu juga cukup lurus ke depan dan sederhana Anda dapat melihat potongan kode di bawah ini berharap ini membantu

    import openpyxl
    book = openpyxl.load_workbook(filename)
    sheet = book.active 
    result =sheet['AP2']
    print(result.value)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.