पाइथन के साथ एक्सेल (xls) फ़ाइलों को पढ़ना / पार्स करना


117

पायथन ( CSV फ़ाइलें नहीं) के साथ एक्सेल (XLS) फ़ाइलों को पढ़ने का सबसे अच्छा तरीका क्या है ।

क्या कोई अंतर्निहित पैकेज है जो इस कार्य को करने के लिए पायथन में डिफ़ॉल्ट रूप से समर्थित है?



18
@voyager: वह उन फाइलों को नहीं लिखना चाहता है
जॉन मैकिन

जवाबों:


91

मैं फ़ाइलों को पढ़ने के लिए अत्यधिक सलाह देता हूं.xls

voyager ने COM स्वचालन के उपयोग का उल्लेख किया है। कुछ साल पहले खुद ऐसा करने के बाद, चेतावनी दी जाती है कि ऐसा करना एक वास्तविक PITA है। कैविट्स की संख्या बहुत बड़ी है और प्रलेखन में कमी और कष्टप्रद है। मैं कई अजीब कीड़े और गोच में भाग गया, जिनमें से कुछ को पता लगाने में कई घंटे लग गए।

अद्यतन: नई .xlsxफ़ाइलों के लिए, पढ़ने और लिखने के लिए अनुशंसित लाइब्रेरी ओपनपीक्सल प्रतीत होती है (धन्यवाद, इकर पोहोरस्की)।


5
Excel 2007+ फ़ाइलों ( .xlsx) के लिए आप शायद OpenPyXL का उपयोग करेंगे
इकर पोहोरस्की

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/
मैं अजगर 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    

"रीड सेल वैल्यू" काम नहीं करता है ... यह एक टाइप-ए उठाता है: 'शीट' ऑब्जेक्ट कॉल करने योग्य नहीं है। बाकी के सभी ने बहुत अच्छा काम किया।
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))

PS आपको कार्य करने के xlrdलिए read_excelफ़ंक्शन को स्थापित करने की आवश्यकता है

21-03-2020 अपडेट करें: जैसा कि आप यहां देख सकते हैं , xlrdइंजन के साथ समस्याएं हैं और यह अपग्रेड होने जा रहा है। openpyxlसबसे अच्छा प्रतिस्थापन है। तो यहाँ वर्णित है , विहित वाक्यविन्यास होना चाहिए:

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

गुण: 'तानाशाह' वस्तु में कोई विशेषता नहीं 'सिर' है
लोपेज़डैप

4

Xlsx के लिए मुझे पहले दिए गए समाधान पसंद हैं जैसे कि https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-use-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

जोड़े गए सुधार शीट नाम से सामग्री ला रहे हैं, कॉलम प्राप्त करने के लिए फिर से उपयोग कर रहे हैं और साझाकरण का उपयोग किया जाता है।

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

मेरे उत्तर को पुनर्जीवित करने के लिए धन्यवाद!
कोलिन एंडरसन

2

आप यहां सूचीबद्ध किसी भी लाइब्रेरी का उपयोग कर सकते हैं (जैसे कि Pyxlreader जो कि JExcelApi, या xlwt पर आधारित है ), प्लस COM स्वचालन फ़ाइलों के पढ़ने के लिए स्वयं एक्सेल का उपयोग करने के लिए , लेकिन इसके लिए आप अपने सॉफ़्टवेयर की निर्भरता के रूप में Office का परिचय दे रहे हैं, जो हमेशा एक विकल्प नहीं हो सकता है।


6
(1) pyxlreader पूर्ण चेचक है। आपने कभी इसे आजमाया नहीं होगा। मेरी टिप्पणियाँ यहाँ देखें: stackoverflow.com/questions/1243545/… (2) xlwtWriTes फाइलें; xlrdReaD फ़ाइलों का उपयोग करें।
जॉन मैकिन

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

आप (गैर-अजगर) प्रोग्राम xls2csv चलाने पर भी विचार कर सकते हैं। इसे एक xls फ़ाइल फ़ीड करें, और आपको एक सीएसवी वापस प्राप्त करना चाहिए।


3
लेकिन पोस्टर कहता है कि उसे पायथन में पढ़ने की ज़रूरत है ... क्या आप चलाने का सुझाव दे रहे हैं xls2csv, फिर csvपायथन से?
hcarver

अजगर-एक्सेलरेटर में एक अजगर के चारों ओर एक निष्पादन योग्य py_xls2csv आवरण होता है।
fatal_error


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

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

आप इनबिल्ट पैकेज के साथ ऊपर की तरह एक्सेल को CSV चालू कर सकते हैं। CSV को तानाशाह और तानाशाह के एक इनबिल्ट पैकेज के साथ संभाला जा सकता है जो उसी तरह काम करेगा जैसे अजगर शब्दकोश काम करता है। जो इसे एक टन आसान बनाता है मैं वर्तमान में एक्सेल के लिए किसी भी इनबिल्ट पैकेज से अनजान हूं लेकिन मैं ओपनपीक्सएल में आया था। यह भी बहुत सीधे आगे और सरल था आप नीचे कोड स्निपेट देख सकते हैं आशा है कि यह मदद करता है

    import openpyxl
    book = openpyxl.load_workbook(filename)
    sheet = book.active 
    result =sheet['AP2']
    print(result.value)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.