Чтение файла Excel в Python

у меня есть файл 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?

6 ответов


Это один подход:

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

несколько поздний ответ, но с пандами можно получить непосредственно столбец файла excel:

import pandas
import xlrd
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]

таким образом, ключевые части должны захватить заголовок (col_names = s.row(0)) и при итерации по строкам пропустить первую строку, которая не нужна for row in range(1, s.nrows) - сделано с использованием диапазона от 1 и далее (неявное 0). Затем вы используете zip для перехода через строки, содержащие " имя " в качестве заголовка столбца.

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

С помощью панд мы можем легко читать excel.

import pandas as pd 
import xlrd as xl 
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/


подход, который я принял, считывает информацию заголовка из первой строки, чтобы определить индексы интересующих столбцов.

вы упомянули в вопросе, что вы также хотите, чтобы значения выводились в строку. Я динамически строю строку формата для вывода из списка столбцов формата. Строки добавляются в строку значений, разделенную новым символом строки.

порядок выходных столбцов определяется порядком имен столбцов в формате список.

в моем коде ниже важен регистр имени столбца в списке форматов. В приведенном выше вопросе у вас есть "Pincode" в списке форматов, но "PinCode" в вашем excel. Это не будет работать ниже, это должно быть "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, реквизит должен быть: ответ, ответ, этот вопрос, этот вопрос и этот ответ.


хотя я почти всегда просто использую панды для этого, мой текущий маленький инструмент упаковывается в исполняемый файл, и в том числе панды перебор. Поэтому я создал версию плутрешение, которое привело к списку именованных кортежей. Его код с этим изменением будет выглядеть так:

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)