반응형


ipython notebook 에서  한글 csv 파일 불러오기



환경 : windows 7, python 2.7.5


사용 한글csv 파일 :  

csvtest.csv


 --- 한글 text 파일 불어 오듯이 하면, csv 모듈 불러쓸때는, 한글 잘 안됨.

     ( http://freeprog.tistory.com/9  참고)



1. python  IDLE 상 실행시 정상 작동.


import csv

with open('csvtest.csv') as csvf:
    rd = csv.reader(csvf)
    t = next(rd)
    for fieldname in t:
        print fieldname,
        
    print
    
    for idx, data in enumerate(rd):
        print idx, data[0], data[1], data[2] 





2. 하지만, ipython notebook 에서 실행시 error (이상한 문자로 나옴)

import csv

with open('csvtest.csv') as csvf:
    rd = csv.reader(csvf)
    t = next(rd)
    for fieldname in t:
        print fieldname,
        
    print
    
    for idx, data in enumerate(rd):
        print idx, data[0], data[1], data[2] 





*** 한글 text 파일 불러오기처럼, codec 모듈 사용해도 에러(UnicodeEncodeError) 발생

import codecs
import csv

with codecs.open('csvtest.csv','r', encoding = 'euc-kr') as csvf:
    rd = csv.reader(csvf)
    t = next(rd)
    for fieldname in t:
        print fieldname,
        
    print
    
    for idx, data in enumerate(rd):
        print idx, data[0], data[1], data[2] 





3. ipython notebook 에서 실행시 한글출력 정상으로 하는 방법.

  --- csv 모듈내의 reader() 대신에  unicode 버전 reader (unicode_csv_reader사용함 

       참고 : https://docs.python.org/2/library/csv.html


import codecs
import csv

# unicode_csv_reader(), utf_8_encoder()  
#     --->  https://docs.python.org/2/library/csv.html 에서 제공함.

def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
    # csv.py doesn't do Unicode; encode temporarily as UTF-8:
    csv_reader = csv.reader(utf_8_encoder(unicode_csv_data),
                            dialect=dialect, **kwargs)
    for row in csv_reader:
        # decode UTF-8 back to Unicode, cell by cell:
        yield [unicode(cell, 'utf-8') for cell in row]
 
def utf_8_encoder(unicode_csv_data):
    for line in unicode_csv_data:
        yield line.encode('utf-8')  
 


with codecs.open('csvtest.csv','r', encoding = 'euc-kr') as csvf:
    rd = unicode_csv_reader(csvf)
    t = next(rd)
    for fieldname in t:
        print fieldname,
        
    print
    
    for idx, data in enumerate(rd):
        print idx, data[0], data[1], data[2] 



















반응형
Posted by 자유프로그램
,