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で質問しましょう!
似たような質問が見つかりました
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- その他(プログラミング・Web制作) pythonのpandasのcsvの外部結合(outer_join)した際に列が想定とは異なる事象 1 2022/05/25 13:23
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- PHP 値の取り出し方について教えて下さい。 1 2023/03/31 13:30
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) 配列にしたセル範囲でのコメントがあるかどうかを取得するコードの書き方 2 2022/09/17 05:09
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- HTML・CSS HTMLタグのあるCSVファイルを利用する方法 4 2023/03/19 14:41
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
accessでクエリをExcelにエクス...
-
CSVファイルの時刻の形式について
-
“ファイルに出力”した印刷ファ...
-
COBOL、項目末尾に空白がある場...
-
Thunderbird 受信メールからの...
-
コマンドプロンプトのテキスト...
-
AccessのレポートからPDFをペー...
-
COBOL FILLER
-
コマンドプロンプト)フォルダ...
-
Fortranでの出力ファイル
-
VB6.0でExcel,PDF,Word出力方法
-
Apacheのエラーログのログレベ...
-
EXCEL VBAでプリントイメージフ...
-
iTextでPDFを表示させたら日本...
-
WshShellから起動したbat(ftp)...
-
全てのグリフの一覧を出力する...
-
VB.NET操作で Excelにビットマ...
-
Studio One 3 でwavファイルの合成
-
エクセルのvbaで、指定した範囲...
-
ショートカットで起動した場合...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
accessでクエリをExcelにエクス...
-
CSVファイルの時刻の形式について
-
コマンドプロンプトのテキスト...
-
COBOL、項目末尾に空白がある場...
-
Thunderbird 受信メールからの...
-
VB6.0でExcel,PDF,Word出力方法
-
ショートカットで起動した場合...
-
AccessのレポートからPDFをペー...
-
accessのリポートを、excelに出...
-
Acrobat参照設定
-
Excel で「OLE は現在使用でき...
-
ファイナルカットで編集した動...
-
WshShellから起動したbat(ftp)...
-
COBOL FILLER
-
エクセルが裏で動いたままなん...
-
Fortranでの出力ファイル
-
マクロについて質問です。 現在...
-
TransferSpreadsheetでフルパス...
-
iTextでPDFを表示させたら日本...
-
ACCESS2002(or2003)の日付表示...
おすすめ情報