데이터를 시각화 하기 전에 파일 불러오기

setwd("C:\\Users\\user\\OneDrive - 경북대학교\\통계학과\\1-2\\R프로그래밍 및 실험")

#1
dat1 = read.csv("w7_2 csv.csv") # 띄어쓰기를 .으로 구분함
#2
dat1 = readr::read_csv("w7_2 csv.csv") # 띄어쓰기 있는 곳은 ``으로 묶어서 표기

1번
2번

 

시각화를 통해 데이터 분포 확인

 

히스토그램

hist(dat1$나이)

 

 

기호에 따라서 히스토그램을 더 보기 좋게 만들 수 있음.

hist(dat1$나이, main = "예제데이터의 나이(1)",
     xlab = "age", ylab = "빈도") 
     
# x축의 이름: xlab
# y축의 이름: ylab

 

 

hist(dat1$나이, main = "예제데이터의 나이(2)",
     xlab = "age", ylab = "빈도", breaks = 10)
     
# break를 통해 그래프를 더 나누어줄 수 있음.

 

 

 

 

산점도

plot(x = dat1$나이, y = dat1$`성취도 점수`) # 기본적인 형태
plot(x = dat1$나이, y = dat1$`성취도 점수`,
     main = "나이에 대한 성취도", xlab = "나이",
     ylab = "성취도") # 알아보기 쉽게 만듦.

plot (formula = `성취도 점수`~`나이`, data = dat1,
      main = "나이에 대한 성취도", xlab = "나이",
      ylab = "성취도") # 2번째와 똑같은 그래프인데, 형태가 다름.

 

 

plot(formula = `우울 점수`~`나이`, data = dat1,
     main = "나이에 대한 우울 점수", xlab = "나이",
     ylab = "우울 점수",
     col = c("red", "blue")[factor(성별)], cex = 1.5,
     pch = c(20, 18)[factor(성별)])
     
# col 색 변경 / pch 점 모양 / cex 점 크기

 

직선 추가하기

# y = a+bx
abline(a = -20, b = 1,
       col = "dark green", lty = "dotted", lwd = 2.0) 

# y = h
abline(h = 40, 
       col = "dark red", lty = "dotted", lwd = 2.0) 

# x = v
abline(v = 50,
       col = "dark blue", lty = "dotted", lwd = 2.0)

# 평활 직선
lines(stats::lowess(x = dat1$나이, y = dat1$`우울 점수`),
      col = "dark red")
      
h = horizontal line
v = vertical line

 

참고

 

지수평활법

가장 최근 데이터 가장 큰 가중치가 주어지고 시간이 지남에 따라(과거로 갈수록) 가중치가 기하학적으로 감소되는 가중치 이동 평균 예측 기법의 하나. 데이터들이 시간의 지수 함수에 따라 가중치를 가지므로 지수 평활법이라고 한다. 이 기법은 가장 최근의 예측 데이터와 주요 판매 데이터 간의 차이에 적합한 평활 상수를 사용함으로써 과거의 데이터를 유지할 필요성을 갖지 않는다. 이러한 접근 방법은 어떤 추세를 갖지 않거나 계절적인 패턴을 나타내는 데이터 또는 추세와 계절성을 모두 갖는 데이터에 사용될 수 있다.

[네이버 지식백과] 지수 평활법 [exponential smoothing, 指數平滑法] (IT용어사전, 한국정보통신기술협회)

1. 데이터 읽어오기

# as 명령어로 pd 별칭 지정하기
import pandas as pd

# train.csv, test.csv, sample_submission.csv 파일을 읽어옵니다.
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
submission = pd.read_csv('sample_submission.csv')

 

2. 데이터 확인하기

# 데이터의 개수, 열 이름, 결측값의 수, 데이터 타입 등을 확인할 수 있습니다. 
train.info()

 

3. Column 열 확인

train.columns()

 

4. 데이터 기술 통계량 확인

