Чтение файла 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. Это не будет работать ниже, это должно быть "пинкод".
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и потому что я питон нуб, реквизит быть: ответ, ответ, этот вопрос, этот вопрос и этот ответ.
хотя я почти всегда просто использую панды для этого, мой текущий маленький инструмент упаковывается в исполняемый файл и в том числе панды является излишним. Поэтому я создал версию плутрешение, которое привело к списку именованных кортежей. Его код с этим изменением будет выглядеть так:
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)
Comments