開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Python (プログラミング言語)
初めてのコンピュータサイエンス(Jennifer Campbell、Paul Gries、Jason Montojo、Greg Wilson(著)長尾 高弘(翻訳))の8章(ファイル処理)、8.8(練習問題)、3.を解いてみる。
8.8(練習問題)、3.
コード(BBEdit)
sample.py
#!/usr/bin/env python3.3
#-*- coding: utf-8
fields = (((4, int), (2, int), (2, int)),
((2, int), (2, int), (2, int)),
((2, int), (2, int), (2, int)),
((6, float), (6, float), (6, float)))
def readWeatherData(r, fields):
result = []
for line in r:
start = 0
record = []
for field in fields:
group = []
for width, target_type in field:
text = line[start:start+width]
value = target_type(text)
group.append(value)
start += width
record.append(tuple(group))
result.append(tuple(record))
return result
def readWeatherDataWrap(r):
fields = (((0, int), (4, int), (6, int)),
((8, int), (10, int), (12, int)),
((14, int), (16, int), (18, int)),
((20, float), (26, float), (32, float)))
new_fields = []
new_field = []
flag1 = True
temp_i = 0
temp_target_type = ""
for field in fields:
flag2 = True
for i, target_type in field:
if flag1:
flag1 = False
flag2 = False
else:
new_field.append((i - temp_i, temp_target_type))
if flag2:
new_fields.append(tuple(new_field))
new_field = []
flag2 = False
temp_i = i
temp_target_type = target_type
else:
for line in r:
new_field.append((len(line) - temp_i, temp_target_type))
new_fields.append(tuple(new_field))
break
r.seek(0)
new_fields = tuple(new_fields)
return readWeatherData(r, new_fields)
with open('weather.txt') as f:
records = readWeatherData(f, fields)
for record in records:
print(record)
print("ラッパ関数")
f.seek(0)
records = readWeatherDataWrap(f)
for record in records:
print(record)
入出力結果(Terminal)
$ cat weather.txt 20070503241737385605100.00121.3016.370 20070503241737385605100.00121.3016.370 $ ./sample.py ((2007, 5, 3), (24, 17, 37), (38, 56, 5), (100.0, 121.3, 16.37)) ((2007, 5, 3), (24, 17, 37), (38, 56, 5), (100.0, 121.3, 16.37)) ラッパ関数 ((2007, 5, 3), (24, 17, 37), (38, 56, 5), (100.0, 121.3, 16.37)) ((2007, 5, 3), (24, 17, 37), (38, 56, 5), (100.0, 121.3, 16.37)) $
0 コメント:
コメントを投稿