ハマっている「お菓子」を教えて!

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のやり方を教えて頂けないものでしょうか。

どうぞよろしくお願い致します。

「Pythonで元CSVファイルの一部列を」の質問画像

A 回答 (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を使う
    • good
    • 0
この回答へのお礼

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

大変助かりました。ありがとうございました。

お礼日時:2013/09/10 12:47

これでいいんじゃね?


csv.reader(csvfile, skipinitialspace=True)

CSVは方言が多いから、細かく調整しないだめっすよ
http://docs.python.org/2/library/csv.html#csv-fm …
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/09/10 12:50

> つまり、元のファイルの列の(一番左が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ででもできたらよいのですが・・・

どうぞよろしくお願いします。

補足日時:2013/09/04 03:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報