본문 바로가기
알고리즘 PS (백준)/🐍 Python (파이썬)

[파이썬 python] 파일 입출력 , csv 파일 읽기 + (기상,지하철 데이터 분석)

by 코딩하는 동현😎 2022. 6. 1.

파일 불러오기

파일 열어서 파일 객체에 저장하기 : f = open('파일경로' , 옵션 , 인코딩방식)

예시) f= open('myfile.txt,'w')

 

첫번째 인자는 경로를 받고 그다음 인자는 파일 여는 옵션(open mode)인데요 , 아래는 대표적인 옵션들의 목록 입니다.

  • 'w' : 쓰기용으로 파일 읽기 (파일이 존재하지 않으면 새로 생성하고 , 존재하면 파일 내용을 비웁니다)
  • 'r' : 읽기용으로 파일 엽니다. (옵션을 입력하지 않으면 기본 값입니다)
  • 'x' : 새로운 파일을 생성합니다.
  • 'a' : Append(이어붙이기) 모드로 파일을 엽니다( 없으면 새로 생성합니다)
  • '+' : 파일을 읽고 쓰기용으로 엽니다.

문자열 형태로 파일 읽기

파일 읽을때는 read() 함수를 쓰면 파일을 전부 읽고 문자열을 반환값으로 리턴합니다.

인코딩 방식은 그 불러오려는 파일에 맞춰서 해야하지만 대체적으로 텍스트 파일은 보통 utf8 , csv 파일은 cp949로 인코딩을 하시면 됩니다.

# f.read() 파일을 전부 읽고 그 문자열을 리턴합니다
f = open('README.txt', 'r' , encoding = 'utf8')
data = f.read()
print(data)
f.close()


#파일에서 한줄씩 가져오기
f = open('README.txt', 'r')
for line in f: print(line)
f.close()

파일을 다 읽거나 이용한 후에는 메모리 누수를 막기 위해서 close() 함수를 써주는것이 좋습니다.


write()를 이용해 파일쓰기

아래같은 경우 각 반복마다 문자열 포매팅을 통해 "1 line" , "2 line."... 의 문자열이 data에 저장되고, 그 문자열이 write를 통해 쭉 이어서 저장됩니다.

f = open('new.txt', 'w')
for i in range(1,11):
	data = “{0:d} line.\n“.format(i)
	f.write(data)
f.close()

CSV 파일 읽기

csv 라이브러리를 이용해야하기 때문에

import csv를 우선 선언해줍니다.

 

csv.reader(파일변수 , 구분자형식)를 통해서 불러올수 있습니다.

ex) data = csv.reader(f , delimiter='.')

사실 구분자는 기본값이 ,로 되어있기 때문에 인자로 넣어주지 않아도 됩니다.

 

next()함수를 이용해서 파일에 각 한줄씩 받아올수 있습니다.

import csv
f = open('Seoul.csv' , 'r' , encoding='cp949')
data = csv.reader(f,delimiter = ',')

기상관측 데이터 분석

https://data.kma.go.kr/stcs/grnd/grndTaList.do?pgmNo=70 

 

기상자료개방포털[기후통계분석:통계분석:기온분석]

중부(26) 서울경기: 서울(108), 인천(112), 수원(119), 강화(201), 양평(202), 이천(203) 강원영동: 속초(90), 강릉(105), 태백(216) 강원영서: 철원(95), 대관령(100), 춘천(101), 원주(114), 인제(211), 홍천(212) 충북:

data.kma.go.kr

기상 자료 포털의 csv자료를 엑셀이용해서 윗부분에 필요없는 값을 자르고 아래 사진같이 만들었습니다.

Seoul.csv
0.01MB

각 줄에 마지막 부분이 최고기온이므로 그 부분만 짤라서 받고, 날짜가 첫번째 (인덱스0)이므로 아래와 같이 코드를 작성했습니다.

#기상관측 데이터 분석
import csv
f = open('Seoul.csv' , 'r' , encoding='cp949')
data = csv.reader(f,delimiter = ',')
header = next(data)
# print(header)
max_temp = -999
max_date = ''
for row in data:
    if row[-1] == '':
        row[-1] = -999
    row[-1] = float(row[-1])
    if max_temp<row[-1]:
        max_date = row[0]
        max_temp = row[-1]
f.close()
print('기상 관측 아래 서울의 최고 기온이 가장 높았던 날은 ' , max_date,'으로, \n')
print(max_temp , '였습니다.')

#(유임/무임)의 최대 비율
import csv
f = open('subwayfee.csv')
data = csv.reader(f)
next(data)
max_rate = 0
rate = 0
for row in data:
    for i in range(4,8):
        row[i] = int(row[i].replace(',' , ''))
    if row[6] != 0:
        rate = row[4] / row[6]
        if rate>max_rate:
            max_rate = rate
print("(유임/무임)의 최대 비율은 " , max_rate)

지하철 데이터 분석 - 각 호선의 역별 이용현황 출력하기

각호선별 최대 3역 , 최소 3역을 출력하려 합니다!

 

csv파일

즉석에서 작성하고 클린하지 않은거라 클린코드가 아니어서 읽기 힘들겠지만....ㅎㅎ

dict1 ==> key = 호선  , value  = [[역 , 이용객]  , [역2 , 이용객]......] 2차원 리스트 형태

dict2 ==> key = 호선 , value [ 역이용객 , 역2이용객.......] 리스트 형태

두 딕셔너리의 순서는 같을테니 dict2의 value부분을 sort해서 정렬해서 상위 3개 , 하위 3개의 역의 인덱스값을 가져오고 , 

dict1의 내용을 통해 그 역의 이름과 이용자수를 가져옵니다.

 

numlist ==> 정렬할 리스트

orilist ==> 기존 순서를 그대로 가지고 있어 인덱스를 구하기 위해 이용할 리스트

#지하철 노선별 역별 이용현황 이용객
f= open('subway.csv')
data = csv.reader(f)
next(data)
dict = {}
dict2 = {}
temp = []
numlist=[]
i=0
for row in data:
    if row[1] in dict:
        dict[row[1]].append([row[3] , int(row[4].replace(',' , ''))+ int(row[5].replace(',' , ''))])
        dict2[row[1]].append(int(row[4].replace(',' , ''))+ int(row[5].replace(',' , '')))
    else:
        dict[row[1]] = []
        dict2[row[1]] = []
        dict[row[1]].append([row[3] , int(row[4].replace(',' , ''))+ int(row[5].replace(',' , ''))])
        dict2[row[1]].append(int(row[4].replace(',' , ''))+ int(row[5].replace(',' , '')))
    i+=1

key = dict.keys()

for sub in key:
    numlist=dict2[sub]
    orilist = numlist[:]
    numlist.sort(reverse = True)
    print(sub , '최대')
    for j in range(3):
        ind = orilist.index(numlist[j])
        print(dict[sub][ind])
    numlist = numlist[::-1]
    print(sub , '최소')
    for j in range(3):
        ind = orilist.index(numlist[j])
        print(dict[sub][ind])
    print('\n')

 

반응형

댓글