1. ホーム
  2. python

[解決済み] PythonでExcelファイルを読み込む際、列名を指定して特定の列の値を取得するにはどうすればよいですか?

2023-03-04 21:37:30

質問

エクセルファイルがあります。

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 のインデックスがわかるので、どの値を取得する必要があるかがわかります。

しかし、これはあまり良い解決策ではありません。

どのように私はExcelファイルで名前を持つ特定の列の値を取得するのですか?

どのように解決するには?

これは一つの方法です。

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