follow us in feedly

Windows版Python3でCSVをSQLiteに保存する

前回のWindows版PHPでのCSVパース問題を解決するためPythonを採用しました。
今回は、そのWindows + PythonでCSVを取り込む方法をご紹介します。
詳細な解説はほとんどなく、ほぼソースコードのみです。

環境

  • Windows 7
  • Python 3.6.3

ソースコード

CSVを読み込んでデータベースに保存します。
仕事で作ったものなので改変しています。

# -*- coding: utf-8 -*-

import os
import io
import sys
import csv
import sqlite3

# 標準出力の文字コードをUTF-8にする
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

# ディレクトリを移動
os.chdir(r'C:\Users\77dogs\Sample')

# データベースに接続
conn = sqlite3.connect('db\contents.sqlite3')
c = conn.cursor()

# contentsテーブルのカラムを取得
sql = 'SELECT * FROM contents LIMIT 1'
c.execute(sql)
columns = []
for row in c.description:
    columns.append(row[0])

sql = 'INSERT INTO contents (%s) VALUES (%s)' \
        % (','.join(columns), ('?,' * len(columns)).rstrip(','))

# CSVの読み込み & 保存
with open('csv\data.csv', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile, delimiter=',', quotechar='"')
    next(reader)  # ヘッダ読み捨て

    for row in reader:
        c.execute(sql, tuple(row))  # SQLを実行
        conn.commit()  # commit()は必須

conn.close()

標準出力の文字コードを変更する

MSYS2にprint()で出力したときに文字化けしたのでその対策。
sys.stdoutのデフォルトの文字コードはCP932なのでUTF-8に変更。
ちなみに、上記ソースコードにはprint()はありません。

print(sys.stdout.encoding)  # cp932
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
print(sys.stdout.encoding)  # utf-8

raw文字列によってエスケープシーケンスを無効にする

エスケープシーケンス(\n, \t など)として解釈してほしくない場合の対策。
下記の場合は、「\U」があるのでraw文字列でないとエラーになる。

# SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
os.chdir('C:\Users\77dogs\Sample')

# raw文字列(r'文字列')だとエスケープシーケンスを無効化
os.chdir(r'C:\Users\77dogs\Sample')

まとめ

Windows + Python3を使って無事にCSVの取り込むができました。
情報もたくさんあるので、多少のつまづきはあったものの簡単に実装できました。
ファイルパスにバックスラッシュを使う場合はエスケープシーケンスに注意です。
はじめてのPython成果物ですが参考になれば幸いです。

参考

sys.stdout のエンコードを変更する in Python3.0
raw文字列 – 文字列 – Python入門
エスケープシーケンス – 文字列 – Python入門
Pythonでsqlite

タグ: ,

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください