Python 파일 포맷

ROK·2022년 1월 4일
0

파이썬 여러가지 파일 포맷 다루기

CSV

CSV는 Comma Seperated Value의 약자, 쉼표로 구분된 파일을 말한다
각각의 칼럼(column)을 쉼표(,)로 구분한다

간단한 예시
빌보드 차트 1위부터 5위까지의 곡들, 각 키(key)는 순위를, 값(value)은 곡명, 가수, 발매일 정보를 갖고 있다

billboardchart = {
  				 1 : ["Tho Box","Roddy Ricch","2019-12-19"],
                 2 : ["Don't Start Now", "Dua Lipa", "2019-11-01"],
                 3 : ["Life Is Good", "Future Featuring Drake", "2020-02-10"],
                 4 : ["Blinding", "The Weeknd", "2019-11-29"],
                 5 : ["Circles", "Post Malone","2019-08-30"]
                 }
                 
with open("billboardchart.csv", "w") as f:
	for i in billboardchart.values():
    	data = ",".join(i)
        f.write(data+"\n")

CSV 파일은 실행 경로에 저장되었다

각 칼럼이 무엇을 의미하는지 추가하고 싶어, 첫 째줄에 title, singer, released date를 헤더로 추가하고 다시 확인한다

import csv

header = ["title", "singer", "released date"]

with open("billboardchart.csv", "r") as inputfile:
	with open("billboardchart_out.csv", "w", newline="\n") as ouputfile:
    	fi = csv.reader(inputfile, delimiter=',')
        fo = csv.writer(outputfile, delimiter=',')
        fo.writerow(header)
        for row in fi:
        	fo.writerow(row)

CSV 파일과 Pandas

판다스(Pandas)의 DataFrame은 to_csv 메서드를 지원한다. 이 메서드를 이용하면 csv파일로 쉽게 저장할 수 있다
데이터를 준비한 후 판다스를 활용해 csv 파일로 저장해본다

# 데이터 준비
fields = ["title", "singer", "released date"]
rows = [ ["Tho Box","Roddy Ricch","2019-12-19"],
               ["Don't Start Now", "Dua Lipa", "2019-11-01"],
               ["Life Is Good", "Future Featuring Drake", "2020-02-10"],
               ["Blinding", "The Weeknd", "2019-11-29"],
               ["Circles", "Post Malone","2019-08-30"]]

# pandas를 이용해 데이터를 csv 파일로 저장
import pandas as pd

df=pd.DataFrame(rows, clumns=fields)
df.to_csv('pandas.csv', index=False)

# 동일한 내용 csv.writer를 이용해 수행
import csv

filename = "test.csv"
with open(filename, 'w+', newline='\n') as csv_file:
	csv_writer = csv.writer(csv_file)
    csv_writer.writerow(fields)
    csv_writer.writerows(rows)
    
print("완료")

반대로, csv 파일을 DataFrame으로 변환 시키면 데이터 분석 등 사용자가 편집하기에 용이하다

df = pd.read_csv('pandas.csv')
df.head()

XML

XML은 Extensible Markup Language의 약자, 다목적 마크업 언어

기존에 HTML을 접한 적이 있다면 마크업 언어가 익숙할 수도 있다. 인터넷 웹상에서의 문서 즉, 내용을 교환할 때 이러한 마크업 언어를 이용한다
마크업 언어를 간단하게 말하면 태그라고 불리는 꺾쇠 모양의 괄호(<>)로 구분된 언어라고 할 수 있다.
API에서 데이터를 요청하고 저장할 때 XML이나 JSON형식을 이용해 데이터를 교환한다

간단한 XML 파일 예시

<Person>
  <Name>이름</Name>
  <Age>28</Age>
  <Place>강남</Place>
</Person>

# 꺾쇠 괄호 안에 태그 이름을 정의, 태그 사이에 데이터를 기록하는 형식
# 참고로, 태그 이름은 사용자가 마음대로 지정할 수 있다.

WHO athena API GHO

아래 예시는 세계보건기구(WHO)에서 제공하는 데이터 API 정보의 XML 파일 일부이다
XML이 어떻게 구성되었는지 살펴보자

<?xml version="1.0" encoding="utf-8"?>
# XML의 버전과 인코딩을 명시하는 태그 *필수!
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
          xmlns:o="urn:schemas-microsoft-com:office"
          xmlns:x="urn:schemas-microsoft-com:excel"
          xmlns:ss="urn:schemas-microsoft-com:spreadsheet"
          xmlns:html="http://www.w3.org/TR/REC-html40">
   <DocumentProperties/>
   <Styles>
      <Style ss:ID="Hyperlink" ss:Name="Hyperlink">
         <Font ss:Color="#0000FF" ss:Underline="Single"/>
      </Style>
      <Style ss:ID="header">
         <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
         <NumberFormat ss:Format="@"/>
      </Style>
   </Styles>
   <Worksheet ss:Name="notice">
      <Table>
         <Row>
            <Cell>
               <Data ss:Type="String">Notice</Data>
            </Cell>
         </Row>
         <Row/>
         <Row>
            <Cell>
               <Data ss:Type="String">Date generated</Data>
            </Cell>
         </Row>

<> 형식이 많이 보이는데 이를 태그(tag)라고 부른다
태그는 기본적으로 <태그>내용</태그> 형태로 구성되어 있고, 때로는 <a href="xxx.html">내용</a> 처럼 속성(attribute)값이 포함될 수도 있다

