IT/언어

[python] python으로 csv파일 읽어들이기

개발자 두더지 2021. 7. 8. 22:48
728x90

python으로 csv파일을 읽어들이는 방법과 다루는 방법에 대해 간단하게 소개하고자 한다.

 

csv


 

 먼저 python의 표준 라이브러리의 csv를 사용해보자.

 

읽어들이기

 csv를 사용하여 csv파일을 읽어 들일 수 있다.

import csv

csv_file = open("./TEST_STOCK.csv", "r", encoding="ms932", errors="", newline="" )
#리스트 형식
f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)
#사전형 형식
f = csv.DictReader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

 이 코드에서는 csv파일을 open함수로 파일 오브젝트를 작성하여, 그 파일 오브젝트를 csv.reader로 읽어들인다.

각 메소드의 설명

각 메소드의 인수로 자주 사용하는 것들 위주로 정리해보면 다음과 같다.

open

인수명 설명
mode 어떠한 파일을 읽어들일 것인가를 지정한다. 'r'(읽어들이기용으로 연다), 'w'(쓰기용으로 열고, 먼저 파일을 줄인다), 'x'(배타적인 생성으로 열고, 파일이 존재하는 경우 실패한다), 'a' (읽어들이기 전용으로 열고, 파일이 존재하는 경우에는 끝에 추가 기입된다)
encoding csv파일의 문자 코드를 지정한다.
(예) ms932, utf_8
newline umiversal newlines모드의 동작을 제어한다. None, '', '\n', '\r', '\r\n' 의 지정이 가능하다.

csv.reader or csv.DictReader

 csv.reader과 csv.DictReader의 차이점은, 반환되는 형이다. 동시에, iterator프로토콜에 대응되는 오브젝트를 반환하지만, csv파일의 행의 표현은 csv.reader리스트형, csv.DictReader는 사전형이 된다. 

 또한 아래의 파라미터는 엄격히 말하자면, Dialect 클래스의 속성이 된다.

인수명 설명 디폴트
delimiter 필드간을 분할하기 위해 사용하는 문자 ',' (콤마)
doublequote 필드 내의 quotechar이 그 문자 자체인 경우 어떻게 인용할 것인가에 대한 내용이다. True의 경우, 이 문자는 이중화, False의 경우, escapechar은 quotechar의 전에 위치한다. True
escapechar 이스케이프용의 문자열을 지정한다. 읽어들일 때, escapechar는 그 이후 문자의 특별한 의미를 제거한다.  None
lineterminator writer을 사용할 때에 각 행의 끝을 표시하기 위해 사용되는 문자이다. reader에서는 '\r' 혹은 '\n'을 행을 끝으로 지정하도록 하드 코딩되어 있기 때문에 관계 없다.  '\r\n'
quotechar delimiter이나 quotechar와 같은 특수 문자를 포함할지 개행 문자를 포함하는 필드를 포맷으로 할 때에 사용되는 하나의 문자로 구성된 문자 '"'
skipinitialspace True의 경우, delimiter의 직후에 있는 공백은 무시된다. False

 

데이터의 추출 방법

csv.reader

csv.reader으로 반환되는 객체에서 데이터를 추출하는 방법이다. iterator 프로토콜에 대응된 객체이므로 for문이나 next로 행 데이터를 취득하는 것이 가능하다. 행 데이터는 리스트이므로 인덱스로 액세스할 수 있다.

f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)
header = next(f)
print(header)
for row in f:
    #row는List
    #row[0]로 필요한 항목을 추출할 수 있다.
    print(row)

csv.DictReader

 csv.DictReader로 반환되는 객체에서 데이터를 추출하는 방법이다. csv.reader의 경우와 동일하게, iterator 프로토콜에 대응하는 객체가 반환된다. 다른 점은 행 데이터가 사전형으로 표현되는 것이다. 컬럼명을 지정하여 데이터를 취득하는 것이 가능하다. 

f = csv.DictReader(csv_file)
for row in f:
    #row는dictionary
    #row["column_name"] or row.get("column_name")으로 필요한 항목을 취득할 수 있다.
    print(row)

 

 

pandas


 계속해서 csv파일을 읽어 들일 때 사용할 수 있는 것이 pandas라이브러리이다.

 pandas는 데이터 분석용 라이브러리이다. 데이터 분석을 위한 라이브러리이므로, 데이터의 취득에 관해서는 조금 복잡할 수도 있지만, pandas로 읽어들인 데이터는 DataFrame 오브젝트로 반환되므로 조작하기 쉬우므로 조작에 관해 간략히 설명하고자한다.

 

읽어들이기

import pandas as pd
csv_input = pd.read_csv(filepath_or_buffer="파일경로\TEST_STOCK.csv", encoding="ms932", sep=",")

메소드의 설명

메소드(read_csv)의 인수로 자주 사용되는 것들을 간단하게 표로 정리하였다.

인수명 설명 디폴트
filepath_or_buffer 파일 경로나 read메소드를 가진 객체를 지정한다. None
sep 구분 문자를 지정한다. ','
delimiter 구분 문자를 지정한다. sep대신에 delimiter로 구분자를 지정할 수 있다. None
encoding csv 파일의 문자 코드를 지정한다. 
(예) ms932, utf_8
None
escapechar 이스케이프용의 문자열을 지정한다. 읽어들일 때, escapechar은 그 뒤에 따르는 문자의 특수한 의미를 삭제한다.  None
quotechar delimiter이나 quotechar과 같은 특수 문자를 포함할 것인가, 개행 문자를 포함하는 필드를 인용할 때 사용되는 하나의 문자로 구성된 문자  '"'

데이터의 추출 방법

 pandas를 이용하여 CSV파일을 읽어들일 경우, DataFrame 객체가 반환된다. DataFrame 객체는 2차원의 표형식의 데이터로 표시된다. 열 방향의 색인을 열 라벨, 행 방향의 색인을 행 라벨이라고 부른다.

 DataFrame객체에는 데이터를 추출하는 다양한 방법이 준비되어 있다. 그 중에 편리한 방법을 몇 가지 소개하도록 하겠다.

기본

import pandas as pd
csv_input = pd.read_csv(filepath_or_buffer="파일경로\TEST_STOCK.csv", encoding="ms932", sep=",")
# 항목 수(행수 * 칼럼수)를 반환한다.
print(csv_input.size)
# 지정한 칼럼만을 추출하여 DataFrame객체를 반환한다.
print(csv_input[["특정 열 이름", "특정 열 이름"]])

value

#값을 이차원 배열 형식으로 반환한다.
#반환된 타입은 numpy.ndarray
print(csv_input.values)
#행 인덱스, 칼럼 인덱스의 순서를 지정하여 항목 값을 취득한다.
print(csv_input.values[0, 1])

맨 앞 부터, 맨 뒤 부터

# 맨 앞부터 지정한 행 수 만큼 데이터를 취득한다.
# 반환되는 데이터 타입은 pandas.core.frame.DataFrame
print(csv_input.head(3))

# 맨 뒤에서 부터 지정한 행 수 만큼 데이터를 취득한다.
# 반환되는 데이터 타입은 pandas.core.frame.DataFrame
print(csv_input.tail(3))

DataFrame의 정보

# 행의 수를 확인
print(len(csv_input))

# 컬럼의 수를 확인
print(len(csv_input.columns))

# 차원(모양)을 확인
print(csv_input.shape)

컬럼 정보

# 컬럼 정보
print(csv_input.columns)
print(csv_input.columns[3])

참고자료

https://qiita.com/motoki1990/items/0274d8bcf1a97fe4a869

728x90