train.describe()

 

5. 무작위 샘플데이터 확인하기 

train.sample(10)

 

6. 원하는 열의 평균값 얻기 

mean_target = train['열 이름'].mean()
mean_target

 

7. 데이터 프레임 csv 파일로 저장 후 확인

# to_csv를 통해 폴더에 저장
submission.to_csv('submission.csv', index = False)

'프로그래밍 > 프로젝트' 카테고리의 다른 글

ARIMA 모델  (0) 2024.05.21
데이콘 - 고객 대출 등급 분류 프로젝트  (1) 2024.02.09
고객 유지를 위한 필요한 행동 예측  (1) 2024.01.14
원본 데이터 보존  (0) 2023.11.28
머신러닝 기초 및 순서  (0) 2023.11.21

정렬 (sorting)

- 일반적으로 정렬하는 변수는 수치형이거나 문자형

- 종류: 오름차순, 내림차순

- 숫자 > 영어 > 한글

- sort(<object>, ...)

- 예시

c("a", "b", "가", "나", "1", "2")
vec = sample(c("a","b","가","나","1","2"), 10, replace = T)

sort(vec) # ascending
sort(vec, decreasing = T) # descending

sort(c("a", "b", NA), na.last = NA)
sort(c("a", "b", NA), na.last = TRUE) 
# NA의 값이 제일 뒤에 출력
sort(c("a", "b", NA), na.last = F) 
# NA의 값이 앞에서 출력

 

 

 

그룹화(grouping)

- 데이터 가공/전처리 과정 중 하나로 어떠한 특성을 기준으로 자료를 여러 개로 분할하는 작업

- 조건 활용

data(InsectSprays)
unique(InsectSprays$spray)
insect_gp.D = InsectSprays[InsectSprays$spray == "D",]
subset(InsectSprays, subset = (InsectSprays$spray == "D"))
insect_gp.D = InsectSprays[
    InsectSprays$spray == "D",
]
# 변수 SUBJECT를 기준으로 crop 자료를 분할
head(crop[crop$SUBJECT == unique(crop$SUBJECT)[1]], n = 2)
head(crop[crop$SUBJECT == unique(crop$SUBJECT)[2]], n = 2)
head(crop[crop$SUBJECT == unique(crop$SUBJECT)[3]], n = 2)
head(crop[crop$SUBJECT == unique(crop$SUBJECT)[4]], n = 2)

# LOCATION에 포함된 값을 오름차순으로 저장한 목록 생성
loc.list = unique(crop$LOCATION, decreasing = F)

# 생성한 목록 내 세 번째 값을 LOCATION 값으로 가지는 관찰값을 crop3로 저장
crop3 = crop[crop$LOCATION == loc.list[3],]
### split(x = <data>, f = <key_factor>)
insect_gp = split(InsectSprays, f = InsectSprays$spray)
str(insect_gp) # list로 저장됨.
insect_gp$D # indexing
crop_split = split(crop.raw, f = crop.raw$SUBJECT)
# 이렇게 하면 원래 SUBJECT 안에 있던 값들
# "RICE"    "WHEAT"   "MAIZE"   "SOYBEAN"
# 각각의 이름으로 data 프레임이 만들어짐. 
# 한 마디로 list 안에 data frame 이 4개가 있는데
# 그 각각의 이름들이 "RICE"    "WHEAT"   "MAIZE"   "SOYBEAN"
str(crop_split)
nrow(crop_split$MAIZE) ; nrow(crop_split[[1]])
nrow(crop_split$RICE) ; nrow(crop_split[[2]])
nrow(crop_split$SOYBEAN) ; nrow(crop_split[[3]])
nrow(crop_split$WHEAT) ; nrow(crop_split[[4]])

 

근데 아래와 같이 반복해서 나타내기에는 코드가 너무 길어짐.

그래서 lapply(), sapply() 사용

