Чтение файла 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)