PythonでExcelファイルを読む


88

私はExcelファイルを持っています

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ファイルで名前の付いた特定の列の値を取得するにはどうすればよいですか?


を使用するdict()か、独自のデータクラスを作成する必要があります。
tamasgal 2014年

どのように?サンプルコードを教えていただけますか?
PythonEnthusiast 2014年

回答:


70

これは1つのアプローチです。

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

やや遅い答えですが、パンダを使用すると、Excelファイルの列を直接取得することができます。

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とpandasがインストールされていることを確認してください。

pip install pandas xlrd

2
import xlrdこれを機能させるには、上部に追加します。read_excelが必要xlrdです。取得する場合はImportError: No module named 'xlrd'、実行しますpip install xlrd
nishant 2017

9
xlrdをインポートする必要はありません。xlrdがインストールされていることを確認してください。パンダはそれをインポートして使用します。
Vaibhav Vishal 2018年

12

したがって、重要な部分は、ヘッダー(col_names = s.row(0))を取得し、行を反復処理するときに、不要な最初の行をスキップすることです。これはfor row in range(1, s.nrows)、(暗黙の0ではなく)1以降の範囲を使用して行われます。次に、zipを使用して、「name」を列のヘッダーとして保持している行をステップスルーします。

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


2

Excelファイルを読み取り、列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

私が採用したアプローチでは、最初の行からヘッダー情報を読み取り、対象の列のインデックスを決定します。

質問で、値も文字列に出力する必要があるとおっしゃいました。FORMAT列リストからの出力用のフォーマット文字列を動的に作成します。行は、改行文字で区切られた値文字列に追加されます。

出力列の順序は、FORMATリスト内の列名の順序によって決まります。

以下の私のコードでは、FORMATリストの列名の大文字と小文字が重要です。上記の質問では、FORMATリストに「Pincode」がありますが、Excelには「PinCode」があります。これは以下では機能しません。「PinCode」である必要があります。

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

そして、私はpython noobなので、小道具は次のようになります: この回答この回答この質問この質問 、およびこの回答


私はそうfirstRow[x].valueなるはずだと思いますheaderRow[x].value
TSeymour 2018

0

私はほとんどの場合、これにパンダを使用していますが、現在の小さなツールは実行可能ファイルにパッケージ化されており、パンダを含めるのはやり過ぎです。そこで、名前付きタプルのリストを作成するバージョンのpoidaのソリューションを作成しました。この変更を加えた彼のコードは次のようになります。

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.