또한 상위 태그 안에 하위 태그가 속해 있을 수 있다. 이를 부모-자식 관계라고 한다

      <Table>
         <Row>
            <Cell>
               <Data ss:Type="String">Notice</Data>
            </Cell>
         </Row>

위와 같이 <Table><Row>, <Cell>, <Data> 태그를 자식 태그로 갖고 있다

XML 파일 만들기

ElementTree
파이썬 표준 라이브러리인 ElementTree는 XML 관련 기능을 제공한다

  • Element() : 태그 생성
  • SubElement() : 자식 태그 생성
  • tag : 태그 이름
  • text : 텍스트 내용 생성
  • attrib : 속성 생성

dump()
생성된 XML 요소 구조를 시스템(sys.stdout)에 사용한다. 출력 형식은 일반 XML 파일로 기록된다

  • write() : XML 파일로 저장
  • 리스트(list)와 유사한 메서드를 제공
    - append(), insert(), remove(), pop()

아래는 person XML을 만드는 코드 예시

import xml.etree.ElementTree as ET

person = ET.Element("Person")
name = ET.Element("name")
name.text = "이름"
person.append(name)

age = ET.Element("age")
age.text = "28"
person.append(age)

ET.SubElement(person, 'place').text = "강남"

ET.dump(preson)

결과
<Person>
<name>이름</name>
<age>28</age>
<place>강남</place>
</Person>

속성값은 attrib 메서드를 name 태그명은 tag 메서드를 이용해 변경할 수 있다

person.attrib["id"] = "0x0001"
name.tag = "firstname"
ET.dump(person)

결과
<Person id="0x0001">
<firstname>이름</firstname>
<age>28</age>
<place>강남</place>
</Person>

새로운 lastname이라는 태그를 firstname 태그 다음으로 삽입하고 속성에 date를 추가

lastname = ET.Element('lastname', date='2020-03-20')
lastname.text = '성'
person.insert(1, lastname)
ET.dump(person)

결과
<Person id="0x0001">
<firstname>이름</firstname>
<lastname date='2020-03-20'></lastname>
<age>28</age>
<place>강남</place>
</Person>

속성은 태그를 생성하는 함수인 Element의 인자로 넣어준다 firstname 태그의 다음이므로 인덱스 번호는 1번, insert()를 이용 인덱스 번호를 지정하고 태그 이름을 삽입

삭제는 remove() 또는 pop() 이용
만약 age 태그를 지우고 싶다면 person.remove(age)를 입력

마지막으로 XML 파일로 저장

ET.ElementTree(person).write('person.xml')

XML 파싱하기

파싱(parsing, 구문 분석)이란 어떤 문자열을 의미 있는 토큰(token)으로 분해해, 문법적 의미와 구조를 반영한 파스 트리(parse tree)를 만드는 과정이다. XML 문서를 파싱하게 되면 특정 태그명이나 속성값 등을 불러올 수 있다

파이썬에서는 파싱하는 방법으로 2가지를 제공
첫 번째는 위에서 살펴본 ElementTree이고, 두 번째는 BeautifulSoup 라이브러리 사용하는 방법

XML 파싱 조금 더 추가할 것


JSON

JSON은 JavaScript Object Notation의 약자, 웹 언어인 JavaScript의 데이터 객체 표현 방식
웹 브라우저와 다른 애플리케이션 사이에서 HTTP 요청으로 데이터를 보낼 때 널리 사용하는 표준 파일 포맷 중 하나, XML과 더불어 API나 config 데이터를 전송할 때 많이 사용
대표적인 예로 트위터는 개발자용 사이트를 통해 여러가지 API를 JSON 형태로 제공한다

JSON 데이터의 예시

person = {
      "first name" : "Yuna",
      "last name" : "Jung",
      "age" : 33,
      "nationality" : "South Korea",
      "education" : [{"degree":"B.S degree", "university":"Daehan university", "major": "mechanical engineering", "graduated year":2010}]
       } 

파이썬의 directory 타입과 매우 유사한 구조를 가지고 있다. CSV 파일에 비해 좀 더 유연하게 데이터를 표현할 수 있고 XML 보다 파일을 쉽게 읽고 쓸 수 있다는 장점이 있다. 또한 JavaScript로 작성된 프로그램에서 쉽게 다룰 수 있다
보통 웹에서 JavaScript나 JavaScript 기반의 Framework가 많이 사용되고 있는 점을 미루어 봤을 때 큰 강점이다

JSON 파싱

JSON 파일 저장
파이썬 dictionary 타입은 JSON으로 저장할 수 있다. 위 예시의 person이라는 딕셔너리 객체를 JSON 파일로 저장한다

import json

person = {
      "first name" : "Yuna",
      "last name" : "Jung",
      "age" : 33,
      "nationality" : "South Korea",
      "education" : [{"degree":"B.S degree", "university":"Daehan university", "major": "mechanical engineering", "graduated year":2010}]
       } 
       
with open("person.json", "w") as f:
	json.dump(person, f)

JSON 파일 읽기
반대로 JSON 파일의 내용을 파이썬 딕셔너리 객체로 쉽게 읽을 수 있다

import json

with open("person.json", "r", encoding="utf-8") as f:
	contents = json.load(f)
    print(contents["first name"])
    print(contents["education"])
profile
하루에 집중하자

0개의 댓글