- X의 각 원소에 FUN(함수)을 적용하고 그 결과를 list 또는 vector로 반환하는 함수

- lapply(x = <list>, FUN = <function>) # list로 반환

- sapply( x = <list>,  FUN = <function> )  # vector로 반환 

- apply(x, margin, FUN) 

   >> x  는 matrix 또는 data.frame , 

   >> margin 은 어느 방향으로 할 건지 1은 행방향으로 2는 열방향으로 

   >> FUN은 함수 

 

예시

lapply(crop_split, nrow)
sapply(crop_split, nrow)

mat = matrix(1:111, nrow =3 )
apply(mat, 1, sum)
apply(mat, 2, sum)

 

데이터 프레임의 경우 (apply)

tmp = crop_split[[1]][, c("LOCATION", "TIME", "Flag.Codes")]
apply(tmp, 2, table)
apply(tmp, 1, is.na) # flag.codes 전체가 NA인지 의문 발생
sum(is.na(tmp$Flag.Codes)) == nrow(tmp) # flag.codes 전체가 NA임을 확인

 

주의!

함수 apply에 열 방향(MARGIN = 2)으로 is.numeric, is.character를 적용하면 실제와 모순되는 결과가 나옴.

이것은 apply가 객체를 모두 동일한 type으로 뭉그러뜨리기 때문임. 

 

is.numeric(tmp$TIME) # time은 numeric이 맞음.
apply(tmp, 2, is.numeric) # time이 numeric이 아니라고 출력됨.
apply(tmp[,3,drop=F], 2, is.numeric) # time이 numeric이라고 출력됨.

 
예시

label = sample(c("name1", "name2", "name3"),
               size = nrow(InsectSprays),
               replace = T)


sp2 = list(name1 = InsectSprays[InsectSprays$label == "name1",],
     name2 = InsectSprays[InsectSprays$label == "name2",],
     name3 = InsectSprays[InsectSprays$label == "name3",])

InsectSprays = cbind(InsectSprays, label)

sp = split(InsectSprays, InsectSprays$label)

sp2는 그냥 하나하나 정성스럽게 list에다가 넣은 것이고

sp는 split으로 label을 기준으로 나눈 것

mat1 = matrix(1:20, nr = 5, nc = 4)
mat2 = matrix(-1:-20, nr = 5, nc = 4)
mat0 = matrix(0, nr = 5, nc = 4) # 모든 항을 0으로 만들어줌. 즉, 영행렬을 만들어줌. 
mat1 + mat2 == mat0 # T, 값 하나하나를 지정해서 T를 출력해줌.
mat1 - mat1 == mat0 # T, 값 하나하나를 지정해서 T를 출력해줌.
10*mat1 ; mat1/2 # 항마다 곱해주고 나눠줌.
t(mat1) # transposed matrix(전치행렬) : 대각선을 기준으로 뒤집은 행렬

행렬 A의 덧셈의 역원: -A

항등행렬(I): 대각성분은 모두 1, 나머지 원소는 0인 행렬

 

행렬의 곱셈

AI = IA = A

AB = BA = I  # 이렇게 되면 A의 역원은 B가 됨.

- 항등원 : 이항연산을 했을 때 자기자신이 나오게 만드는 원소 

- 역원: 이항연산을 했을 때 항등원이 나오게 만드는 원소 

- 곱셉에서의 항등원 : 단위 행렬(주 대각선의 원소가 모두 1이며 나머지 원소는 모두 0인 정사각행렬)

- 곱셉에서의 역원 : A^-1

- 행렬의 곱셈을 위해서는 좌측 행렬의 열의 수와 우측 행렬의 행의 수가 같아야 함. 

mat3 = matrix(1:9, nr = 3)
mat4 = matrix(seq(1,2,length=9), nr =3)
mat3 * mat4 # 각 원소에 대응되는 것끼리 곱셈
mat3 %*% mat4 # 행렬의 곱셈
det(mat3); det(mat4)
mat5 = matrix(c(1,2,1:7), nr = 3)
det(mat5)
solve(mat5) # 역행렬

 

