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])
참고자료
'IT > 언어' 카테고리의 다른 글
[python] python으로 excel을 조작할 수 있는 openpyxl 사용법 (0) | 2021.07.27 |
---|---|
[python/pandas] DataFrame 합치기 : merge, join(열, 인덱스 기준) (0) | 2021.07.13 |
[python] 다중상속 (0) | 2021.05.28 |
[python] python으로 JSON 파일 다루는 기초적인 방법 (0) | 2021.05.22 |
[python] pandas로 요소, 행, 열에 함수를 적용하는 map, applymapp, apply (0) | 2021.05.17 |