Прочитайте файл Excel на Python


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?


Вам слід або використовувати a, dict()або створити власний клас даних.
tamasgal

Подобається як? Ви можете надати зразок коду?
Ентузіаст Python 04.03.14

Відповіді:


70

Це один підхід:

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

9
імпортувати xlrd не потрібно, просто переконайтесь, що xlrd встановлено, панди імпортуватимуть і використовуватимуть його.
Vaibhav Vishal

12

Отже, ключовими частинами є захоплення заголовка ( 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


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. Рядки додаються до рядка значень, розділених новим рядком char.

Вихідний порядок стовпців визначається порядком імен стовпців у списку ФОРМАТ.

У моєму коді нижче регістр імені стовпця у списку 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

І оскільки я - пітон-нуб, реквізит повинен бути: ця відповідь , ця відповідь , це питання , це питання і ця відповідь .


Гадаю, firstRow[x].valueце має бутиheaderRow[x].value
Цемур

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.