역행렬이 존재하는 경우의 해 구하기

# 1
# 3 + 9x = 6
# 5 + 9y = 7
(c(6,7)-c(3,5))/9

# 2
# x + 3y = -2
# 2x + 4y = 3
ex2 = matrix(1:4, nrow=2)
solve(ex2)%*%c(-2,3) # 위의 그림의 논리가 사용된 것
# 곱 방향이 양변이 같아야 함. 
# 그러니깐 우변의 오른쪽에 A^-1이 붙으면 좌변의 오른쪽에 A^-1이 붙어야 함.

행렬 (matrix)

- 동일한 자료형인 원소로 구성된 2차원의 자료 구조 

 

 

 

 

배열 (array)

- matrix의 확장된 형태로 3차원 이상의 배열을 의미

- 동일한 자료형, n 차원 이상

array(<원소가 될 vector>,dim = c(행의 수, 열의 수, 페이지 수))
# 참조
<객체명> [<row_index>, <col_index>, <page_index>]
<객체명> [<row_index>, , ]
<객체명> [, <col_index>, ]
<객체명> [, , <page_index>]
# 예시
# 첫 항이 0이고 끝 항이 10인 길이가 48이 되는 등차수열을 원소로 가지는 3X4X4 배열 arry1
arry1 = array(seq(0, 10, length = 48), dim = c(3,4,4))

arry1[3,2,3]
arry1[3,2, ]
arry1[1, , ]
arry1[ ,3, ]

 

 

 

 

 

리스트(list)

- vector와 같은 선형구조

- 각 원소별로 다양한 형태의 자료를 가질 수 있는 다중자료형

- key와 value가 한 쌍으로 저장되며, list에 있는 자료를 참조할 경우 $를 사용

 

# 리스트 자료형 생성

vec1 = c(1,30,-3)
vec2 = c("apple", "banana", "pear")
vec3 = 1:9
arry = array(1:45, dim = c(3,5,3))
mat = arry[,,1]

l = list(vec1, vec2, vec3, arry, mat)

 

# list 참조

l
l[1] ; str(l[1]) 
# 출력 형태
# List of 1
# $ : num [1:3] 1 30 -3

l[[1]] ; str(l[[1]])
# 출력 형태
#  num [1:3] 1 30 -3

names(l)

여기서 출력형태가 l[1]과 l[[1]] 이 다른 이유는 l은 리스트의 형태인데

l[1]은 리스트에서의 첫 번째 값을 통째로 가져왔다고 하는 것이고

l[[1]]은 리스트에 있는 첫 번째의 값을 껍질을 까서 가져왔다고 하는거라서 출력형태가 다른 것이다. 

 

l = list(v1 = vec1, v2 = vec2, v3 = vec3, arry = arry, mtrx = mat) 
# 리스트의 각 원소에 대한 이름 지정
names(l) 
l
l[1] ; str(l[1]) 
# List of 1
#  $ v1: num [1:3] 1 30 -3 
# $ 옆에 이름이 붙어서 나옴. 
# v1을 참조했다는 뜻 

l[[1]] ; str(l[[1]])
# num [1:3] 1 30 -3

