본문 바로가기
NLP/AI 이론

[Python] Python Data Handling

by ㅣlㅣl 2024. 1. 28.

네이버 부스트코스에서 제공하는 최성철 님의 강의를 참고하여 작성된 포스팅입니다.


Python Data handling

csv

  • 탭 (tsv), 빈칸(ssv)로 구분도 가능
  • 파이썬에서 처리할 때는 일반적인 textfile을 처리하듯이 파일을 읽어오고 한줄씩 데이터를 처리
# csv 객체
import csv
reader =csv.reader(f, delimiter=',',quotechar='"',quoting=csv.QUOTE_ALL)

  • 그런데 pd.read_csv와 딱히 차이점은 없다.. 훨씬 간결하니까 pandas를 쓰자!

 

 

HTML(Hyper Text Markup Language)

  • 웹 상의 정보를 구조적으로 표현하기 위한 언어
  • 제목,단락,링크 등 요소 표시를 위해 Tag를 사용
  • 모든 요소들은 꺾쇠 괄호 안에 둘러 쌓여 있음#제목 요소 ,값은 Hello,World
  • 모든 HTML은 트리 모양의 포함관계를 가짐
  • 일반적으로 웹 페이지의 HTML 소스파일은 컴퓨터가 다운로드 받은 후 웹 브라우저가 해석 / 표시
<!doctype html>
<html>
 <head>
     <title>Hello HTML</title>
 </head>
 <body>
     <p>Hello World!</p>
 </body>
</html>

HTML도 일종의 프로그램,페이지 생성 규칙이 있음 → 추출된 데이터를 바탕으로 하여 다양한 분석이 가능

  • HTML 분석 방법
    • string
    • regex : 정규 표현식
    • beautifulsoup : 정적 웹사이트 크롤링
    • selenium : 동적 웹사이트 크롤링

 

 

regex

복잡한 문자열 패턴을 정의하는 문자 표현 공식

