自然言語処理100本ノック2020から逃げるな「16. ファイルをN分割する」

これは自然言語処理100本ノック2020に挑んだ、とある人間の記録
他の問題はこちら → 自然言語処理100本ノック2020から逃げるな まとめ

16. ファイルをN分割する

自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.

Pythonコード

import sys

path = sys.argv[1]
N = int(input('N = '))

# n分割目のファイルの行の始まりを計算
def linestart(lines, n):
    # n分割目 * 1ファイル当たりの行数 + 端数
    return n * int(len(lines) / N) + min(len(lines) % N, n)


with open(path) as f:
    lines = f.readlines()
    for n in range(N):
        with open('output' + str(n), 'w') as w:
            w.write(''.join(lines[linestart(lines, n): linestart(lines, n + 1)]))

確認用UNIXコマンド

私の環境は少し特殊(fish)なので、もしかしたら動かないかも。

split -n $1 ../popular-names.txt output_unix_

$1はNの値。

実行結果

N = 3の場合。 927行、927行、926行に分割される。

長いので最初と最後のみ。

output0
Mary  F   7065    1880
Anna    F   2604    1880
Emma    F   2003    1880
Elizabeth   F   1939    1880
Minnie  F   1746    1880

...

Betty   F   32964   1926
Helen   F   26884   1926
Margaret    F   23070   1926
Ruth    F   20223   1926
Doris   F   16298   1926
output1
Virginia F   16162   1926
Mildred F   13551   1926
Frances F   13355   1926
Robert  M   61130   1926
John    M   56110   1926

...

Nicole  F   15752   1972
Michael M   71405   1972
Christopher M   52189   1972
James   M   47083   1972
David   M   46366   1972
output2
John M   43181   1972
Robert  M   43037   1972
Jason   M   37446   1972
Brian   M   36322   1972
William M   30529   1972

...

Benjamin    M   13381   2018
Elijah  M   12886   2018
Lucas   M   12585   2018
Mason   M   12435   2018
Logan   M   12352   2018