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) `
読み込みの際に処理を加えている。
参考
参考にさせていただきました。ありがとうございます。

コメント
コメントは承認後に表示されます。
まだコメントはありません。
コメントを書く