पंडों: एक्सेल फाइल में शीट की सूची देखना


144

पांडों का नया संस्करण Excel फ़ाइलों को लोड करने के लिए निम्न इंटरफ़ेस का उपयोग करता है :

read_excel('path_to_file.xls', 'Sheet1', index_col=None, na_values=['NA'])

लेकिन क्या होगा अगर मुझे पता नहीं है कि चादरें उपलब्ध हैं?

उदाहरण के लिए, मैं एक्सेल फाइलों के साथ काम कर रहा हूं जो निम्नलिखित पत्रक हैं

डेटा 1, डेटा 2 ..., डेटा एन, फू, बार

लेकिन मैं Nएक प्राथमिकता नहीं जानता ।

पंडों में एक एक्सेल दस्तावेज़ से शीट की सूची प्राप्त करने का कोई तरीका है?

जवाबों:


253

आप अभी भी ExcelFile वर्ग (और sheet_namesविशेषता) का उपयोग कर सकते हैं :

xl = pd.ExcelFile('foo.xls')

xl.sheet_names  # see all sheet names

xl.parse(sheet_name)  # read a specific sheet to DataFrame

अधिक विकल्पों के लिए पार्स के लिए डॉक्स देखें ...


1
धन्यवाद @Andy क्या मैं पूछ सकता हूं कि क्या पंडाल एक्सेल शीट में लोड करता है ExcelFile? यह भी कहें कि मैं चादरों की सूची देखता हूं और उनमें से एन को लोड करने का फैसला करता हूं, क्या मुझे read_excelप्रत्येक शीट के लिए उस बिंदु पर कॉल (नया इंटरफ़ेस) करना चाहिए या छड़ी करनी चाहिए x1.parse?
अमिलियो वाज़केज़-रीना

2
मुझे लगता है कि ExcelFile फ़ाइल को खुला रखता है (और यह सब नहीं पढ़ता है), मुझे लगता है कि पार्स का उपयोग करना (और केवल एक बार फाइल खोलना) यहां सबसे अधिक समझ में आता है। tbh मैं read_excel के आगमन से चूक गया!
एंडी हेडन

6
यहाँ से पहले उल्लेख किया है , लेकिन मैं DataFrames का एक शब्दकोष का उपयोग करना पसंद करता हूं{sheet_name: xl.parse(sheet_name) for sheet_name in xl.sheet_names}
एंडी हेडन

2
काश मैं तुम्हें और अधिक upvotes दे सकता, यह पंडों के कई संस्करणों में भी काम करता है! (पता नहीं क्यों वे एपीआई को इतनी बार बदलना पसंद करते हैं) मुझे पार्स फ़ंक्शन पर इंगित करने के लिए धन्यवाद, यहां वर्तमान लिंक हालांकि है: pandas.pydata.org/pandas-docs/stable/generated/…
एज़िल क्रुगलिक

3
@ नीचोलस डाउन डाउन अनावश्यक था, यह उत्तर 2013 से है! एक्सेलफाइल एक्सेल फ़ाइलों को पार्स करने का मूल तरीका है, यह कहा गया है कि यह पदावनत नहीं है और ऐसा करने के लिए पूरी तरह से वैध तरीका है।
एंडी हेडन

37

आपको स्पष्ट रूप से दूसरे पैरामीटर (शीटनाम) को किसी के रूप में निर्दिष्ट नहीं करना चाहिए। इस तरह:

 df = pandas.read_excel("/yourPath/FileName.xlsx", None);

"df" सभी शीट डेटाफ्रैम के शब्दकोश के रूप में हैं, आप इसे चलाकर इसे सत्यापित कर सकते हैं:

df.keys()

परिणाम इस तरह:

[u'201610', u'201601', u'201701', u'201702', u'201703', u'201704', u'201705', u'201706', u'201612', u'fund', u'201603', u'201602', u'201605', u'201607', u'201606', u'201608', u'201512', u'201611', u'201604']

कृपया अधिक जानकारी के लिए पांडा डॉक देखें: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_excel.html


3
यह अनावश्यक रूप से हर शीट को डाटाफ्रेम के रूप में पार्स करता है, जिसकी आवश्यकता नहीं है। "एक xls / xlsx फ़ाइल को कैसे पढ़ें" एक अलग सवाल है
एंडी हेडन

7
@AndyHayden यह कुशल नहीं हो सकता है, लेकिन यह सबसे अच्छा हो सकता है यदि आप सभी शीट्स की परवाह करते हैं, या आप अतिरिक्त ओवरहेड के बारे में परवाह नहीं करते हैं।
कोडमोनी

8

यह सबसे तेज तरीका है जो मैंने @ divingTobi के उत्तर से प्रेरित पाया है। Xlrd, openpyxl या पांडा पर आधारित सभी उत्तर मेरे लिए धीमे हैं, क्योंकि वे सभी पहले पूरी फ़ाइल लोड करते हैं।

from zipfile import ZipFile
from bs4 import BeautifulSoup  # you also need to install "lxml" for the XML parser

with ZipFile(file) as zipped_file:
    summary = zipped_file.open(r'xl/workbook.xml').read()
soup = BeautifulSoup(summary, "xml")
sheets = [sheet.get("name") for sheet in soup.find_all("sheet")]

3

@Dhwanil_shah के उत्तर पर बिल्डिंग, आपको पूरी फ़ाइल निकालने की आवश्यकता नहीं है। इसके साथ zf.openएक ज़िपित फ़ाइल से सीधे पढ़ना संभव है।

