본문 바로가기

Python

Python - xlsx,xls 파일 읽기 [openpyxl, pandas]

# xLsx 파일 읽기 : pip install openpyxl
# xLs 

import openpyxl # xlsx 형식의 엑셀파일을 읽기 위한 
filename = "sales_2015.xlsx"
# 엑셀 파일의 내용 
book = openpyxl.load_workbook(filename)
sheet = book.worksheets[0]
data=[] # 모든 데이터 정보를 리스트로 저장 
        # 리스트로 한행의 정보를 저장. 한 행의 정보를 
        # 리스트로 저장 
# sheet.rows : 행의 값들 
# row : 한개의 행 정보 저장
for row in sheet.rows :
    line = [] #한 행의 셀의 값들을 리스트 저장 
#enumerate : 리스트에서 데이터와 index 값을 제공 
    for l,d in enumerate(row) :
        print(l,",",d,",",d.value)
        line.append(d.value)
#    print(line) # 한행의 데이터를 리스트로 저장 
    data.append(line)
print(data)

# enumerate 함수를 이용하여 data 조회하기
for i,d in enumerate(data) :
    print(i+1,":",d)

# xlsx 파일의 모든 sheet를 읽기 
import openpyxl
filename = "sales_2015.xlsx"
book = openpyxl.load_workbook(filename)
#book.worksheets : 모든 sheet 정보 저장 
for i, sheet in enumerate(book.worksheets):
    print(book.sheetnames[i])
    data = []
    for r,row in enumerate(sheet.rows):
        line=[]
        for i,c in enumerate(row) : 
            line.append(c.value)
        print(r+1,":",line)
        data.append(line)


# xls 파일 읽기 
# pip install xlrd 
from xlrd import open_workbook
infile = "ssec1804.xls"
workbook = open_workbook(infile)
print("sheet의 갯수", workbook.nsheets)
# workbook.sheets() : xls 파일의 sheet의 데이터들
# worksheet : 한개의 sheet 정보  
for worksheet in workbook.sheets():
    print("worksheet 이름 :", worksheet.name)
    print("행의 수:", worksheet.nrows)
    print("컬럼의 수 :", worksheet.ncols)
    for row_index in range(worksheet.nrows):
        for column_index in range(worksheet.ncols):
            print(worksheet.cell_value(row_index,column_index),
                      ",",end="")
        print()

 

 

### pandas
### pip install pandas
import pandas as pd

# 판다스로 xlsx 파일 읽기
infile = "sales_2015.xlsx"

# sheet_name = None : 모든 sheet를 읽기
# index_col = None : 인덱스 컬럼 없음으로 설정 
df = pd.read_excel(infile,sheet_name=None,index_col=None)
print(type(df)) #dictionary 
print(df)

row_output = [] # 모든 sheet의 데이터 저장 
for worksheet_name, data in df.items():
    print("===",worksheet_name,"===")
    # data 중 판매가격이 200 초과되는 데이터만 row_output리스트에 저장 
    # $25,000 같은 값을 숫자 25000으로 바꾸고 float 형태로 바꾸고 숫자 200과 비교한다.
    row_output.append(data[data["Sale Amount"].replace("$","").
                      replace(",","").astype(float) > 200.0])
    
        print(data)
        print(type(data))

# sales_all_2015.xlsx 파일에 row_output 데이터를 저장하기
# pd.concat : row_output 데이터를 연결하기         
# axis = 0 row로 연결 
# axis = 1 column으로 연결 
# ignore_index=True :인덱스 없음
filtered_row = pd.concat(row_output,axis=0,ignore_index=True)
print(type(filtered_row)) #데이터 프레임 객체
writer = pd.ExcelWriter("sales_all_2015.xlsx",engine="openpyxl")
# to_excel : 데이터 프레임 객체를 엑셀 형태의 데이터로 변경
# 저장할 엑셀 파일의 데이터(내용) 정보
filtered_row.to_excel(writer,sheet_name="sale_2015",index=False)
writer.save() # 파일로 생성

 

# pandas를 이용하여 xls 파일 읽고 쓰기.
# sheet를 여러개로 저장하기
import pandas as pd
infile = "ssec1804.xls"
outfile = "ssec1804_bak.xls"
writer = pd.ExcelWriter(outfile) # 복사될 파일 
df = pd.read_excel(infile,sheet_name=None,index_col=None)
for worksheet_name,data in df.items() :
    print("===",worksheet_name,"===")
    print(data)
    data.to_excel\
    (writer,sheet_name=worksheet_name,index=False,header=False)
writer.save()
writer.close()