1. csv 파일 IO
- CSV : comma-separated values
- TSV : Tab-separated values
# *.csv => 파이썬 데이터
- 모듈 필요 : csv(표준모듈), pandas(외부모듈)
- 테이블 형태(2차원)
: 리스트안의 리스트, 튜플안의 튜플
: 리스트안의 키와 값으로 구성된 딕셔너리
1) open() + csv.reader()
파일변수 = open(csv파일경로, 'r', encoding=인코딩옵션)
csv변수 = csv.reader(파일변수)
데이터리스트 = list(csv변수)
파일변수.close()
2) with open() + csv.readeer()
with open(csv파일경로, 'r', encoding=인코딩옵션) as 파일변수:
csv변수 = csv.reader(파일변수)
데이터리스트 = list(csv변수)
'''
2. CSV 모듈 임포트
# csv 모듈 임포트
import csv
# csv 모듈에서 제공하는 함수 목록 확인
# print(dir(csv))
# 방식 open() + csv.reader()
file = open('data/data.csv', 'r')
print(file) # <_io.TextIOWrapper name='data/data.csv' mode='r' encoding='cp949'>
csv = csv.reader(file)
print(csv) # <_csv.reader object at 0x00000290E35AEE60>
data_list = list(csv)
# print(data_list)
for row in data_list:
print(row)
print('='*20)
# 제목 리스트 출력
for data in data_list[0]:
print(data, end = ' ')
print()
print('='*55)
for cls, name, kor, eng, mat, bio in data_list[1:]:
print(f'{cls:^10} {name:^10} {kor:^10} {eng:^10} {mat:^10} {bio:^10}')
print('='*55)
'''
결과
====================
class name kor eng mat bio
=======================================================
1 adam 67 87 90 98
1 andrew 45 45 56 98
1 ben 95 59 96 88
1 clark 65 94 89 98
1 dan 45 65 78 98
1 noel 78 76 98 89
2 paul 87 67 65 56
2 walter 89 98 78 78
2 oscar 100 78 56 65
2 martin 99 89 87 87
2 hugh 98 45 56 54
2 henry 65 89 87 78
=======================================================
'''
# 국어 점수만 리스트로 생성
# print(data_list[1][2], type(data_list[1][2]))
# 67 <class 'str'>
# 국어 점수 리스트 생성
kor_list = []
for cls, name, kor, eng, mat, bio in data_list[1:]:
kor_list.append(int(kor))
print( f' 국어 점수 리스트 : {kor_list}')
print( f' 총점 : {sum(kor_list)} 평균 : {sum(kor_list)/len(kor_list):.2f} ')
print( f' 최고점 : {max(kor_list)} 최하점 : {min(kor_list)}')
print('='*55)
'''
국어 점수 리스트 : [67, 45, 95, 65, 45, 78, 87, 89, 100, 99, 98, 65]
총점 : 933 평균 : 77.75
최고점 : 100 최하점 : 45
'''
# 국어(kor) 과목 점수를 80점 이상 받은 학생의 이름과 점수를 출력하여라.
kor_list = []
for cls, name, kor, eng, mat, bio in data_list[1:]:
if int(kor) >= 80:
print(f' {name} : {kor} 점')
'''
ben : 95 점
paul : 87 점
walter : 89 점
oscar : 100 점
martin : 99 점
hugh : 98 점
'''
print('='*55)
file.close()
import csv
# with open() + csv.readeer()
with open('data/wages.csv', 'r') as file:
# csv 파일 => 중첩 리스트
# csv_data = csv.reader(file)
# 데이터리스트 = list(csv_data)
# csv파일 => 리스트안의 딕셔너리
# csv.DictReader() => csv 파일에서 첫행의 데이터가 키로 변경
csv_data = csv.DictReader(file)
data_list = list(csv_data)
# 1행의 데이터만 출력
print(data_list[0])
# {'earn': '79571.299011024', 'height': '73.89', 'sex': 'male',
# 'race': 'white', 'ed': '16', 'age': '49'}
# 전체 데이터 출력
for row in data_list[:5]:
print(row)
# 데이터 출력
print('\n'*3)
# for row in data_list[:5]:
#print(row)
# 키 리스트
print(list(data_list[0].keys()))
# ['earn','height','sex', 'race', 'ed', 'age']
# race, height, age 데이터만 출력
'''
wages.csv 파일에서 아래의 조건에 해당하는 데이터만 출력하여라
race : hispanic , gender : female, age<=30
총 데이터 개수도 함께 출력한다.
'''
with open('data/wages.csv', 'r') as file:
csv_data = csv.DictReader(file)
data_list = list(csv_data)
# 제목 컬럼 리스트 생성 후 출력
title_list = list(data_list[0].keys())
print('-'*50)
for title in title_list :
print(f'{title}' , end = ' ')
print()
print('-'*50)
# 데이터 출력
count = 0 # 총 갯수 변수 초기화
for row in data_list:
if (row['race']=='hispanic') and (row['sex']=='female') and (float(row['age'])<=30) :
count += 1
print(f'{row['earn']} {row['height']} {row['sex']} {row['race']} {row['ed']} {row['age']}')
print(f' \n 총 갯수는? {count} \n ')
3. CSV 쓰기
'''
# CSV 쓰기
- 파이썬 데이터(중첩리스트, 리스트안의 딕셔너리) => csv 파일
- 첫행은 제목 리스트
# with open() | open() + csv.writer() | csv.writrows() | csv.DictWriter()
with open(csv파일경로, 'w', encoding=인코딩옵션) as 파일변수:
csv변수 = csv.writer(파일변수)
csv변수.writrows(파이썬데이터)
'''
import csv
# 중첩 리스트
data_list = [ ['이름','주소','전화번호'],
['김영희','부산시','010-6374-90874'],
['홍길동','춘천시','010-5463-9403'],
['성은희','서울시','010-4646-9403'] ]
# newline='' 빈행없이 쓰는 모드
with open('output/address1.csv','w',encoding='utf-8', newline='') as file:
csv_data = csv.writer(file)
# 1행만 쓰기
# csv_data.writerow(data_list[0])
for row in data_list: # 뒤에 조작 가능
csv_data.writerow(row)
print('파일쓰기 완료1')
# csv변수.writerows(리스트|튜플)
# csv변수.writerows(중첩리스트)
with open('output/address2.csv','w',encoding='utf-8', newline='') as file:
csv_data = csv.writer(file)
csv_data.writerows(data_list)
print('파일쓰기 완료2')
# 딕셔너리 데이터 => csv 파일 쓰기
dict_list = [{'name':'김철수', 'address':'서울' , 'mobile' : '010-2342-1231'},
{'name':'홍철수', 'address':'부산', 'mobile' : '010-2442-1345'},
{'name':'박철수', 'address':'대구', 'mobile' : '010-7777-8888'} ]
with open('output/address3.csv','w',encoding='utf-8', newline='') as file:
# fieldnames 는 제목행으로 딕셔너리 데이터의 키와 같아야한다.
csv_data = csv.DictWriter(file, fieldnames=['name', 'address', 'mobile'])
csv_data.writeheader()
csv_data.writerows(dict_list)
print('파일쓰기 완료3')
'Python' 카테고리의 다른 글
17. 클래스와 상속 (8) | 2024.10.11 |
---|---|
15. 파일 입출력 (0) | 2024.10.11 |
14. 예외처리 (0) | 2024.10.11 |
13. 모듈 사용하기(math 모듈, random 모듈) (4) | 2024.10.08 |
12. 함수( 반환값, 매개변수, 람다함수, filter(), map()) (3) | 2024.10.08 |