サラリーマンのすらすらIT日記

IT関連を中心とした日々を綴ります。
--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2013/10/04

Pythonでcsv処理

2つのアプリ間でデータをやり取りするのにCSVファイルを使うのですが、インポート側には必要のない項目があるので、Excelで言えば「列の削除」をしたいところ。この列の削除処理は自動化したいので、Excelは使えません。テキストファイルの整形なのでawkが使えそうですが、awkではこちらが期待するカンマ区切りをしてくれません(たぶん)。"こちらが期待する"とは何かというと、データ中にカンマがある場合でもうまく処理してくれること。つまり

123,"a,b,c",45

をカンマ区切りで分割する時、「123」、「a,b,c」、「45」の3つに分けたいのに、awkでFS=","とすると、「123」、「"a」、「b」、「c"」、「45」となってしまいます。

こういう時以前はPHPを使っていたのですが、書くのがだるいようなコードだったように記憶しています。以前書いたものをコピペしてもいいのですが、確かPythonだと簡単だったことを思い出し、Pythonでやることに。

まずWindowsにPythonをインストールします(おいおい!インストールもしていないのにPythonでやるのか、と言われそう)。Python2.7にするか3.3にするか少し考えましたが、フレームワークを使うわけでもないので、3.3に決めてダウンロード・インストール。

次にサンプルコードをWebで検索して、こんなコードを書きました。

# -*- coding: shift_jis -*-
import csv
import sys
infile = open('c:\\in.csv', 'rt')
outfile = open('c:\\out.csv', 'wt')

try:
reader = csv.reader(infile)
writer = csv.writer(outfile, quoting=csv.QUOTE_NONNUMERIC)
rowNo = 0
for row in reader:
if rowNo != 0:
newrow = [row[1], row[2], row[4], row[5], row[6], row[7], row[8], row[9], row[10]]
writer.writerow(newrow)
rowNo = rowNo + 1
finally:
infile.close()
outfile.close()

第0列と第3列を削除しています。また1行目はヘッダーなので、スキップするためにrowNoという変数を使っています。1行目をスキップするのにreader.next()とすればよいと書かれたWeb情報が多いのですが、私の環境ではエラー。どうやらこの書き方はPython2.xのようで、Python3.xではnext(reader)と書くようです。

try:
reader = csv.reader(infile)
writer = csv.writer(outfile, quoting=csv.QUOTE_NONNUMERIC)
next(reader)
for row in reader:
newrow = [row[1], row[2], row[4], row[5], row[6], row[7], row[8], row[9], row[10]]
writer.writerow(newrow)

これですっきりしました。

スポンサーサイト

コメント

コメントの投稿

  • URL
  • コメント
  • パスワード
  • 秘密
  • 管理者にだけ表示を許可する

トラックバック

トラックバックURL:http://sookibizviz.blog81.fc2.com/tb.php/1703-9878c4f1

■  カレンダー

09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

■  プロフィール

sookibizviz

Author:sookibizviz
仕事の内容やソフトの紹介を交えながら、日々の悪戦苦闘を綴っていきます。

■  最新記事

■  最新コメント

■  最新トラックバック

■  月別アーカイブ

■  カテゴリ

未分類 (64)
BizViz (24)
IT (1119)
計量 (76)
環境 (26)
数学 (181)
ニュース (46)
本 (187)
音楽 (113)
囲碁 (5)
将棋 (26)
ブログ (14)
日記 (19)

■  FC2カウンター

■  検索フォーム

■  RSSリンクの表示

■  QRコード

QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。