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

[最終更新] 2018年1月29日

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)

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

参考

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

関連コンテンツ

関連記事

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。