글 작성자: 개발섭

안녕하세요. 요즘에 파이썬을 공부중이라서 정리겸 포스팅을 합니다. 

최근 주변에 Python을 하는 사람이 많아졌고, 그리고 저도 최근 인공지능 공부때문에 파이썬을 쓰다보니 좀 유용하게 쓸 정보들이 많은 것 같아서 정리를 해야겠습니다.

 

파이썬에서 CSV파일을 읽는 방법들

사실 파이썬은 툴이고 자료를 가져오는 방식은 특정 라이브러리를 통해서 함수로 읽어오는 방식을 택합니다. 뭘 통해서 가져와야할지를 해매는 경우가 많기 때문에 한번 제가 여기저기 몸으로 고생했던 이야기를 해봅니다.

 

파이썬에서 읽는 방법은 3가지가 있습니다 .

 

1.  CSV 라이브러리

2. Numpy 라이브러리

3. Pandas 라이브러리

 

들어가기에 앞서서...

 

간단한 csv파일을 만듭시다 .

 

 

1.  CSV 라이브러리 ( csv.reader() )

파이썬 CSV라이브러리는 가장 기본적인  csv를 다루는 툴입니다. 

import csv

f = open('Test.csv', 'r', encoding='utf-8')
rdr = csv.reader(f)
for line in rdr:
    print(line)

csv의 경우 읽을때는 csv.reader를 통해서 읽습니다. 

파일을 변수에 담고  reader메소드 안에 담아주면 됩니다.

 

CSV의 경우 줄단위로 읽혀오고 이 줄의 있는 각 값들을 리스트에 담습니다.  즉, 한 행이 리스트가 되고 그 속의 열이 리스트 속의 값이 됩니다.

 

실제 출력 값입니다. 

['A', '1']
['B', '2']
['C', '3']
['D', '4']
['E', '5']

 

그럼 각 값들을 따로 사용하기 위해서는 어떤식으로 사용하는지? 

이 리스트에서 값을 때서 사용하는 걸로 생각해버리면 쉽습니다.  line[0] 이나, line[:9]라든지..

 

 

2.  Numpy 라이브러리  ( numpy.genfromtxt() )

numpy는 수학관련한 메소드가 꽤 많기때문에 csv에서 불러올때부터 타입이 지정되어서 나옵니다. 

즉, int는 int값을 float는 float값을 가지게 된다. 변수를 따로 형변환 할 필요가 없다는 점이 장점입니다. 

 

import numpy as np

data = np.genfromtxt('Test.csv', delimiter=',', dtype=None, encoding='UTF-8')
print(data)
print(data[0][1]+data[1][1])

쓰면서 알게된 사실은 encoding을 하도록 유도를 하는 점이였는데 genfromtxt의 

형변환 할 필요없이 수학적 계산을 편리하게 할 수 있습니다.

혹은 이 값들을 특정 형식으로 지정할 수 있습니다. float이나 int 타입등으로 따로 형변환을 해줄 수 있으며,

지금과 같이 글자, 숫자가 섞여 있는 경우 dtype을 None을 사용하면 값을 출력해낼 수 있습니다.

[('A', 1) ('B', 2) ('C', 3) ('D', 4) ('E', 5)]
3

이때의 출력값은 data라는 리스트안에 튜플이 들어가 있는 모습입니다 .

이 리스트의  [N][M] N은 행을 M은 열을 뜻합니다. 필요한 행과 필요한 열을 뽑아서 사용할수 있습니다..

 

 

3. Pandas 라이브러리 ( pandas.readcsv() )

판다스는 데이터를 불러오는 라이브러리입니다. CSV파일뿐만 아니라 xlsx파일, txt파일등 이런 파일자체를 형식을 만들어서 관리하는 라이브러리라고 생각하면 좋습니다. 

표형식을 만들어서 그 표에 대한 값을 잘 뽑아서 사용할 수 있습니다. 

 

판다스의 경우 .read_csv를 통해 값을 읽어옵니다. 이값은 리스트나 튜플의 형태를 가진게아니라 일정 표의 형식을 가진 형태로 나오게됩니다.

참고로 이 표의 경우 행과 열을 표시를 해주기도하니 눈에 잘 보이기도 합니다. 

 

또한 여기서 특정 열 특정 값만 빼오기위해서는 Loc를 이용해서 값을 가져오거나 

For의 range(len(data))를 통해 행의 값을 불러와서 한 행 한 열의 값을 특정 지을수도 있습니다.

각각의 값이 나오는 모습을 보면 대략적으로 알 수 있습니다.

 

import pandas as pd

data = pd.read_csv('Test.csv')
print(data)
print(data.loc[:,'A'])
for i in range(len(data)):
    print(data.loc[i])

loc[i]를 통해 특정값이 나오는 경우 각 열의 "key"와 "value"를 알려줍니다. 

그리고 그 key값을 통해서 따로 value만 가져오고 싶은 경우 .loc[i, "key"] 이런 형식으로 key값을 따로 정리하는 것으로 이용합니다.

  A  1
0  B  2
1  C  3
2  D  4
3  E  5
0    B
1    C
2    D
3    E
Name: A, dtype: object
A    B
1    2
Name: 0, dtype: object
A    C
1    3
Name: 1, dtype: object
A    D
1    4
Name: 2, dtype: object
A    E
1    5
Name: 3, dtype: object