পান্ডাস: একটি এক্সেল ফাইলে শীটের তালিকাটি অনুসন্ধান করা হচ্ছে


142

পান্ডাসের নতুন সংস্করণটি এক্সেল ফাইলগুলি লোড করতে নিম্নলিখিত ইন্টারফেসটি ব্যবহার করে :

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

তবে আমি যদি উপলব্ধ চাদরগুলি না জানি?

উদাহরণস্বরূপ, আমি এক্সেল ফাইলগুলির সাথে কাজ করছি যা নিম্নলিখিত শিটগুলি

ডেটা 1, ডেটা 2 ..., ডেটা এন, ফু, বার

তবে আমি Nকোন প্রাইরি জানি না

পান্ডাসে কোনও এক্সেল ডকুমেন্ট থেকে শীটের তালিকা পাওয়ার কোনও উপায় আছে কি?

উত্তর:


251

আপনি এখনও এক্সফিল ক্লাস (এবং 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
ধন্যবাদ অ্যান্ডি আমি জিজ্ঞাসা করতে পারি, পান্ডারা কি এক্সেল শীটটি লোড করে ExcelFile? এছাড়াও, বলুন যে আমি শীটগুলির তালিকাটি অনুসন্ধান করেছি এবং সেগুলির মধ্যে এন লোড করার সিদ্ধান্ত নিয়েছি, আমি কি read_excelপ্রতিটি পাতের জন্য সেই মুহুর্তে কল (নতুন ইন্টারফেস) করব, বা আটকে থাকব x1.parse?
অ্যামিলিও ওয়াজকেজ-রেইনা

2
আমি মনে করি এক্সেলফাইল ফাইলটি উন্মুক্ত রাখে (এবং এটি সব পড়ে না), আমি মনে করি পার্স ব্যবহার করে (এবং কেবলমাত্র একবার ফাইলটি খোলার জন্য) এখানে সর্বাধিক অর্থবোধ করে। টিবিএইচ পড়ার এক্সেলটি মিস করলাম!
অ্যান্ডি হেডেন

6
এখানে আগে উল্লেখ করা হয়েছে , তবে আমি ডেটা ফ্রেমগুলির অভিধান ব্যবহার করে রাখতে চাই{sheet_name: xl.parse(sheet_name) for sheet_name in xl.sheet_names}
অ্যান্ডি হেডেন

2
আশা করি আমি আপনাকে আরও বেশি কিছু দিতে পারতাম, এটি পান্ডার একাধিক সংস্করণ জুড়েও কাজ করে! (তারা কেন এতবার
এজেকিয়েল ক্রাগলিক

3
@ নিকোলাসলু ডাউনওয়েট অপ্রয়োজনীয় ছিল, এই উত্তরটি ২০১৩ সাল থেকে! এটি বলেছিল যে, এক্সেলফাইল হ'ল এক্সেল ফাইলগুলি পার্স করার আসল উপায় এটি হ্রাস করা হয়নি এবং এটি করার জন্য এটি একটি পুরোপুরি বৈধ উপায়।
অ্যান্ডি হেডেন

37

আপনার স্পষ্টভাবে দ্বিতীয় প্যারামিটারটি (শিটনাম) কোনও হিসাবেই নির্দিষ্ট করা উচিত। এটার মত:

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

"ডিএফ" হ'ল ডেটা ফ্রেমগুলির অভিধান হিসাবে সমস্ত শীট, আপনি এটি চালিয়ে যাচাই করতে পারেন:

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
এটি অকারণে প্রতিটি শীটকে ডেটা ফ্রেম হিসাবে পার্স করে, যা প্রয়োজন হয় না। "একটি এক্সএলএস / এক্সএলএসএক্স ফাইল কীভাবে পড়বেন" এটি একটি আলাদা প্রশ্ন
অ্যান্ডি হেডেন

7
অ্যান্ডি হাইডেন এটি দক্ষ নাও হতে পারে তবে আপনি যদি সমস্ত শিটের যত্ন নেন বা অতিরিক্ত ওভারহেডের যত্ন না রাখেন তবে এটি সেরা হতে পারে।
কোডমনকি

8

@ ডাইভিংটোবির উত্তরটি দ্বারা অনুপ্রাণিত হয়ে আমি এটি সবচেয়ে দ্রুততম পথ খুঁজে পেয়েছি। এক্সআরআরডি, ওপেনপেক্সএক্সএল বা পান্ডাসের উপর ভিত্তি করে সমস্ত উত্তর আমার জন্য ধীরে ধীরে, কারণ এগুলি প্রথমে পুরো ফাইলটি লোড করে।

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

@ ধওয়ানিল_শাহর উত্তরে বিল্ডিং করা, আপনাকে পুরো ফাইলটি বের করার দরকার নেই। 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 একটি সম্পূর্ণ আলাদা ফাইল ফর্ম্যাট, সুতরাং আমি এই কোডটি কাজ করার আশা করবো না।
ডাইভিংটবি

2

আমি xlrd, পান্ডা, ওপেনপেক্সএল এবং এই জাতীয় অন্যান্য লাইব্রেরি চেষ্টা করেছি এবং পুরো ফাইলটি পড়ার সাথে সাথে ফাইলগুলির আকার বাড়ার সাথে তাদের সকলেরই তাত্পর্যপূর্ণ সময় লাগবে। উপরে উল্লিখিত অন্যান্য সমাধানগুলি যেখানে তারা 'অন_ডেম্যান্ড' ব্যবহার করেছিল তা আমার পক্ষে কার্যকর হয়নি। আপনি যদি প্রথমে শীটের নাম পেতে চান তবে নিম্নলিখিত ফাংশনটি এক্সএলএসএক্স ফাইলগুলির জন্য কাজ করে।

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

যেহেতু সমস্ত এক্সএলএক্সএক্স মূলত জিপ করা ফাইল, তাই আমরা অন্তর্নিহিত এক্সএমএল ডেটা বের করি এবং সরাসরি ওয়ার্কবুক থেকে শীটের নামগুলি পড়ি যা লাইব্রেরির ক্রিয়াকলাপের তুলনায় এক সেকেন্ডের একটি অংশ গ্রহণ করে।

বেঞ্চমার্কিং: (4
শীটযুক্ত 6 এমবি এক্সএলএক্সএক্স ফাইলটিতে ) পান্ডা, এক্সএলআরডি: 12 সেকেন্ড
ওপেনপেক্সএল: 24 সেকেন্ড
প্রস্তাবিত পদ্ধতি: 0.4 সেকেন্ড

যেহেতু আমার প্রয়োজনীয়তা কেবল শীটের নামগুলি পড়ছিল, পুরো সময়টি পড়ার অপ্রয়োজনীয় ওভারহেড আমাকে বগল করছে তাই আমি পরিবর্তে এই রুটটি নিয়েছি।


আপনি ব্যবহার করছেন মডিউলগুলি কি?
ড্যানিয়েল

@ ড্যানিয়েল আমি কেবল এটিই ব্যবহার করেছি zipfileযা একটি অন্তর্নির্মিত মডিউল এবং xmltodictযা এক্সএমএলকে সহজেই পুনরাবৃত্তিযোগ্য অভিধানে রূপান্তর করতে ব্যবহার করি। যদিও আপনি নীচে @ ডাইভিংটোবির উত্তরটি দেখতে পারেন যেখানে আপনি একই ফাইলটি ভিতরে থাকা ফাইলগুলি না বের করেই পড়তে পারেন।
ধওয়ানিল শাহ

যখন আমি ওপেনপেক্সেলটি কেবলমাত্র পঠনের জন্য পতাকা ব্যবহার করে চেষ্টা করেছি তখন তা উল্লেখযোগ্যভাবে দ্রুত হয় (আমার 5 এমবি ফাইলের জন্য 200 এক্স দ্রুত)। load_workbook(excel_file).sheetnamesগড় গড়ে 8.24 এস যেখানে 39.6 মিমি load_workbook(excel_file, read_only=True).sheetnamesগড়ে।
flutefreak7

0
from openpyxl import load_workbook

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

5MB এক্সেল ফাইলের জন্য আমি কাজ করছি, পতাকা load_workbookছাড়াই read_only8.24 সেকেন্ড নিয়েছে। সঙ্গে read_onlyসেটির উপরে ফ্ল্যাগ লাগাতে শুধুমাত্র 39.6 MS নেন। আপনি যদি এখনও কোনও এক্সেল লাইব্রেরি ব্যবহার করতে চান এবং কোনও এক্সএমএল সমাধানে না ফেলে থাকেন তবে এটি পুরো ফাইলটি বিশ্লেষণকারী পদ্ধতিগুলির চেয়ে অনেক দ্রুত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.