파일 불러오기
파일 열어서 파일 객체에 저장하기 : 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
기상 자료 포털의 csv자료를 엑셀이용해서 윗부분에 필요없는 값을 자르고 아래 사진같이 만들었습니다.
각 줄에 마지막 부분이 최고기온이므로 그 부분만 짤라서 받고, 날짜가 첫번째 (인덱스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')
'알고리즘 PS (백준) > 🐍 Python (파이썬)' 카테고리의 다른 글
[파이썬 python] Matplot 설치 및 활용 (데이터 시각화 , 그래프) (2) | 2022.06.19 |
---|---|
[파이썬 python] Pandas 설치 및 활용 (데이터 프레임) (0) | 2022.06.07 |
[파이썬 python] : numpy 설치 및 활용 (배열 , 수학/행렬연산 , 코싸인 유사도) (0) | 2022.06.02 |
[파이썬 python] 클래스 (객체 , class) 만들기 (0) | 2022.06.02 |
[파이썬 python] 리스트(list) , 튜플 , 딕셔너리 (dict) , 문자열 관련 함수 (0) | 2022.05.12 |
댓글