- 본문의 내용은 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])