Excel (xls) dosyalarını Python ile okuma / ayrıştırma


Yanıtlar:


92

Dosyaları okumak için xlrd'yi şiddetle tavsiye ederim .xls.

Voyager, COM otomasyonunun kullanımından bahsetti. Bunu birkaç yıl önce kendim yaptım, bunun gerçek bir PITA olduğu konusunda uyarılalım. Uyarıların sayısı çok büyük ve belgeler eksik ve can sıkıcı. Bazılarının çözülmesi saatler süren birçok tuhaf hata ve sorunla karşılaştım.

GÜNCELLEME: Daha yeni .xlsxdosyalar için, okuma ve yazma için önerilen kitaplık openpyxl olarak görünür (teşekkürler, Ikar Pohorský ).


5
Excel 2007+ dosyaları ( .xlsx) için muhtemelen OpenPyXL kullanırsınız .
Ikar Pohorský

48

Pandaları kullanma:

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
pandalar okuma yapmak için xlrd kullanıyor;
xlrd'yi

25

Bunlardan herhangi birini seçebilirsiniz http://www.python-excel.org/
Python xlrd kitaplığını öneririm.

kullanarak kurun

pip install xlrd

kullanarak içe aktar

import xlrd

bir çalışma kitabını açmak için

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

adıyla sayfa aç

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

sayfayı dizine göre aç

worksheet = workbook.sheet_by_index(0)

hücre değerini oku

worksheet.cell(0, 0).value    

"Hücre değerini oku" çalışmıyor ... bir TypeError oluşturuyor: "Sayfa" nesnesi çağrılamaz. Geri kalan her şey harika çalıştı.
Newbielp

13

Pandaların gitmenin en iyi yolu olduğunu düşünüyorum. Fonksiyon kullanan Pandalar ile burada zaten bir cevap varExcelFile , ancak benim için düzgün çalışmadı. Gönderen burada buldum read_excelsadece para cezası işleri işlevi:

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

PS İşlevin çalışması için xlrdkurulu olması gerekirread_excel

Güncelleme 21-03-2020: görebileceğiniz gibi burada , ile sorunları vardır xlrdmotoru ve kaldırılacaktır gidiyor. En openpyxliyi yedek. Burada açıklandığı gibi , kanonik sözdizimi şöyle olmalıdır:

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

AttributeError: 'dict' nesnesinin 'head' niteliği yok
lopezdp

4

Xlsx için daha önce https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python olarak yayınlanan çözümü beğendim . Yalnızca standart kitaplıktaki modülleri kullanıyorum.

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

Eklenen iyileştirmeler, sayfa adına göre içerik getirme, sütunu almak için yeniden kullanma ve paylaşılan dizelerin kullanılıp kullanılmadığını kontrol etmektir.

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

Cevabımı canlandırdığınız için teşekkürler!
Collin Anderson

2

Burada listelenen kitaplıklardan herhangi birini ( JExcelApi veya xlwt tabanlı Pyxlreader gibi ) ve ayrıca COM otomasyonunu dosyaların okunması için Excel'in kendisini kullanmak üzere kullanabilirsiniz , ancak bunun için Office'i yazılımınızın bağımlılığı olarak tanıtıyorsunuz, bu her zaman bir seçenek olmayabilir.


6
(1) pyxlreader mutlak çiçek hastalığıdır. Hiç denememiş olmalısın. Yorumlarıma buradan bakın: stackoverflow.com/questions/1243545/… (2) xlwtWriTes dosyaları; xlrdReaD dosyaları için kullanın .
John Machin

2

Eski XLS formatına ihtiyacınız varsa. Ansii 'cp1251' için aşağıdaki kod.

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

Ayrıca (python olmayan) xls2csv programını çalıştırmayı da düşünebilirsiniz. Bir xls dosyasıyla besleyin ve bir csv almalısınız.


3
Ama poster Python'u okuması gerektiğini söylüyor ... xls2csvÇalıştırmayı ve csvsonra Python'dan ayrıştırmayı mı öneriyorsunuz ?
hcarver

Python-excelerator, bir python dönüştürücü etrafında çalıştırılabilir bir py_xls2csv sarmalayıcı içerir.
fatal_error


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

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

CSV'yi dahili paketlerle yukarıdaki gibi mükemmel hale getirebilirsiniz. CSV, python sözlüğünün çalışmasıyla aynı şekilde çalışan yerleşik bir dikt okuyucu ve dikt yazar paketiyle işlenebilir. bu da bunu bir ton kolaylaştırıyor Şu anda excel için herhangi bir dahili paketin farkında değilim, ancak openpyxl ile karşılaştım. Aynı zamanda oldukça basit ve basitti Aşağıdaki kod parçacığını görebilirsiniz, bunun yardımcı olacağını umuyoruz

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

0

Daha eski .xlsdosyalar için kullanabilirsinizxlrd

ya xlrddoğrudan içe aktararak kullanabilirsiniz . Aşağıdaki gibi

import xlrd
wb = xlrd.open_workbook(file_name)

Ya da pandas pd.read_excel()yöntemini de kullanabilirsiniz , ancak motoru belirtmeyi unutmayın, varsayılan değer olsa xlrdda belirtilmesi gerekir.

pd.read_excel(file_name, engine = xlrd)

Her ikisi de eski .xlsdosya formatları için çalışır . Infact OpenPyXL, kullandığımda buna rastladım , aşağıdaki hatayı aldım

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.