import xml.etree.ElementTree as ET
import zipfile

def xlsxSheets(f):
    zf = zipfile.ZipFile(f)

    f = zf.open(r'xl/workbook.xml')

    l = f.readline()
    l = f.readline()
    root = ET.fromstring(l)
    sheets=[]
    for c in root.findall('{http://schemas.openxmlformats.org/spreadsheetml/2006/main}sheets/*'):
        sheets.append(c.attrib['name'])
    return sheets

दो लगातार readlineएस बदसूरत हैं, लेकिन सामग्री केवल पाठ की दूसरी पंक्ति में है। संपूर्ण फ़ाइल को पार्स करने की आवश्यकता नहीं है।

यह समाधान read_excelसंस्करण की तुलना में बहुत तेज प्रतीत होता है , और पूर्ण निकालने वाले संस्करण की तुलना में सबसे अधिक संभावना है।


नहीं, .xls एक पूरी तरह से अलग फ़ाइल स्वरूप है, इसलिए मुझे इस कोड के काम करने की उम्मीद नहीं होगी।
divingTobi

2

मैंने xlrd, pandas, openpyxl और ऐसी अन्य लाइब्रेरीज़ को आज़माया है और ये सभी घातीय समय लेती हैं क्योंकि फ़ाइल का आकार बढ़ने पर यह पूरी फ़ाइल को पढ़ता है। ऊपर वर्णित अन्य समाधान जहां उन्होंने 'on_demand' का उपयोग किया, मेरे लिए काम नहीं किया। यदि आप प्रारंभ में केवल शीट नाम प्राप्त करना चाहते हैं, तो निम्न फ़ंक्शन xlsx फ़ाइलों के लिए काम करता है।

def get_sheet_details(file_path):
    sheets = []
    file_name = os.path.splitext(os.path.split(file_path)[-1])[0]
    # Make a temporary directory with the file name
    directory_to_extract_to = os.path.join(settings.MEDIA_ROOT, file_name)
    os.mkdir(directory_to_extract_to)

    # Extract the xlsx file as it is just a zip file
    zip_ref = zipfile.ZipFile(file_path, 'r')
    zip_ref.extractall(directory_to_extract_to)
    zip_ref.close()

    # Open the workbook.xml which is very light and only has meta data, get sheets from it
    path_to_workbook = os.path.join(directory_to_extract_to, 'xl', 'workbook.xml')
    with open(path_to_workbook, 'r') as f:
        xml = f.read()
        dictionary = xmltodict.parse(xml)
        for sheet in dictionary['workbook']['sheets']['sheet']:
            sheet_details = {
                'id': sheet['@sheetId'],
                'name': sheet['@name']
            }
            sheets.append(sheet_details)

    # Delete the extracted files directory
    shutil.rmtree(directory_to_extract_to)
    return sheets

चूंकि सभी xlsx मूल रूप से ज़िपित फ़ाइलें हैं, हम अंतर्निहित xml डेटा को निकालते हैं और कार्यपुस्तिका से सीधे शीट नामों को पढ़ते हैं जो लाइब्रेरी फ़ंक्शन की तुलना में एक सेकंड का एक अंश लेता है।

बेंचमार्किंग: (4 शीटों के साथ 6mb xlsx फ़ाइल पर)
पंडों, xlrd: 12 सेकंड में
ओपनपीएक्सएल: 24 सेकंड
प्रस्तावित विधि: 0.4 सेकंड

चूँकि मेरी आवश्यकता सिर्फ शीट के नामों को पढ़ने की थी, इसलिए पूरे समय पढ़ने का अनावश्यक ओवरहेड मुझे परेशान कर रहा था इसलिए मैंने इस मार्ग को छोड़ दिया।


आपके द्वारा उपयोग किए जा रहे मॉड्यूल क्या हैं?
डेनियल

@ डैनियल मैंने केवल उपयोग किया है zipfileजो एक इन-बिल्ट मॉड्यूल है और xmltodictजिसका उपयोग मैंने एक्सएमएल को आसानी से चलने योग्य शब्दकोश में बदलने के लिए किया है। यद्यपि आप नीचे दिए गए @ divingTobi के उत्तर को देख सकते हैं जहां आप वास्तव में फ़ाइलों को निकाले बिना उसी फ़ाइल को पढ़ सकते हैं।
धवनिल

जब मैंने read_only झंडे के साथ Openpyxl की कोशिश की तो यह काफी तेज है (मेरी 5 एमबी फ़ाइल के लिए 200X तेज़)। load_workbook(excel_file).sheetnamesऔसत aver.२४ है जहां load_workbook(excel_file, read_only=True).sheetnamesऔसतन ३ ९ .६ किलोमीटर है।
फ्लूटफ्रीक 7

0
from openpyxl import load_workbook

sheets = load_workbook(excel_file, read_only=True).sheetnames

एक 5MB Excel फ़ाइल के लिए मैं के साथ काम कर रहा हूँ, load_workbookबिनाread_only फ्लैग के 8.24s लिया। read_onlyझंडे के साथ केवल 39.6 एमएस लिया। यदि आप अभी भी एक्सेल लाइब्रेरी का उपयोग करना चाहते हैं और एक्सएमएल समाधान नहीं छोड़ना चाहते हैं, तो यह उन विधियों की तुलना में बहुत तेज है जो पूरी फाइल को पार्स करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.