পাইথন সহ এক্সেল (এক্সএলএস) ফাইলগুলি পড়া / পার্সিং করা


117

পাইথন ( সিএসভি ফাইল নয়) সহ এক্সেল (এক্সএলএস) ফাইলগুলি পড়ার সর্বোত্তম উপায় কী ।

পাইথনে এই কাজটি করার জন্য ডিফল্টরূপে সমর্থিত কোনও অন্তর্নির্মিত প্যাকেজ রয়েছে কি?



18
@ যাত্রী: তিনি ফাইলগুলি না লিখে পড়তে চান
জন মাচিন

উত্তর:


91

আমি ফাইলগুলি পড়ার জন্য এক্সএলআরডিকে অত্যন্ত সুপারিশ করি .xls

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

আপডেট: নতুন .xlsxফাইলগুলির জন্য, পড়ার এবং লেখার জন্য প্রস্তাবিত গ্রন্থাগারটি ওপেনপেক্সএল বলে মনে হচ্ছে (ধন্যবাদ, ইকার পোহোরস্কে)।


5
এক্সেল 2007+ ফাইলগুলির জন্য ( .xlsx) আপনি সম্ভবত ওপেনপাইএক্সএল ব্যবহার করবেন
ইকার পোহোর্স্কি

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 ইনস্টল করতে হবে
কংগ্রেসবঙ্গাস

25

আপনি এগুলির যে কোনও একটি চয়ন করতে পারেন http://www.python-excel.org/
আমি পাইথন এক্সএলআরডি গ্রন্থাগারটি সুপারিশ করব।

এটি ব্যবহার করে ইনস্টল করুন

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    

"পঠন ঘর মান" কাজ করে না ... এটি একটি টাইপরর উত্থাপন করে: 'শীট' অবজেক্ট কলযোগ্য নয়। বাকী সবাই দুর্দান্ত কাজ করেছে।
নিউবিয়েলপ

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))

পিএস আপনার কাজ করতে ফাংশনের জন্য xlrdইনস্টল থাকা দরকারread_excel

21-03-2020 আপডেট করুন: আপনি এখানে দেখতে পাচ্ছেন , xlrdইঞ্জিন নিয়ে সমস্যা রয়েছে এবং এটি অবচয় করা হতে চলেছে। openpyxlসেরা প্রতিস্থাপন। এখানে বর্ণিত হিসাবে , প্রমিত বাক্য গঠনটি হওয়া উচিত:

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

অ্যাট্রিবিউটআরার: 'ডিক' অবজেক্টটির কোনও 'হেড' নেই
লোপেজডেপ

4

এক্সএলএক্সএক্সের জন্য আমি https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-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

আপনি এখানে তালিকাভুক্ত যে কোনও লাইব্রেরি ব্যবহার করতে পারেন (যেমন পেক্সল্রেডার যা জেক্সেলএপি বা xlwt এর উপর ভিত্তি করে ), পাশাপাশি COM অটোমেশন নিজেই ফাইলগুলি পড়ার জন্য ব্যবহার করতে পারেন তবে তার জন্য আপনি অফিসটিকে আপনার সফ্টওয়্যারটির নির্ভরতা হিসাবে চালু করছেন, যা সর্বদা একটি বিকল্প হতে পারে না।


6
(1) পাইক্ল্রেডার হ'ল পরম পক্স। আপনি অবশ্যই এটি চেষ্টা করেন নি। : এখানে আমার মন্তব্য দেখুন stackoverflow.com/questions/1243545/... (2) xlwtলিখেছেন ফাইল; xlrdরিড ফাইল ব্যবহার করুন ।
জন মাচিন

2

আপনার যদি পুরানো এক্সএলএস ফর্ম্যাট প্রয়োজন। 'সিপি 1251' আনসির জন্য নীচে কোড।

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 চালানোর বিষয়েও বিবেচনা করতে পারেন। এটি একটি এক্সএলএস ফাইল খাওয়ান, এবং আপনার একটি সিএসভি ফিরে পাওয়া উচিত।


3
তবে পোস্টারটিতে বলা হয়েছে যে তাকে পাইথনটি পড়তে হবে ... আপনি কি দৌড়ানোর পরামর্শ দিচ্ছেন xls2csv, তারপর csvপাইথন থেকে পার্সিং করছেন ?
hcarver

পাইথন-এক্সেলেসেটরে পাইথন কনভার্টারের চারপাশে একটি এক্সিকিউটেবল py_xls2csv মোড়ক রয়েছে।
মারাত্মক_অরর


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

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

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

    import openpyxl
    book = openpyxl.load_workbook(filename)
    sheet = book.active 
    result =sheet['AP2']
    print(result.value)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.