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

이것은 한 가지 접근 방식입니다.

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

다소 늦은 답변이지만 pandas를 사용하면 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가 설치되어 있는지 확인하면 pandas가 가져 와서 사용합니다.
Vaibhav Vishal

12

따라서 핵심 부분은 헤더 ( col_names = s.row(0)) 를 잡고 행을 반복 할 때 필요하지 않은 첫 번째 행을 건너 뛰는 것 for row in range(1, s.nrows)입니다. 1부터 범위를 사용하여 수행합니다 (암시 적 0이 아님). 그런 다음 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

다음은 엑셀 파일을 읽고 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

그리고 나는 파이썬 멍청이이기 때문에 소품은 : 이 답변 , 이 답변 , 이 질문 , 이 질문 및이 답변 입니다.


제 생각 firstRow[x].value에는headerRow[x].value
TSeymour

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.