본문 바로가기
IT/Scraping

문서 읽기: 텍스트, CSV

by Cyber_ 2025. 2. 18.

문서 인코딩

문서 인코딩은 애플리케이션(컴퓨터의 운영체제이든, 직접 만든 파이썬 코드이든)이 그 문서를 읽는 방법을 지정합니다. 인코딩은 보통 파일 확장자에서 추론할 수 있지만, 파일 확장자가 꼭 인코딩에 따라 정해지는 것은 아닙니다.

모든 문서는 근본적으로 0과 1로 인코드 되어있습니다. 인코딩 알고리즘은 그 위에서 글자 하나에 몇 비트인지, 이미지 파일이라면 각 픽셀에 몇 비트를 써서 색깔을 나타내는지 정의합니다. 그 위에 다시 PNG 파일 처럼 압축이나 기타 공간을 절약하는 알고리즘이 있을 수 있습니다.

텍스트, CSV, PDF, 워드 문서는 모두 기본적으로 텍스트 파일을 저장하는 파일 형식입니다.

텍스트

대부분의 기본적인 텍스트 문서, http://www.pythonscraping.com/pages/warandpeace/chapter1.txt의 연습용 파일 같은 경우에는 다음 방법을 쓸 수 있습니다.

from urllib.request import urlopen

textPage = urlopen('http://www.pythonscraping.com/',
                   'pages/warandpeace/chapter1.txt')
print(textPage.read())

일반적으로 urlopen으로 페이지를 가져오면 BeautrifulSoup 객체로 바꿔서 HTML로 파싱합니다. 여기서는 파싱할 HTML이 없으므로 효율적이지 않으므로 필요없습니다.

일단 텍스트 파일을 문자열로 읽으면 파이썬에서 다른 문자열을 다루듯 분석할 수 있습니다. 물론 여기에는 단서로 쓸 HTML 태그가 없으므로, 실제 필요한 텍스트와 쓸모없는 텍스트를 구분하기가 쉽지 않습니다. 이런 점이 텍스트 파일에서 정보를 추출할 때 부딪히는 어려운 문제입니다.

텍스트 인코딩의 역사

  • ASCⅡ: 1960년대 만들어졌으며, 7을 저장하기위해 저장공간을 낭비하는 등의 단점이 있으며 기본적으로 영어를 표시할 수 있습니다.
  • UTF-8: 1990년대 영어 이외의 다른 언어도 표시하기 위해 만들어졌습니다.
  • ISO: 각 언어에 특화된 인코딩을 만들어 ASCⅡ코드를 벗어나는 문서를 사용할 경우 저장공간을 많이 차지하는 문제를 해결하려 고안됐습니다.

파이썬 코드에서는 명시적으로 인코딩 방식을 다음과 같이 지정해 줄 수 있습니다.

from urllib.request import urlopen

textPage = urlopen('http://www.pythonscraping.com/pages/,
                   'warandpeace/chapter1-ru.txt')
print(str(textPage.read(), 'utr-8'))

이 개념을 BeautifulSoup와 파이썬 3.X에 적용한 코드는 다음과 같습니다.

html = urlopen('http://en.wikipedia.org/wiki/Python_(programming_lauguage)')
bs = BeautifulSoup(html, 'html.parser')
content = bs.find('div', {'id':'mw-content-text'}).get_text()
content = bytes(content, 'UTF-8')
content = content.decode('UTF-8')

CSV

파이썬에선 CSV 파일을 온벽하게 읽고 쓸 수 있는 csv 라이브러리(https://docs/python.org/3.4/library/csv.html)가 있습니다.

CSV 파일 읽기

csv 파일이 로컬에 없을 경우 다음 세가지 방법을 고려해볼 수 있습니다.

  1. 원하는 파일을 직접 내려받은 후 파이썬에 그 파일의 위치를 알려주는 방법

-> 쉽게 메모리에서 처리할 수 있지만, 하드디스크에 파일을 저장하는 건 좋지 않는 습관입니다.

  1. 파일을 내려받는 파이썬 스크립트를 작성해서 읽고, (원한다면) 삭제하는 방법
  2. 파일을 문자열 형식으로 읽은 후 StringIO 객체로 바꿔서 파일처럼 다루는 방법

-> 파일을 문자열로 읽고 객체로 바꿔서 파이썬이 파일처럼 다루게 하는 방법이 더 좋습니다.

  • 다음 스크립트는 인터넷에서 CSV 파일을 가져와서 행 단위로 출력합니다.
    from urllib.request import urlopen
    from io import StringIO
    import csv
    

url = 'http://pythonscraping.com/files/MontyPythonAlbums.csv'
data = urlopen(url).read().decode('asccii', 'ignore')
dataFile = StringIO(data)
csvReader = csv.reader(dataFile)

dictReader = csv.DictReader(datafile) -> 각 행을 리스트객체가 아닌 딕셔너리 객체로 반환

for row in csvReader:
print(row)