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

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

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

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

Python

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

Q&A

解決済

4回答

13829閲覧

pythonでcsvファイルのある行を削除したい

sodiumplus3

総合スコア71

CSV

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

Python

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

0グッド

1クリップ

投稿2019/02/18 15:57

編集2019/02/20 13:22

###pythonでcsvファイルのある行を削除
例えば

sample.csv

11,2,3 24,5,6 37,8,9

というcsvファイルに対して1行目だけを削除する、といった具合です。書き込むにはwriterow()を使えばいいですが、削除はどうすればいいでしょうか。
ただし速さが肝心の処理なので(それゆえpandasやfor文の使用などはしたくないです)、そこを考慮いただいた回答であるとありがたいです。

追記:具体的にやりたい処理は1~500行目くらいまでを削除する操作です(ぼかす意図はありませんでした)
どうしてもpythonである必要はないですが、他の言語を使う<速さを諦める程度の感じです。

追記2:頑張って具体的に書いてみます。対象のcsvファイルは10000行程度のファイルですが、300行/sくらいのスピードで増えていきます。しかし増え続けると読み込みの際の時間が無限に増えていってしまうので①対象のcsvから古い行を削除していく②書き込むcsvファイルを新しいものに変えていく、のどちらかの対策を取ろうと思いました。今回の質問は①の方法ができないかと考え、したものです。対象csvを読み込むプログラムと同じところに削除するシステムも組み込もうとしたので速さが重要だと書きましたが、別ファイルから対象のcsvをいじる操作でも良いとは思います。(しかし現状以下の画像のような謎の行が挿入されてしまいうまくいっていません)
イメージ説明

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

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

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

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

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

KojiDoi

2019/02/18 18:56

どうしてもpythonでないとダメなんでしょうか。unix系ならsedが一番手っ取り早そうに思えますが。
Q71

2019/02/19 06:58

毎回1行目だけ削除ですか?仕様の肝だと思いますが、そこをぼかす?
KojiDoi

2019/02/19 18:26

ぼかす意図がなくても、やりたいことが伝わらなければ期待した答えは得られませんよ。 500行ぐらいまでの削除? それは当初の質問にあった最初の1行だけ削除というのは随分様子が違うように思いますが。「ぐらい」といいますがファイルごとに300行だったり550行だったりするのですか? そもそも対象ファイルの大きさは? 全体が700行のファイルが対象のときと100万行のファイルが対象のときではふさわしい手法がたぶん違ってきますよ?
KojiDoi

2019/02/20 13:32

あなたが考えるべきことは「行を削除する」ではなく「行を読み飛ばす」です。 おそらく「読み込みの際の時間」よりは「行を削除して書き込む」のほうが時間がかかるので、あなたの抱えている問題は解決できません。 そもそもその状況だと、どこまで読み進めたかを管理しないことにはどこまでを削除するかが判断できないでしょう。非常にややこしいことになりそうな気がします。
Q71

2019/02/21 06:33

KojiDoiさんのコメントに加えて、 書き込み中は、他のプロセスからファイルを書き込むことができないので、「ある時点のコピーを作る」しかできません。(できない、ではないが、ファイルが壊れる) お使いのフレームワークによっては、書き込むときに一定の条件を満たせば別のファイル名で書き込む、ようなこともできます。 一旦質問を閉じ、何が問題か、その問題を解決するために考えたことを整理し、あらためて質問し直すとこを勧めます。 今回は、問題解決のアプローチを間違っていると思います。
guest

回答4

0

速さが必要なら、Pythonなど使ってはいけません。

1行目だけを削除する

のであれば、以下です。

Bash

1sed '1d' csvファイル > new.csv

Pythonなど不要、そう、シェル芸ならね!!

投稿2019/02/18 23:19

kazto

総合スコア7196

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

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

0

どうしてもpythonを使いたい場合はこんな感じ。
この程度であればループを使わない方法は幾らでもありそうなので、とりあえず4通り羅列してみました。
実際にどれが高速なのかは全く確認しておりませんので、必要であれば比較してみてください。

  • Pandasにて read_csv()のパラメータにskiprow=1使う方法

Python

1import pandas as pd 2pd.read_csv('in.csv', header=None, skiprows=1).to_csv('out.csv',index=False, header=False)
  • Pandasを使い スライスで2行目以降を保存する方法

Python

1import pandas as pd 2pd.read_csv('in.csv', header=None)[1:].to_csv('out.csv',index=False, header=False)
  • Numpyにて loadtxt()のパラメータに skiprow=1を使う方法

Python

1import numpy as np 2np.savetxt('out.csv', np.loadtxt('in.csv', delimiter=',', skiprows=1), fmt='%d', delimiter=',')
  • Numpyを使い スライスで2行目以降を保存する方法

Python

1import numpy as np 2np.savetxt('out.csv', np.loadtxt('in.csv',delimiter=',')[1:,:], fmt='%d', delimiter=',')

投稿2019/02/18 23:39

magichan

総合スコア15898

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

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

0

自己解決

たくさん回答ありがとうございます。言われたように、問題解決方法を改めて考え直してみます。

投稿2019/02/21 14:14

sodiumplus3

総合スコア71

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

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

0

csvファイルのある行を削除するには、

  1. csvファイルを読み込む。
  2. ある行を検索する。
  3. ある行を削除する。
  4. 削除後のデータをcsvファイルへ書き込む。

となるため、単純にcsvファイルに行を追加するよりも複雑になります。

for文を使いたくたいのであれば、「ある行を検索する」の部分をキャッシュするなど何かしら工夫する必要がありそうです。

投稿2019/02/18 22:00

nskydiving

総合スコア6500

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問