Pythonで元CSVファイルの一部列を抜き出す方法

このQ&Aのポイント
  • Pythonで元のCSVファイルの一部列を抜き出す方法を教えてください。
  • 元のCSVファイルから不要な列をカットし、必要な列だけの新しいCSVファイルを作成する方法を教えてください。
  • Pythonを使用してCSVファイルから特定の列を抜き出し、新しいファイルとして保存する方法を教えてください。
回答を見る
  • ベストアンサー

Pythonで元CSVファイルの一部列を抜き出す

Python初心者です。どうぞよろしくお願い致します。 インターネットを色々検索していますが苦戦していますので投稿させてください。 下記のような元CSVファイルから、不要な列だったり、空白の列をカットして 必要な列だけのCSVとして新たなファイルとして出力したいと思っています。 元CSVファイル (上からタイトル行とサンプル2行抜き出し)※Excelでの画像添付しています ID,URI,body,text_author,text_flg,text_source,text_updatetime,text_url,DATE,DATE_2 1, csv://10.182.XXX, "comment A, comment B, comment C", Mr.A, , SourceA, , http://www.yahoo.co.jp, 1.37667E+12, 20130817 2, csv://10.183.XXX, "comment D, comment E, comment F", Mr.B, , SourceB, , http://www.goo.co.jp, 1.37667E+12, 20130817 (期待する出力結果) 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 つまり、元のファイルの列の(一番左がRow(0)として)Row(2),Row(3), Row(5), Row(7), Row(9)だけを 各行抜き出して新たなCSVファイルとして出力したいと思っています。 ちなみに行数は1000の場合も10000の場合もあります。 最初は、gawkで処理しようと思っていましたが、抜き出したいうちのひとつRow(2)には、 不定期で複数のカンマが含まれているため、gawkでは正しく列分類ができず、 Pythonを学習がてらうまくできないかと思っています。 実は締め切りが近いので結構あせっているのですが、(自分のセンスのなさにヘキヘキ・・) どなたかこのようにCSVを処理できるPythonのやり方を教えて頂けないものでしょうか。 どうぞよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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を使う

needpython
質問者

お礼

返信が遅くなり申し訳ありません。そして大変丁寧な解説を頂き本当にありがとうございました。 row(本当は、確かにColumnを使うべきでした・・お恥ずかしい)の数が指定なので、 print '"%s",%s,%s,%s,%s' %(row[2], row[3], row[5], row[7], row[9])を利用したところ とうとう期待通りの結果を導くことができました!! joinメソッドも学習してみます。 大変助かりました。ありがとうございました。

その他の回答 (2)

  • wetti
  • ベストアンサー率66% (2/3)
回答No.2

これでいいんじゃね? csv.reader(csvfile, skipinitialspace=True) CSVは方言が多いから、細かく調整しないだめっすよ http://docs.python.org/2/library/csv.html#csv-fmt-params

needpython
質問者

お礼

