পাইথনে এক্সেল ফাইলটি পড়ুন


88

আমি একটি এক্সেল ফাইল করেছি

Arm_id      DSPName        DSPCode          HubCode          PinCode    PPTL
1            JaVAS            01              AGR             282001    1,2
2            JaVAS            01              AGR             282002    3,4
3            JaVAS            01              AGR             282003    5,6

আমি ফর্মটিতে একটি স্ট্রিং সংরক্ষণ করতে চাই Arm_id,DSPCode,Pincode। এই ফর্ম্যাটটি কনফিগারযোগ্য, অর্থাৎ এটিতে পরিবর্তিত হতে পারে DSPCode,Arm_id,Pincode। আমি এটিকে একটি তালিকায় সংরক্ষণ করি:

FORMAT = ['Arm_id', 'DSPName', 'Pincode']

FORMATকনফিগারযোগ্য হিসাবে প্রদত্ত নামের সাথে একটি নির্দিষ্ট কলামের সামগ্রীটি কীভাবে পড়ব ?

এই আমি চেষ্টা করেছিলাম। বর্তমানে আমি ফাইলের সমস্ত বিষয়বস্তু পড়তে সক্ষম

from xlrd import open_workbook
wb = open_workbook('sample.xls')
for s in wb.sheets():
    #print 'Sheet:',s.name
    values = []
    for row in range(s.nrows):
        col_value = []
        for col in range(s.ncols):
            value  = (s.cell(row,col).value)
            try : value = str(int(value))
            except : pass
            col_value.append(value)
        values.append(col_value)
print values

আমার আউটপুট হয়

[[u'Arm_id', u'DSPName', u'DSPCode', u'HubCode', u'PinCode', u'PPTL'], ['1', u'JaVAS', '1', u'AGR', '282001', u'1,2'], ['2', u'JaVAS', '1', u'AGR', '282002', u'3,4'], ['3', u'JaVAS', '1', u'AGR', '282003', u'5,6']]

প্রায় তারপর আমি লুপ values[0]আউট খুঁজে বের করার চেষ্টা FORMATকরা বিষয়বস্তু values[0]সূচী পেয়ে এবং তারপর Arm_id, DSPname and Pincodeমধ্যে values[0]এবং তারপর পরবর্তী লুপ থেকে আমি সব সূচক জানি FORMATযার ফলে জানেন যে যা মান আমি পেতে প্রয়োজন পেয়ে কারণের।

তবে এটি এমন একটি দুর্বল সমাধান।

এক্সেল ফাইলে নাম সহ একটি নির্দিষ্ট কলামের মানগুলি কীভাবে পাব?


আপনার হয় একটি ব্যবহার করা উচিত dict()বা আপনার নিজের ডেটা ক্লাস তৈরি করা উচিত ।
তমসগল

যেভাবে? আপনি একটি নমুনা কোড প্রদান করতে পারেন?
পাইথন এন্থুসিস্ট

উত্তর:


70

এটি একটি পদ্ধতির:

from xlrd import open_workbook

class Arm(object):
    def __init__(self, id, dsp_name, dsp_code, hub_code, pin_code, pptl):
        self.id = id
        self.dsp_name = dsp_name
        self.dsp_code = dsp_code
        self.hub_code = hub_code
        self.pin_code = pin_code
        self.pptl = pptl

    def __str__(self):
        return("Arm object:\n"
               "  Arm_id = {0}\n"
               "  DSPName = {1}\n"
               "  DSPCode = {2}\n"
               "  HubCode = {3}\n"
               "  PinCode = {4} \n"
               "  PPTL = {5}"
               .format(self.id, self.dsp_name, self.dsp_code,
                       self.hub_code, self.pin_code, self.pptl))

wb = open_workbook('sample.xls')
for sheet in wb.sheets():
    number_of_rows = sheet.nrows
    number_of_columns = sheet.ncols

    items = []

    rows = []
    for row in range(1, number_of_rows):
        values = []
        for col in range(number_of_columns):
            value  = (sheet.cell(row,col).value)
            try:
                value = str(int(value))
            except ValueError:
                pass
            finally:
                values.append(value)
        item = Arm(*values)
        items.append(item)

for item in items:
    print item
    print("Accessing one single value (eg. DSPName): {0}".format(item.dsp_name))
    print

আপনি একটি কাস্টম ক্লাস ব্যবহার করতে হবে না, আপনি কেবল একটি নিতে পারেন dict()। তবে আপনি যদি কোনও ক্লাস ব্যবহার করেন তবে উপরের মতো আপনি ডট-নোটেশনের মাধ্যমে সমস্ত মান অ্যাক্সেস করতে পারবেন।

এখানে উপরের স্ক্রিপ্টটির আউটপুট দেওয়া হল:

Arm object:
  Arm_id = 1
  DSPName = JaVAS
  DSPCode = 1
  HubCode = AGR
  PinCode = 282001 
  PPTL = 1
Accessing one single value (eg. DSPName): JaVAS

Arm object:
  Arm_id = 2
  DSPName = JaVAS
  DSPCode = 1
  HubCode = AGR
  PinCode = 282002 
  PPTL = 3
Accessing one single value (eg. DSPName): JaVAS

Arm object:
  Arm_id = 3
  DSPName = JaVAS
  DSPCode = 1
  HubCode = AGR
  PinCode = 282003 
  PPTL = 5
Accessing one single value (eg. DSPName): JaVAS

90

