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のやり方を教えて頂けないものでしょうか。
どうぞよろしくお願い致します。
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を使う
返信が遅くなり申し訳ありません。そして大変丁寧な解説を頂き本当にありがとうございました。
row(本当は、確かにColumnを使うべきでした・・お恥ずかしい)の数が指定なので、
print '"%s",%s,%s,%s,%s' %(row[2], row[3], row[5], row[7], row[9])を利用したところ
とうとう期待通りの結果を導くことができました!!
joinメソッドも学習してみます。
大変助かりました。ありがとうございました。
No.2
- 回答日時:
これでいいんじゃね?
csv.reader(csvfile, skipinitialspace=True)
CSVは方言が多いから、細かく調整しないだめっすよ
http://docs.python.org/2/library/csv.html#csv-fm …
ご助言ありがとうございます。CSVはてっきりシンプルな利用しやすいフォーマットと思っていましたが、方言があるとは・・・頂いたリンク改めて参照させていただきます。ありがとうございます。
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
この回答への補足
早速の投稿ありがとうございます。
はい、最初から載せるべきでしたが(すいません)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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSVファイルの時刻の形式について
-
accessでクエリをExcelにエクス...
-
Acrobat参照設定
-
COBOL、項目末尾に空白がある場...
-
コマンドプロンプトのテキスト...
-
指定されたファイルの関数名・...
-
クエリをエクセルファイルへの出力
-
VB6.0でExcel,PDF,Word出力方法
-
Delphiでdebug構成とrelease構...
-
Eclipseで検索ができなくなった
-
テキストファイルの一部分を抽...
-
【Excel VBA】取り込んだファイ...
-
テキストファイルをSQLServerデ...
-
0バイトのテキストファイル
-
テキストファイルの特定行の削...
-
既存のテキストファイルを開く方法
-
STM32 Nucleo-F446REでデータを...
-
CreateFile関数を用いたファイ...
-
フリーツール「PDF Image Extra...
-
StreamReaderで読み込んだファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CSVファイルの時刻の形式について
-
accessでクエリをExcelにエクス...
-
Thunderbird 受信メールからの...
-
COBOL、項目末尾に空白がある場...
-
コマンドプロンプトのテキスト...
-
ファイナルカットで編集した動...
-
Acrobat参照設定
-
accessのリポートを、excelに出...
-
EXCEL VBAでのCSVファイル読み...
-
AccessのレポートからPDFをペー...
-
WshShellから起動したbat(ftp)...
-
Excel で「OLE は現在使用でき...
-
VB.NET操作で Excelにビットマ...
-
“ファイルに出力”した印刷ファ...
-
iTextでPDFを表示させたら日本...
-
アクセス→エクセルへエクスポー...
-
ショートカットで起動した場合...
-
Aviutlというソフトのプラグイ...
-
VB6からEXCEL2007へ出力は可能?
-
PHP:unzipコマンドにおけるエ...
おすすめ情報