- ベストアンサー
Pythonで元CSVファイルの一部列を抜き出す方法
- Pythonで元のCSVファイルの一部列を抜き出す方法を教えてください。
- 元のCSVファイルから不要な列をカットし、必要な列だけの新しいCSVファイルを作成する方法を教えてください。
- Pythonを使用してCSVファイルから特定の列を抜き出し、新しいファイルとして保存する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1補足について。 出力されたCSVを、テキストエディタで開いてください。 # Excelで開くと、中身が解釈されて、どんな状態か判断しずらくなります。 インタプリタでの出力と同じ内容になっているはずです。 インタプリタでの結果は comment A, comment B, comment C Mr.A SourceA http://www.yahoo.co.jp 20130817 ですから、CSVとして解釈すると comment A comment B comment C Mr.A SourceA http://www.yahoo.co.jp 20130817 の3項目となります。 出力させたいのは、 "comment A, comment B, comment C",Mr.A,SourceA,http://www.yahoo.co.jp,20130817 というのでは? CSVで "~" と"でくくってあったら、その中身が項目の本体です。ですから、"を取った状態で取り込むのが普通です。 その状態が row[2]です。 逆に、CSVに出力するなら、 ""でくくらないと、項目内の文字としてのカンマではなく、項目区切りのカンマだと解釈されてしまいます。 ですから、"で括って出力するようにします。例えば、 '"'+row[2]+'"' とか。 printに,で複数の項目を指定すると、それぞれの間をスペースで区切って出力されます。 CSVとしてカンマ区切りにするなら、次の方法のいずれかを使います。 ・文字列のjoinメソッドを使う(csvモジュールのマニュアルのサンプロコードにある例) ・数が固定なら、%で書式指定する 例) print '"%s",%s,%s,%s,%s' %(row[2], row[3], row[5], row[7], row[9]) ・print関数のsep=で指定する。(Python3,あるいは2.6以降でprint関数有効時) ・csv.writerを使う
その他の回答 (2)
- wetti
- ベストアンサー率66% (2/3)
これでいいんじゃね? csv.reader(csvfile, skipinitialspace=True) CSVは方言が多いから、細かく調整しないだめっすよ http://docs.python.org/2/library/csv.html#csv-fmt-params
お礼
ご助言ありがとうございます。CSVはてっきりシンプルな利用しやすいフォーマットと思っていましたが、方言があるとは・・・頂いたリンク改めて参照させていただきます。ありがとうございます。
- kmee
- ベストアンサー率55% (1857/3366)
> つまり、元のファイルの列の(一番左がRow(0)として)Row(2),Row(3), Row(5), Row(7), Row(9)だけを各行抜き出して新たなCSVファイルとして出力したいと思っています。 # Rowが行なので、この場合はColの方があってると思いますが、それはともかく。 まさに、その通りに作ればいいのでは? 1行読み込む ↓ カラムに分解 ここで Row=["1", "csv://10.182.XXX", "comment A, comment B, comment C", "Mr.A", , "SourceA", , "http://www.yahoo.co.jp", "1.37667E+12"," 20130817"] というような状態になる ↓ 必要な箇所だけをカンマで区切って出力 ""を使っているので、ちょっとややこしいですが、csvモジュールを使うと比較的簡単にできるのでは。 http://docs.python.jp/2/library/csv.html
補足
早速の投稿ありがとうございます。 はい、最初から載せるべきでしたが(すいません)csvモジュールクラスを使っているのですが 期待通りにならない状況です。 import csv filename = "samplebefore.csv" csvfile = open(filename) #print csvfile output = open("cleaned.csv","w") for row in csv.reader(csvfile): # print row # 1行のリスト print row[2], row[3], row[5], row[7], row[9] csvfile.close() 上記のようにすると、標準出力のPrintでは下記のとおりうまく言っている気がするのですが、 それをファイルに出力しようとするところでスタックしております。。。 ============= Pythonインタプリタでは >>> body text_author text_source text_url DATE_2 comment A, comment B, comment C Mr.A SourceA http://www.yahoo.co.jp 20130817 comment D, comment E, comment F Mr.B SourceB http://www.goo.co.jp 20130817 >>> =========== Winコマンドプロンプトで下記のようにすると 09/02/2013 Mon 18:52:05.35 C:\Python27>python icanick.py >output2.csv 上記のCommentAやCommentBがもともとカラムの中にあるコンマで分断されてしまいます。 そこを [comment A, comment B, comment C] [Mr.A] [SourceA] [http://www.yahoo.co.jp] [20130817]のように出力できないかと苦心しています。gawkででもできたらよいのですが・・・ どうぞよろしくお願いします。
お礼
返信が遅くなり申し訳ありません。そして大変丁寧な解説を頂き本当にありがとうございました。 row(本当は、確かにColumnを使うべきでした・・お恥ずかしい)の数が指定なので、 print '"%s",%s,%s,%s,%s' %(row[2], row[3], row[5], row[7], row[9])を利用したところ とうとう期待通りの結果を導くことができました!! joinメソッドも学習してみます。 大変助かりました。ありがとうございました。