Featured image of post pythonでcsvファイルの入出力。エンコードとか改行コードとか考慮しつつ

pythonでcsvファイルの入出力。エンコードとか改行コードとか考慮しつつ

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)
 `

読み込みの際に処理を加えている。

参考

参考にさせていただきました。ありがとうございます。

コメント

コメントは承認後に表示されます。

まだコメントはありません。

コメントを書く

或る阿呆の記.
Hugo で構築されています。
テーマ Stack は Jimmy によって設計されています。