names(l)
l$v1 ; l$arry
names(l) = c("e1", "e2", "e3", "e4", "e5"

 

 

 

 

데이터 프레임(data.frame)

- 행과 열로 구성된 2차원 표

- 열 단위로 서로 다른 자료형의 벡터를 저장할 수 있음.

- 각 열에 해당하는 벡터의 길이가 같음.

- 데이터 프레임 생성할 때 vector 여러개를 저장할 수는 있지만 matrix를 저장을 vector와 같이 하면 자료가 이상해지는 것을 확인할 수 있음.

 

# data.frame의 생성
# vector를 이용

vec1 = c(1,30,-3)
vec2 = c("apple", "banana", "pear")
vec3 = 1:9
arry = array(1:45, dim = c(3,5,3))
mat = arry[,,1]

dat1 = data.frame(num1 = vec1, 
                  chr1 = vec2, 
                  num2 = vec3[1:3] 
                  )
dat1
# data.frame의 생성
# matrix를 이용
dat2 = data.frame(mat)

matrix와 dat2의 차이점 비교

 

dat1의 첫 번째값과 두 번째 값 찾아서 각각 5번씩 출력 

dat3 = dat1[rep(1:2, each = 5),]


참조 

dat1$x1
dat2[1,]
dat2[,3]
names(dat3) = c("v1", "v2", "v3") #데이터 프레임 변수 이름 변경

자료구조 

구분 단일 자료형 다중 자료형 그외
1차원 Vector List Factor
2차원 Matrix Data Frame  
N차원 Array    

 

vector 생성

vec0 = 101
vec1 = c(1, 30, -3)
vec2 = c("banana", "apple", "pear")
vec3 = 1:9
vec4 = seq(1, 10, by = 4) # 1부터 10까지 4씩 더한 벡터
vec5 = seq(1, 100, length = 9) # 1부터 100까지 등간격으로 9개의 원소를 가짐.
vec6 = rep(1:3, times = 3) # 1:3을 3번 반복
vec7 = rep(1:3, each = 3) # 1:3의 원소를 각각 3번씩 반복

 

seq, rep 구분 

seq는 from이랑 to가 있어서 1:10 이렇게 쓰면 안되고, 1, 10 이렇게 처음이랑 끝을 구분해서 써주는 것.

rep는 x라서 다수의 숫자를 출력하고 싶을 때는 벡터로 지정을 해주거나 해야함.

seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)),
    length.out = NULL, along.with = NULL, ...)
    
rep(x, ...)

rep.int(x, times)

rep_len(x, length.out)

 

vector의 참조

> 대괄호 사용 

> <객체 이름> [index number]

> 대괄호 안에 참조할 원소의 위치값을 입력

> index에는 c(), :, seq() 등으로 생성한 벡터도 가능

 

vector의 길이 확인 

> length( name_object )

 

예제

# 벡터의 3,3,3,4,4,4 번째 원소
rep(tmp3[c(3,4)], each = 3)
tmp3[rep(3:4, each =3)]

여기서 첫 번째 줄 코드를 해석하면

tmp3의 3,4 번째 숫자를 가져와서 벡터로 만들어주고, 그 다음에 각각을 3번씩 출력해준다.

두 번째 줄 코드를 해석하면

3과 4 각각을 3번 출력하고 벡터화 시킨 뒤에 tmp3의 c(3,3,3,4,4,4)의 값을 출력해준다. 

 

 

 

 

행렬(matrix)

> 수 또는 다항식 등을 직사각형 모양으로 배열한 것

> 동일한 자료형인 원소로 구성된 2차원의 자료구조

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,
       dimnames = NULL)
       
matrix(1:6, nrow =3, ncol =2)

 

matrix의 참조

<name_object>[<row_index>, <col_index>] # 행과 열을 함께 참조
<name_object>[<row_index>, ] # 행 참조	
<name_object>[<row_index>, <col_index>] # 열 참조

 

matrix의 차원 확인

dim(<객체명>)

 

 

예제

mat3 = matrix(seq(10, 120, by = 10), nr =2, nc = 6)
mat3[2,4]
mat3[1,]
mat3[,3]
mat3[1:2,]

 

 

 

factor 

> 범주형 자료를 표현하기 위한 구조

> 자료가 사전에 정의된 유형으로만 분류되는 경우 사용됨.

> '자료의 값'과 '사전에 정의하는 수준(level)'으로 이루어짐.

> 특수한 형태의 vector라고 볼 수 있음. 

> vector와 동일한 방법으로 참조 (대괄호 사용)

 