কিছুটা দেরি করা উত্তর, তবে পান্ডাস সহ একটি এক্সেল ফাইলের সরাসরি কলাম পাওয়া সম্ভব:

import pandas

df = pandas.read_excel('sample.xls')
#print the column names
print df.columns
#get the values for a given column
values = df['Arm_id'].values
#get a data frame with selected columns
FORMAT = ['Arm_id', 'DSPName', 'Pincode']
df_selected = df[FORMAT]

আপনি xlrd এবং পান্ডা ইনস্টল করেছেন তা নিশ্চিত করুন:

pip install pandas xlrd

4
import xlrdএই কাজটি করতে শীর্ষে যুক্ত করুন । read_excelপ্রয়োজন xlrd। যদি পাওয়া যায় ImportError: No module named 'xlrd', তবে করুনpip install xlrd
নিশান্ত

9
এক্সএলআরডি আমদানি করার প্রয়োজন হয় না, কেবল এক্সএলআরড ইনস্টল করা আছে কিনা তা নিশ্চিত করুন, পান্ডাস আমদানি করবেন এবং এটি ব্যবহার করবেন।
বৈভব বিশাল

12

সুতরাং মূল অংশ col_names = s.row(0)হ'ল হেডারটি ধরে নেওয়া ( ) এবং সারিগুলির মধ্য দিয়ে পুনরাবৃত্তি করার সময়, প্রথম সারিতে যা প্রয়োজন নেই তা এড়িয়ে চলুন for row in range(1, s.nrows)- 1 থেকে রেঞ্জ ব্যবহার করে সম্পন্ন করুন (অন্তর্ভুক্ত 0 নয়)। তারপরে আপনি কলামটির শিরোনাম হিসাবে 'নাম' ধারণ করে সারিগুলিতে প্রবেশ করতে জিপটি ব্যবহার করেন।

from xlrd import open_workbook

wb = open_workbook('Book2.xls')
values = []
for s in wb.sheets():
    #print 'Sheet:',s.name
    for row in range(1, s.nrows):
        col_names = s.row(0)
        col_value = []
        for name, col in zip(col_names, range(s.ncols)):
            value  = (s.cell(row,col).value)
            try : value = str(int(value))
            except : pass
            col_value.append((name.value, value))
        values.append(col_value)
print values

7

পান্ডাস ব্যবহার করে আমরা সহজেই এক্সেল পড়তে পারি।

import pandas as pd 
from pandas import ExcelWriter
from pandas import ExcelFile 

DataF=pd.read_excel("Test.xlsx",sheet_name='Sheet1')

print("Column headings:")
print(DataF.columns)

পরীক্ষার সময়: https://repl.it রেফারেন্স: https://pythonspot.com/read-excel-with-pandas/


4
আপনি কেন আমদানি করছেন xlrd?
এনাফরি

2

একটি এক্সেল ফাইলটি পড়তে এবং কলাম 1 এ উপস্থিত সমস্ত কক্ষ মুদ্রণের জন্য এখানে কোড (প্রথম সেলটি অর্থাৎ শিরোনাম ব্যতীত):

import xlrd

file_location="C:\pythonprog\xxx.xlsv"
workbook=xlrd.open_workbook(file_location)
sheet=workbook.sheet_by_index(0)
print(sheet.cell_value(0,0))

for row in range(1,sheet.nrows):
     print(sheet.cell_value(row,0))

1

আমি যে পদ্ধতিটি গ্রহণ করেছি তাতে আগ্রহের কলামগুলির সূচীগুলি নির্ধারণ করতে প্রথম সারির শিরোনামের তথ্য পড়ে reads

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

আউটপুট কলামের আদেশটি ফরমেট তালিকার কলামের নামের ক্রম দ্বারা নির্ধারিত হয়।

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

from xlrd import open_workbook
wb = open_workbook('sample.xls')

FORMAT = ['Arm_id', 'DSPName', 'PinCode']
values = ""

for s in wb.sheets():
    headerRow = s.row(0)
    columnIndex = [x for y in FORMAT for x in range(len(headerRow)) if y == firstRow[x].value]
    formatString = ("%s,"*len(columnIndex))[0:-1] + "\n"

    for row in range(1,s.nrows):
        currentRow = s.row(row)
        currentRowValues = [currentRow[x].value for x in columnIndex]
        values += formatString % tuple(currentRowValues)

print values

এই কোড আউটপুটগুলির উপরে আপনি যে নমুনা ইনপুট দিয়েছেন সেটির জন্য:

>>> 1.0,JaVAS,282001.0
2.0,JaVAS,282002.0
3.0,JaVAS,282003.0

এবং যেহেতু আমি একটি অজগর নুব, সেগুলি হ'ল: এই উত্তর , এই উত্তর , এই প্রশ্ন , এই প্রশ্ন এবং এই উত্তর


আমার মনে firstRow[x].valueহয়headerRow[x].value
টিএসমির

0

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

from xlrd import open_workbook
from collections import namedtuple
from pprint import pprint

wb = open_workbook('sample.xls')

FORMAT = ['Arm_id', 'DSPName', 'PinCode']
OneRow = namedtuple('OneRow', ' '.join(FORMAT))
all_rows = []

for s in wb.sheets():
    headerRow = s.row(0)
    columnIndex = [x for y in FORMAT for x in range(len(headerRow)) if y == headerRow[x].value]

    for row in range(1,s.nrows):
        currentRow = s.row(row)
        currentRowValues = [currentRow[x].value for x in columnIndex]
        all_rows.append(OneRow(*currentRowValues))

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