ご助言ありがとうございます。CSVはてっきりシンプルな利用しやすいフォーマットと思っていましたが、方言があるとは・・・頂いたリンク改めて参照させていただきます。ありがとうございます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> つまり、元のファイルの列の(一番左が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

needpython
質問者

補足

早速の投稿ありがとうございます。 はい、最初から載せるべきでしたが(すいません)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ででもできたらよいのですが・・・ どうぞよろしくお願いします。

関連するQ&A

  • Python csvについて

    Python 初心者です。 Python/Djangoです。 下記のエラーを解決できなくて!! Exception Type: UnicodeEncodeError Exception Value: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) コードは: def export_excel(request): response = HttpResponse(mimetype='text/csv') response['down.csv'] = 'attachment; filename=down.csv' writer = csv.writer(response) obj_all=User.objects.all() for obj in obj_all: row=[] for field in User._meta.fields: row.append(getattr(obj,field.name)) writer.writerow(row) return response

  • Python Django csv について

    PYthon Django  csv unicod 下記のエラーがでました3時間もやって解決できません、誰かがご教授くだい。 困っています。お願いいたします。 エラー: [u"'\u767b\u9332\u65e5' value has an invalid date format. It must be in YYYY-MM-DD format."] views.py:は以下: def import_csv(request): response = HttpResponse(mimetype='application/vnd.ms-excel; charset=UTF-8') response['Content-Disposition'] = 'attachment; filename=file.csv' reader = csv.reader(response) with open('\Desktop\mkc\Py_meshi\sample.csv', 'r+b') as f: reader = csv.reader(f) for row in reader: tmp = User.objects.create() tmp.UserID = row[0] tmp.user_name = row[1]

  • Powershellでcsvから列を抽出しcsv

    Windows10のPowershellについて教えてください。 コマンドライン上の1行で、CSVを入力して指定する複数の列を抽出し、CSVを作成したいです。行頭に列名はありません。 出力の際に、コンマ(,)は必要です。 例: 5列あるCSVから、2列目と4列目を抽出する 入力    ー>  出力 A,B,C,D,E     B,D F,G,H,J,K     G,J L,M,N,P,Q     M,P よろしくお願いします。

  • CSVファイルの取り込みについて

    CSV取り込み方法について 教えていただきたくお願いいたします。 エクセルのマクロ・VBAの組み方について デスクトップ上の000という名前のCSVファイルを、作業しているエクセルファイルのLoadという名前のシートに貼り付けたいと思っています。 CSVファイルはエクセルで開くと1行に11列の項目が展開されています。 貼り付ける項目はこのようになります。 (CSV) →(エクセルのLoadシート) 1列目(A行)→B行へ 2列目   →C行へ 3列目   →D行へ 4列目   →E行へ 5列目   →F行へ 9列目   →G行へ 10列目  →H行へ 11列目  →I行へ (6.7.8列目は使いません) 最後にLoadのシートのA行に”=B&E”とい式を入力したいと思っています。 まだ初心者なので勉強中なのですが、仕事上急遽必要になりましたのでお願いいたします。

  • マクロCSV出力

    Sheet1に入力されている値をCSVファイルに出力したいと思っております。 但し、特定のセルだけを取得して、1つのファイルに出力したいと思っています。 (1)D2~G2に入力されている値を取得 (2)E4~E10までと、E4~E10の最終列までの値を取得 (3)B11の値を取得 (4)A13~A列の最終行まで、A13~A列の最終行の最終列までの値を取得 (1)、(2)、(3)、(4)の値を取得して、1つのCSVファイルに出力するプログラムを作成したいと思っております。 (1)は1行目に出力 (2)は2行目~8行目に出力 (3)は9行目に出力 (4)は10行目以降に出力 出力の形式は ”TEST”,” ”,”SMP”のようにダブルクォーテーションで値を囲って出力したいと思っています。 値が入っていないセルは” ”,としたいと思っております。 サンプルを作成して頂けないでしょうか。

  • csvしたいのですが

    現在 tab形式で出力している以下のプログラムを CSV形式で出力できるようにしたいのですが、教えてください。 $filename = "history.tab"; header("Content-Type: text/tab-separated-values"); header("Content-Disposition: attachment; filename=$filename"); while($row = mysql_fetch_array($rs)) { $x =$row['sirial'] . "\t". $row['e_date'] . "\t". $row['regdate']."\r\n"; echo mb_convert_encoding($x, "SJIS","EUC-JP");}

    • ベストアンサー
    • PHP
  • csvデータの列の入れ替えができるソフト

    次のようなCSVデータがあります a,b,c,d,e 11,12,13,14,15 21,22,23,24,25 31,32,33,34,35 上記のc列を1番目、次に、b,a,e,dのように列の順番を変えたいと 思っています 変換後は下記のイメージです c,b,a,e,d, 13,12,11,15,14 23,22,21,25,24 33,32,31,35,34 これはイメージであり、CSVの列数は300列程あります a,b,c,d,eの列の並びを指定することにより、全てのデータ が並び替えれるソフトをご存知でしたら教えていただけませんか よろしくお願いします。

  • ファイルを開いた時、CSVデータを自動で取得したい

    毎日送られてくるCSVファイルがあります。 今まで手作業で「更新ファイル.exl」を作成していたのですが、開いた時に 自動更新したいと思い、あちらこちらのサンプルから引用したコードを試みましたが、途中で行き詰ってしまいました。  お力をお借りできれば、幸いです。 やりたことは、(1)「更新ファイル」A列に計算式を入れたい        (2)CSVファイルのA,B列は除き、C列以降を           「更新ファイル」のB列から貼り付けたい 現状では、CSVファイル、更新ファイル共にタイトル行がない状態です。 (タイトル行が必要なら、付け加えてもいいのですが、複数のファイルが この「更新ファイル」から引っ張ったデータを計算式で入れているため、 できるならば現状のままで作りたいのです) CSVファイル  A:年 B:月 C:商品コード1 D:商品コード2 E:支払いコード F:個数 G:金額 2007 5 1004 20 1 10 5000 現状:CSVデータそのままの形式で、「更新ファイル.exl」に出力されてしまうので、下記のように出力したいのです。 更新ファイル A:B&C&D B:商品コード1 C:商品コード2 D:支払いコード E:個数 F:金額 1004201   1004 20 1 10 5000 Private Sub Workbook_Open() Dim Workbooks As Variant Dim Sheets As Variant Dim Filename As Variant ThisWorkbook.Sheets("Sheet1").Activate Cells.Select Selection.ClearContents Filename = Application.GetOpenFilename("CSV ファイル(*.csv),*.csv") With ActiveSheet.QueryTables.Add _ (Connection:="TEXT;" & Filename, Destination:=Range("A1")) .TextFileCommaDelimiter = True .Refresh BackgroundQuery:=False End With End Sub  どこに、どんなコードを入れれば解決できるのか、教えて頂けたら、 うれしく思います。よろしくお願いします。

  • VisualBasicからcsvファイルを読み込む

    VisualBasicからcsvファイルを以下のようなプログラムで読み込んでいます。 Open ファイルパス For Input Shared As #1 Do Until EOF(1): Input #1, A(i), B(i): i = i + 1: DoEvents: Loop Close #1 n行2列のcsvファイルとn行3列のcsvファイルを読み込んだ時に A(2)にセルB1、B(2)にセルB2の値を代入したいです。 現状だとn行3列のcsvファイルを読み込んだ時に A(2)にはセルA3の値が入ってしまいます。 n行3列の3列目のデータは無視したいです。

  • csvファイルのデータ変換について

    OS:windows2000pro VB:VB6.0sp5 c:\data.csv(カンマ区切) のデータ(全6列)で 1列目,2列目,3列目,4列目,5列目,6列目 [変換前(全6列)] abc,a1,aあ b2,3c,4d5e (1行目) ccc,c3,aあ い,3c,4d5e (2行目) bbc,b2,あ b2a,c3,d5e4 (3行目) [変換後(全6列)] abc,a1,"aあ b2",3c,"4d5e" (1行目) ccc,c3,"aあ い",3c,"4d5e" (2行目) bbc,b2,"あ b2a",c3,"d5e4" (3行目) 上記の様に 3列,6列目を「"・・・"」ダブルコーテイションで 囲い(変換し)、c:\data_after.csvというファイル名で 保存する為のプログラムをご教示ください よろしくお願いいたします