fac1 = factor(c("AB", "B", "O", "A", "A", "B"), level = c("A", "B", "O", "AB"))

fac2 = factor(c("B", "B", "RH-A", "B", "O", "A"), levels = c("A", "B", "O", "AB"))

fac1
fac2 # if levels factor doesn't perceive value that doesn't define in levels to NA.
# 따라서 RH-A의 값을 Na 값으로 인식함. 

fac1[1:3]
levels(fac1)
levels(fac1) = c(levels(fac1), "????") # levels에 수준을 추가

 

변수 

- 숫자나 문자열 등 하나의 항목에 이름을 붙인 것

- 1개의 변수는 하나의 데이터를 보관할 수 있음.

x1 = 5 ; x2 = 7
x1+x2
y = x2 - x1
ls() # 현재 저장된 변수 리스트 확인
rm(y) ; ls() # y만 삭제 후 변수 리스트 확인
rm(list = ls()) ; ls() # 저장된 변수 모두 삭제 후 변수 리스트 확인

 

변수의 종류 

numeric(수치형)

character(문자형)

logical(논리형)

complex(복소수형)

 

 

저장된 변수의 자료형 확인 

mode(x1) # numeric으로 출력
str(x1) # num 5로 출력
is.numeric(x1) # numeric 외에 자료형 다 가능

 

변수의 자료형 변경

as.numeric(x1) # as.character(x1)

 

# 연습
num1 =  1; char1 = 'a' ; logi1 = T

is.numeric(num1) # T
is.character(logi1) # F
is.logical(char1) # F

as.numeric(logi1) 
as.character(num1) 
as.logical(char1) # NA, character의 경우 logical로 바꿀 수 없음.
# 연습 2

as.numeric("Word")
as.numeric("1235")
as.numeric(TRUE)
as.numeric("TRUE")
as.logical(1)
as.logical(0)
as.logical(123)
as.logical("1")
as.logical(4151124)
as.numeric(F)

TRUE는 0 제외 숫자로 표현되면 1

FALSE는 0

 

 

특수 자료형

- 수학적으로 정의되지 않거나, 무한대를 나타내거나, 결측치를 나타내는 등 특수한 상황에 사용

- NA: 결측값(자리는 있음)

- NULL: 값이 존재하지 않음. (자리조차 없음.)

- NaN: 수학적인 정의가 불가능한 값 (0/0)

- Inf/ -Inf : 무한대 (3/0)

 

 

예시

x1 = c(1,2,NA, 4,5)
x2 = c(1,2,NULL, 4, 5)

is.na(x1)
length(x1)
is.na(x2)
length(x2)

결과에서 알 수 있듯이 x1은 자리가 포함되어있고, x2는 그렇지 않다. 

 

 

 

정리

temp_num = 101
temp_chr = "this is an example"
temp_logi = F
temp_cplx = 1i

is.numeric(temp_num)
is.character(temp_chr)
is.logical(temp_logi)
is.complex(temp_cplx)

as.numeric(temp_logi)

 

write( ) 함수

file_hander = open("output.txt", "wt", encoding = "utf-8")

while True:
    words = input("Enter words >>> ")
    if word.startswith("exit"):
    	break
    
    else:
    	file_handler.write(words)
        
file_hander.close()

입력
파일 확인

 

 

파일에서 한 칸씩 띄워서 넣고 싶을 때

file_hander = open("output_1.txt", 'wt', encoding = "utf-8")

while True:
	words = input("Enter words >>> ")
    if words.startswith("exit"):
    	break
        
    else:
    	file_handler.write(words)
        file_handler.write("\n")
        
file_hander.close()

파일 확인

마지막에 4줄까지 표시가 된 것은 공부를 입력하고 file_handler.write("\n")을 통해 한 줄이 띄워진 것이다. 

 

 

 

writelines() 함수

