파이썬 sys 모듈, 데이터 읽기 쓰기


  • 본문의 내용은 Data Science from scratch(밑바닥부터 시작하는 데이터 과학)을 읽고 작성했습니다.
  • 본문의 소스코드의 일부는 Joel Grus의 Github에서 Unlicensed 라이선스로 배포되고 있습니다.

sys로 커맨드라인 도구 만들기

#egrep.py
import sys, re
regex = sys.argv[1]
for line in sys.stdin:
    if re.search(regex, line):
        sys.stdout.write(line)

# usage : type file.txt | python egrep.py [0-9]

#line.py
import sys
count = 0
for line in sys.stdin:
    count += 1

print(count)

#common_words.py
import sys
from collections import Counter

try:
    num_words = int(sys.argv[1]) # int가 아닌 값이 들어오면 error
except:
    print ("usage: common_words.py number of words")
    sys.exit(1) # exit 뒤에 0 이외의 숫자가 들어오면 error를 의미

counter = Counter(word.lower()
                  for line in sys.stdin
                  for word in line.strip().split()
                  if word)

for word, count in counter.most_common(num_words):
    sys.stdout.write(str(count))
    sys.stdout.write("\t")
    sys.stdout.write(word)
    sys.stdout.write("\n")

# usage : common_words.py 10

파일 읽기 쓰기

import sys, re
from collections import Counter

# 간단한 파일 열기 쓰기 더하기 (>>)
bible = 'bible.txt'
read = open(bible,'r')
write = open(bible,'w')
append = open(bible,'a')
write.close()

with을 사용해서 작업이 끝나면 파일을 자동으로 닫자.

with open(bible, 'r') as f:
  data = (f)
  d=list(data)

#regex로 간단한 첫 글자 세기
starts_with_space = 0
with open(bible 'r') as f:
  for line in f:
    if re.match("^ ",line):
      starts_with_space += 1

이번엔 newline으로 구분된 데이터를 읽어보자.

def getDomain(emainAddress):
  return emailAddress.lower().split("@")[-1]

with open('emailAddress.txt', 'r') as f:
  domainCounts = Counter(getDomain(line.strip())
  for line in f
  if '@' in line)

# 도메인을 오름차순 정렬
sorted(domainCounts, key=domainCounts.get())
# 도메인을 내림차순 정렬
sorted(domainCounts, key=domainCounts.get(), reverse=True)

Out: ['gmail.com',
 'ru.ac.za',
 'dut.ac.za',
 'ukzn.ac.za',
 'wits.ac.za',
 'unizulu.ac.za',
 'aims.ac.za',
 'campus.ru.ac.za',
 'uclouvain.be',
 'uct.ac.za',
 'sun.ac.za',
 'icra.it',
 'yahoo.com',
 'myuct.ac.za',
 'icranet.org',
 'ieec.uab.es',
 'fis.ucm.es',
 'ehu.es',
 'aip.de',
 'yahoo.co.uk',
 'uofk.edu',
 'kasi.re.kr',
 'uj.ac.za',
 'iburst.co.za',
 'stu.ukzn.ac.za']

구분자가 있는 파일 열기

데이터가 언제나 줄로 구분되어 있는 것은 아니다. tab으로 구분되기도 하고, 쉼표로 구분되기도 하고, 구분되어 있지 않기도 하다. 만약 헤더가 없는 파일이라면 각 행을 list로 바꿀 수 있다.

# tab 구분자 파일 열기
import csv
with open('tab_delimited_stock_prices.txt','r') as f:
    reader = csv.reader(f, delimiter='\t')
    for row in reader:
        date = row[0]
        symbol = row[1]
        closing_price = float(row[2])
        stockPrice=(date,symbol,closing_price)

# colon 구분자 파일 DictReader로 열기
with open('colon_delimited_stock_prices.txt', 'r') as f:
    reader = csv.DictReader(f, delimiter=':')
    for row in reader:
        date = row["date"]
        symbol = row["symbol"]
        closing_price = float(row["closing_price"])
        stockPrice=(date,symbol,closing_price)      

# dictionary로 csv 파일 만들기
today_prices = {'AAPL':90.91,'MSFT':41.68,'FB':64.5}
with open('comma_delimited_stock_prices.txt','w') as f:
  writer = csv.writer(f, delimiter=',')
  for stock, price in today_prices.item():
    writer.writerow([stock,price])