regex 문자열 예시
^\d{3}-\d{4}-\d{4}$ 010-0000-0000
^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$ 203.252.101.40

  • [정규식 연습장] (https://regexr.com/) : 정규 표현식 입력 시 설명 나옴
  • 정규식 만들어주는 사이트
  • 정규식 추출 방법
    • http로 시작, zip으로 끝남. 그 사이에는 무엇이 있어도 상관 X
    • 하이퍼링크들 추출됨
  • ① 정규식 연습장(http://www.regexr.com/)으로%EC%9C%BC%EB%A1%9C) 이동
    ② 구글 USPTO Bulk Download (특허 데이터) 데이터페이지 소스 보기 클릭
    ③ 소스 전체 복사후 정규식 연습장 페이지에 붙여넣기
    ④ 상단 Expression 부분을 수정해가며 “Zip”로 끝나는 파일명만 추출
    ⑤ Expression에 (http)(.+)(zip)를 입력
  • 정규식 추출 방법 (Python) : re 모듈 이용
    • search() : 한 개만 찾기
    • findall() : 전체 찾기추출된 패턴은 tuple로 반환됨
  • import re import urllib.request url ="https://bit.ly/3rxQFS4" html =urllib.request.urlopen(url) html_contents =str(html.read()) id_results =re.findall(r"([A-Za-z0-9]+\*\*\*)",html_contents) #findall 전체 찾기, 패턴대로 데이터 찾기 for result in id_results: print (result) url ="http://www.google.com/googlebooks/uspto-patents-grants-text.html" #url 값 입력 html =urllib.request.urlopen(url)#url 열기 html_contents =str(html.read().decode("utf8")) # utf8로 decode #html 파일 읽고,문자열로 변환 url_list =re.findall(r"(http)(.+)(zip)",html_contents) for url in url_list: print("".join(url))#출력된 Tuple 형태 데이터 str으로 join

 

 

XML

데이터의 구조와 의미를 설명하는 TAG(Markup) 를 사용해 표시하는 언어

  • TAG - TAG 사이에 값이 표시
  • 구조적 정보 표현 가능
  • HTML과 문법이 비슷함
  • 대표적 데이터 저장 방식
  • 정보의 구조에 대한 정보인 스키마와 DTD등으로 정보에 대한 정보(메타정보)가 표현되며,용도에 따라 다양한 형태로 변경 가능
  • XML은 컴퓨터(예:PC↔ 스마트폰)간에 정보를 주고받기 매우 유용한 저장 방식으로 쓰이고 있음
  • XML도 HTML과 같이 구조적 markup 언어
  • 정규표현식으로 Parsing이 가능하지만, 주로 beautifulsoup으로 파싱
  • XML 문서 구조
    • 원 : XmlNode 개체, DOM 트리의 기본 개체
    • XmlDocument : XML을 메모리에 로드하거나 파일로 저장하는 것처럼 문서 전체에 수행되는 메서드를 지원
  • XML 예제위 XML 데이터를 DOM 구조로 읽어오면 다음과 같이 메모리 구조화가 됨
  • <?xml version="1.0"?> <books> <book> <author>Carson</author> <price format="dollar">31.95</price> <pubdate>05/01/2001</pubdate> </book> <pubinfo> <publisher>MSPress</publisher> <state>WA</state> </pubinfo> </books>
  • 출처 : https://learn.microsoft.com/ko-kr/dotnet/standard/data/xml/xml-document-object-model-dom?redirectedfrom=MSDN
  • <?xml version="1.0"?> <고양이> <이름>나비</이름> <품종>샴</품종> <나이>6</나이> <중성화>예</중성화> <발톱제거>아니요</발톱제거> <등록 번호>Izz138bod</등록 번호> <소유자>이강주</소유자> </고양이>

 

 

beautifulsoup

conda install -c anaconda beautifulsoup4

# 모듈 호출
from bs4 import BeautifulSoup
# 객체 생성
soup = BeautifulSoup(books_xml,"lxml")
# Tag 찾는 함수 find_all 생성
soup.find_all("author")
# 반환된 패턴의 값 반환 (태그와 태그 사이)
변수.get_text()

2.6 사이트 정보 추출하기 - beautifulsoup 사용법 (1)

from bs4 import BeautifulSoup
with open("books.xml","r",encoding="utf8")as books_file:
    books_xml =books_file.read()#File을 String으로 읽어오기

soup=BeautifulSoup(books_xml,"lxml")#lxml Parser를 사용해서 데이터 분석

#author가 들어간 모든 element 추출
for book_info in soup.find_all("author"):
    print (book_info)
    print (book_info.get_text())
import urllib.request
from bs4 import BeautifulSoup

with open("US08621662-20140107.XML","r",encoding="utf8") as patent_xml:
    xml =patent_xml.read()#File을 String으로 읽어오기

soup =BeautifulSoup(xml,"lxml")#lxml parser 호출

#invention-title tag 찾기
invention_title_tag =soup.find("invention-title")
print (invention_title_tag.get_text())

 

 

JSON

JavaScript Object Notation

  • javascript의 데이터 객체 표현 방식
  • 간결, 데이터 용량이 적고 코드 전환이 쉬움
  • XML의 대체제
  • Python의 Dict Type과 유사, key:value 쌍으로 데이터 표시

  • xml - json 비교
```xml
<?xml version="1.0"
encoding="UTF-8" ?>
<employees>
<name>Shyam</name>
<email>shyamjaiswal@gmail.com</e
mail></employees>
<employees>
<name>Bob</name>
<email>bob32@gmail.com</email>
</employees><employees>
<name>Jai</name>
<email>jai87@gmail.com</email>
</employees>
```

```json
{"employees":[
{"name":"Shyam"
,
"email":"shyamjaiswal@gmail.com"},
{"name":"Bob"
,
"email":"bob32@gmail.com"},
{"name":"Jai"
,
"email":"jai87@gmail.com"}]
}
```
  • in python
    • json 모듈로 손쉽게 파싱, 저장 가능
    • 데이터 저장 및 읽기는 dict type과 상호 호환
    • 웹 API는 대부분 정보 교환 시 JSON 활용
    • 대부분의 사이트에서 사용됨 → 각 사이트마다 Developer API의 활용법을 찾아 사용
  • read
  • ## json data ## {"employees":[ {"firstName":"John","lastName":"Doe"}, {"firstName":"Anna","lastName":"Smith"}, {"firstName":"Peter","lastName":"Jones"} ]} import json with open("json_example.json","r",encoding="utf8")as f: contents =f.read() json_data =json.loads(contents) print(json_data["employees"])
  • write
import json 
# dict type과 상호 호환 
dict_data ={'Name':'Zara','Age':7,'Class':'First'} 
with open("data.json","w") as f: 
    json.dump(dict_data,f)

 

 

실습 : 트위터 데이터 가져오기

  • Twitter에서 제공하는 Developer API를 사용하여 트위터 데이터 수집
  • 수집되는 데이터 형태는 JSON형태로 제공
  • developer.twitter.com Oauth 인증으로 데이터를 주고 받을 수 있음
  • 다양한 기능을 이해하기 위해 API문서의 공부가 필요
    developer.twitter.com/en/docs
  1. 트위터 가입후 Twitter App 생성 (developer.twitter.com/en/apps)
  2. 트위터 App 정보 입력 (developer.twitter.com/en/apps)
  3. Keys와 AccessTokens로 가서 APIKey 값 확인
  4. conda 가상 환경으로 requests 와 oauthlib 설치
  5. acitvate python_mooc conda install requests pip install requests-oauthlib
  6. oauth 접속 권한 받기
  7. import requests from requests_oauthlib import OAuth2 consumer_key = '확인한 consumer_key' consumer_secret = '확인한 consumer_secret' access_token = '확인한 access_token' access_token_secret = '확인한 access_token_secret' oauth =OAuth2(client_key=consumer_key,client_secret=consumer_secret, resource_owner_key=access_token,resource_owner_secret=access_token_secret)
  8. 특정 계정의 타임라인 데이터 가져오기
  9. #Twitter RESTapi //screen_name 은 트위터 계정명 url ='https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={0}'.format('naver_d2') r =requests.get(url=url,auth=oauth) statuses =r.json()

for status in statuses:
print(status['text'],status['created_at'])
```

'NLP > AI 이론' 카테고리의 다른 글

[AI Math] 벡터와 행렬의 개념  (1) 2024.01.28
[Python] NumPy & Pandas  (1) 2024.01.28
[Python] Python File/Exception/Log Handler  (1) 2024.01.28
[Python] OOP + 파이썬 모듈화  (1) 2024.01.28
[Python] 파이썬이란?  (1) 2024.01.28