words_list = \
['안녕하세요.', 'Python', '잘하고 싶은 사람입니다.'] # \는 라인이 길어서 두 줄로 표현했다는 뜻

with open("output.txt", "wt", encoding="utf-8") as fp:
    fp.write("\n".join(words_list)) # join은 리스트를 하나의 문자로 만들어주는데 그것의 연결고리가 \n이 되도록
    fp.flush()

'프로그래밍 > Python' 카테고리의 다른 글

Python - 클래스 생성자  (2) 2023.11.25
Python - 클래스  (1) 2023.11.25
Python - File Encoding, 자동으로 파일 객체 닫기  (2) 2023.10.21
Python - file open 시 오류 처리  (0) 2023.10.21
Python - 파일 입출력  (0) 2023.10.21

data_poem.txt의 파일은 다음과 같이 한글로 저장되어있다.

txt 파일

여기서 파일 오픈 에러가 나는지 확인을 하기 위해 다음과 같은 코드를 실행한다. 

try:
    file_handler = open("data_poem.txt", 'rt')  

    data_string  = file_handler.read()             
    print(data_string)                             

    file_handler.close()

except FileNotFoundError as e:
    print(f"파일 오픈 에러 :{e}")
    
except UnicodeDecodeError as e:
    print(f"파일 오픈 에러 :{e}")

 

이 결과는 cp949로 윈도우에서 지원하는 encoding 체계라서 바꿔주려면

encoding 파라미터를 전달하여 파일이 오픈되도록 해야한다. 

file_handler = open("data_poem.txt", 'rt', encoding='utf-8')

data_string  = file_handler.read()             
print(data_string)                             

file_handler.close()

encoding은 한국어냐 외국어냐 영어냐에 따라서 encoding을 바꿔주면 된다.

한글로 파일을 읽을 때는 encoding = 'utf-8'

 

 

 

자동으로 파일 객체 닫기

with open ( ) as f: 파일 사용 뒤 자동으로 파일 객체를 닫는다.

# with의 코딩 블록을 벗어나는 순간 자동으로 파일 객체를 닫아준다.

with open("data_poem.txt", "rt", encoding = 'utf-8') as fp:
	data_string = fp.read()
    print(data_string)

 

 

 

'프로그래밍 > Python' 카테고리의 다른 글

Python - 클래스  (1) 2023.11.25
Python - 텍스트 파일 출력(쓰기)  (0) 2023.10.21
Python - file open 시 오류 처리  (0) 2023.10.21
Python - 파일 입출력  (0) 2023.10.21
Python - 피보나치 수열  (0) 2023.10.14

file open 시 오류 처리

 

존재하지 않는 파일을 읽고자 한다면 에러가 발생한다.

이럴 때는 open으로 파일을 불러올 때 os모듈을 사용하여 파일 존재 여부를 확인하면 된다.

import os 

file_name = "data_science.txt"

if os.path.exists(file_name):
	
    file_handler = open("data_science.txt", "rt")
    data_string = file_handler.read()
    print(data_string)
    file_handler.close()
    
else:
	print(f"파일 오픈 에러 : {file_name} 파일이 존재하지 않습니다.")

 

또는 try, except 구문을 사용해 오류를 처리해주면 된다.

try:
    file_handler = open("data_poem.txt", 'rt')  

    data_string  = file_handler.read()             
    print(data_string)                             

    file_handler.close()

except FileNotFoundError as e:
    print(f"파일 오픈 에러 :{e}")
    
except UnicodeDecodeError as e:
    print(f"파일 오픈 에러 :{e}")

 

 

'프로그래밍 > Python' 카테고리의 다른 글

Python - 텍스트 파일 출력(쓰기)  (0) 2023.10.21
Python - File Encoding, 자동으로 파일 객체 닫기  (2) 2023.10.21
Python - 파일 입출력  (0) 2023.10.21
Python - 피보나치 수열  (0) 2023.10.14
Python - 재귀함수  (0) 2023.10.14

+ Recent posts