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

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

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2399閲覧

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

kanpan

総合スコア20

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/26 07:48

編集2018/11/27 09:03

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

1~ 703~ 1755~ 3157~ 4909~

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

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

投稿2018/11/26 08:34

can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kanpan

2018/11/26 09:14

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

2018/11/26 09:16

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

2018/11/27 09:02

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

2018/11/27 09:04

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問