質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.63%

PythonでCSVファイルを分割したい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,905

kanpan

score 20

pythonで26456件あるデータを350件ずつ分割したいと考えています。
しかし、下記のソースコードを動作させても、11個目までは正常に動作をするのですが、それ以降はcsvファイルは作られているものの、中に書き込みがされておらず、空のファイルが出力されています。なぜ書き込みがされないのでしょうか?

ソースコード

import csv

csv_file = open("./posneg_train.csv", "r", encoding="ms932", errors="", newline="" )
f1 = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

for i in range(76):
    stri = str(i+1)
    count = 0
    start = 350 * i
    end = 350 + start + 1
    data = open('posneg_train_'+ stri + '.csv','w',newline="")
    for row in f1:
        if count < start:
            count += 1
            continue
        if count >= end:
            break

        if count == start:
            w = csv.writer(data)
        w.writerow([row[0],row[1]])
        count += 1
    data.close()

備考

if i == 11:
    print(count)


という文を

for row in f1:


のあとに挿入してみた結果、countの値が3333で止まっていることが確認されました。

if i == 12:
    print(count)


にしたらcountの値が出力すらされませんでした。

解決後のプログラム

import csv

csv_file = open("./posneg_train.csv", "r", encoding="ms932", errors="", newline="" )
f1 = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

i = 0
stri = str(i+1)
count = 0
start = 0
end = 350
data = open('posneg_train_'+ stri + '.csv','w',newline="")
for row in f1:
    if count < start:
        count += 1
        continue
    if count >= end:
        data.close()
        i += 1
        stri = str(i+1)
        start = count
        end = start + 350
        data = open('posneg_train_'+ stri + '.csv','w',newline="")

    if count == start:
        w = csv.writer(data)
    w.writerow([row[0],row[1]])
    count += 1
csv_file = open("./posneg_test.csv", "r", encoding="ms932", errors="", newline="" )
f2 = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

i = 0
stri = str(i+1)
count = 0
start = 0
end = 350
data = open('posneg_test_'+ stri + '.csv','w',newline="")
for row in f2:
    if count < start:
        count += 1
        continue
    if count >= end:
        data.close()
        i += 1
        stri = str(i+1)
        start = count
        end = start + 350
        data = open('posneg_test_'+ stri + '.csv','w',newline="")

    if count == start:
        w = csv.writer(data)
    w.writerow([row[0],row[1]])
    count += 1
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

各出力ファイルの先頭行のデータ(読込データ行)は以下のようになっています

1703175531574909


また、各ファイルは350行ではなく351行出力されています。
すなわちstart,end,countの計算に誤りがあるので、それらを修正する必要があります。
しかしコードが複雑なので、以下のような流れにコードを書き換えたほうがよいと思います。

出力ファイル=None
すでに出力した行数=350
出力ファイル番号=1
読込ファイルループ
    出力行数が350以上になった
        以前の出力ファイルが開いていたら閉じて、出力ファイルを開く
        出力ファイル番号をインクリメントする
    ファイルを読込、ファイルに書き込む
    出力行数をインクリメントする
出力ファイルが開いていたら閉じる

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/26 18:14

    できました。
    ありがとうございました。

    キャンセル

  • 2018/11/26 18:16

    よかったです。どのような手段、コードで解決されましたか?

    キャンセル

  • 2018/11/27 18:02

    iのループをなくして読み込みデータのループ中にcountの値がendに達したら、今までの出力データを閉じて、新しくデータを開き、startとendの値を更新させるようにしました。

    キャンセル

  • 2018/11/27 18:04

    質問の最後に解決後のプログラムを追記しておきました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る