pythonにおけるcsvファイルの入出力について。csvは単なるテキストファイルであるけれど、文字コードやら改行コードやらクォーテーションの付け方やらを考えると、色々面倒臭い。
バージョンはpython3.6.4。Pandasは使わず標準のcsvライブラリでやる。たいていの場合Pandas使ったほうが楽ではある。
目次
csvファイルの入出力
文字コードがsjisで改行コードが\r\nのcsvファイル(つまりWindowsで普通に作られた場合)について入力または出力したい場合を考える。また、すべての項目についてダブルクォーテーションで囲っている。
引数にそのようなcsvファイルを取って入力とし、何も改変せずそのまま出力するスクリプトのソースコードを書く。
import csv
import os
import sys
result=[]
fname = sys.argv[1]
# input
with open(fname, newline='', encoding='cp932') as csvfile:
content = csv.reader(csvfile, delimiter=',', lineterminator='\r\n',skipinitialspace=True)
header = True
for row in content:
result.append(row)
outname = "output_" + fname
# output
with open(outname, 'w', newline='', encoding='cp932') as csvfile:
writer = csv.writer(csvfile, delimiter=',', lineterminator='\r\n', quoting=csv.QUOTE_ALL)
writer.writerows(result)
openする際にエンコードを指定し(特に指定しなければutf-8)、csv.readerまたはcsv.writerで、デリミタ・改行コード・クォーテーションの付け方を指定している。skipinitialspaceは、Trueにすると,区切りの後に余分な空白があったとき無視してくれる。
全角半角変換の処理を加える
簡単な処理、たとえば英数字は半角、日本語については全角にするような処理を加えてみる。処理についてはmojimojiライブラリを使わせていただいた。
スクリプトの引数は複数のcsvファイルとする。
import csv
import os
import sys
import mojimoji
def zenhan(val):
val = str(val)
val = mojimoji.zen_to_han(val, kana=False)
val = mojimoji.han_to_zen(val, digit=False, ascii=False)
return val
if __name__ == '__main__':
if len(sys.argv) == 1:
sys.exit()
fnames = sys.argv[1:]
for fname in fnames:
result=[]
with open(fname, newline='', encoding='cp932') as csvfile:
content = csv.reader(csvfile, delimiter=',', lineterminator='\r\n')
for row in content:
rrow = [zenhan(val) for val in row]
result.append(rrow)
outname = "output_" + fname
with open(outname, 'w', newline='', encoding='cp932') as csvfile:
writer = csv.writer(csvfile, delimiter=',', lineterminator='\r\n', quoting=csv.QUOTE_ALL)
writer.writerows(result)
読み込みの際に処理を加えている。
参考
参考にさせていただきました。ありがとうございます。
コメント