Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

q13, q14, q15, q16 を解答 #31

Open
wants to merge 9 commits into
base: inaoka
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions chap02/col1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
高知県
埼玉県
岐阜県
山形県
山梨県
和歌山県
静岡県
山梨県
埼玉県
群馬県
群馬県
愛知県
千葉県
静岡県
愛媛県
山形県
岐阜県
群馬県
千葉県
埼玉県
大阪府
山梨県
山形県
愛知県
24 changes: 24 additions & 0 deletions chap02/col2.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
江川崎
熊谷
多治見
山形
甲府
かつらぎ
天竜
勝沼
越谷
館林
上里見
愛西
牛久
佐久間
宇和島
酒田
美濃
前橋
茂原
鳩山
豊中
大月
鶴岡
名古屋
8 changes: 8 additions & 0 deletions chap02/q13.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# coding: utf-8

with open("col1.txt", "r") as col1_f,\
open("col2.txt", "r") as col2_f,\
open("col12.txt", "w") as col12_f:
for col1, col2 in zip(col1_f, col2_f):
print(col1.rstrip(), col2.rstrip(), sep="\t", file=col12_f)
# paste col1.txt col2.txt
14 changes: 14 additions & 0 deletions chap02/q14.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# coding:utf-8
import sys

args = sys.argv
n = int(args[1])
path = args[2]

with open(path, "r") as fin:
for idx, line in enumerate(fin):
if n <= idx:
break
print(line, end="")
# python q14.py 4 col1.txt
# head -n 4 col1.txt
13 changes: 13 additions & 0 deletions chap02/q15.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# coding:utf-8

import sys
from collections import deque

args = sys.argv

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これくらい単純なプログラムはsys.argvでも良いと思います。
高機能なargparseが使えるようになると、言語処理では結構できることが広がるかと

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

外部ライブラリを何かライブラリを使うなら clickってやつがオススメです.
http://click.pocoo.org/5/

n = int(args[1])
path = args[2]

with open(path, "r") as fin:
print(*deque(fin, n), sep="", end="")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このdequeの使い方いいね:+1:

# python q15.py 4 col1.txt
# tail -n 4 col1.txt
33 changes: 33 additions & 0 deletions chap02/q16.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# coding:utf-8

import sys
from itertools import islice


def count_file_lines(f):
for i, line in enumerate(f):
pass
f.seek(0)
return i + 1


def devide_num(dividend, divisor):
quotient = dividend // divisor
remainer = dividend % divisor
return (quotient + 1,) * remainer + (quotient,) * (divisor - remainer)


if __name__ == '__main__':
args = sys.argv
n = int(args[1])
path = args[2]
with open(path, "r") as f:
total_line_num = count_file_lines(f)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

行数数えるときはジェネレータ式を使ってシアみたいな書き方すると見やすいです。

n_lines = sum(1 for _ in open('file'))

l = devide_num(total_line_num, n)
for i, line_num in enumerate(l):
Copy link

@takegue takegue Dec 2, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

N分割するための処理ですが, 以下のような書き方もできますね.

from itertools import zip_longest
def grouper(iterable, n)
    it = [iter(iterable)] * n
    return zip_longest(*it, fillvalue='')

# M行(=math.ceil(n_lines / N) )にまとめる処理はこっちの方が書きやすいですね
for idx, lines in grouper(file, n_lines // N):
     with open('{}.{}'.format(path, idx), 'w') as fout:
             print( ''.join(lines).strip(),  file=fout)  
from itertools import groupby
# N分割する処理はこっちの方が書きやすいですね
for idx, lines in groupby(enumerate(file), key=lambda idx, line: idx//N):
     with open('{}.{}'.format(path, idx), 'w') as fout:
             print(''.join(lines).strip(),  file=fout)   #連続する改行をstripで消しています

with open("{}.{}".format(path, i), "w") as fout:
for line in islice(f, line_num):
print(line, end="", file=fout)

# python q16.py 5 col1.txt
# split -l 5 col1.txt