본문 바로가기

Python

16. CSV

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