質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1288閲覧

csvファイルの読み込みと挿入時のエラー

hamazon

総合スコア16

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/28 04:04

前提・実現したいこと

入門Python3(オライリー・ジャパン)p272の復習課題8-7において、前問の8-6で作成したbooks.csvを読み出し、そのデータをbookテーブルに挿入したいです。ちなみに8-6は「sqlite3モジュールを用いて、books.dbというSQLiteデータベースを作り、その中にtitle(文字列)、'year'(整数)というフィールドを持つbookというテーブルを作ろう」です。正しく動作すれば以下のように表示されます。

Python3

1#8-6(bookというテーブルを作成) 2>>> import sqlite3 3>>> db = sqlite3.connect('books.db') 4>>> curs = db.cursor() 5>>> curs.execute('''create table book (title text, author text, year int)''') 6<sqlite3.Cursor object at 0x1090561f0> 7>>> db.commit() 8#8-7(book.csvを読み出し、そのデータをbookテーブルに挿入) 9>>> import csv 10>>> import sqlite3 11>>> ins_str = 'insert into book values(?, ?, ?)' 12>>> with open('books.csv', 'rt') as infile: 13... books = csv.DictReader(infile) 14... for book in books: 15... curs.execute(ins_str, (book['title'], book['author'], book['year'])) 16... 17<sqlite3.Cursor object at 0x1007b21f0> 18<sqlite3.Cursor object at 0x1007b21f0> 19<sqlite3.Cursor object at 0x1007b21f0> 20<sqlite3.Cursor object at 0x1007b21f0> 21<sqlite3.Cursor object at 0x1007b21f0>

発生している問題・エラーメッセージ

以下のようにKeyErrorが発生します。

該当のソースコード

Python3

1>>> import csv 2>>> import sqlite3 3>>> ins_str = 'insert into book values(?, ?, ?)' 4>>> with open('books.csv', 'rt') as infile: 5... books = csv.DictReader(infile) 6... for book in books: 7... curs.execute(ins_str, (book['title'], book['author'], book['year'])) 8... 9Traceback (most recent call last): 10 File "<stdin>", line 4, in <module> 11KeyError: 'title'

補足情報(FW/ツールのバージョンなど)

PCはMacを用いています。また、8-6の前問の8-5では以下のようにbooks.csvというCSVファイルを作成しています。

Python3

1>>> text = '''title, author, year 2... The Weirdstone of Brisingamen, Alan Garner, 1960 3... Perdido Street Station, China Mieville, 2000 4... Thud!, Terry Pratchett, 2005 5... The Spellmen Files, Lisa Lutz, 2007 6... Small Gods, Terry Pratchett, 1992 7... ''' 8>>> with open('books.csv', 'wt') as outfile: 9... outfile.write(text) 10... 11213 12

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuma_kuma_

2020/09/28 10:28

一回CSVの4行目 Thud! を Thud にして試してみれば?
toast-uz

2020/09/28 14:19

エラーの前にprint(book)として、bookの内容を確認してください。'title'というキーが、何か別のものに変わっているようです。
hamazon

2020/09/29 04:46

お二人ともご回答ありがとうございます。 8-5でCSVファイルを作成する際に、不要なスペースをカンマの後ろに入力していたのが原因だったようで、そちらを修正した所動きました! 初歩的なミスでした...お手数おかけしました。
guest

回答1

0

自己解決

8−5でCSVファイル作成の際にカンマの後ろに不要なスペースを入力していた事が原因か。以下のように訂正したら作動した。

Python

1>>> text = '''title,author,year 2... The Weirdstone of Brisingamen,Alan Garner,1960 3... Perdido Street Station,China Mieville,2000 4... Thud!,Terry Pratchett,2005 5... The Spellman Files,Lisa Lutz,2007 6... Small Gods,Terry Pratchett,1992 7... ''' 8>>> with open('books.csv', 'wt') as outfile: 9... outfile.write(text) 10... 11201 12>>> import sqlite3 13>>> db = sqlite3.connect('books.db') 14>>> curs = db.cursor() 15>>> curs.execute('''create table book (title text, author text, year int)''') 16Traceback (most recent call last): 17 File "<stdin>", line 1, in <module> 18sqlite3.OperationalError: table book already exists 19>>> db.commit() 20>>> import csv 21>>> import sqlite3 22>>> ins_str = 'insert into values(?, ?, ?)' 23>>> with open('books.csv', 'rt') as infile: 24... books = csv.DictReader(infile) 25... for book in books: 26... curs.execute(ins_str, (book['title'], book['author'], book['year'])) 27... 28Traceback (most recent call last): 29 File "<stdin>", line 4, in <module> 30sqlite3.OperationalError: near "values": syntax error 31>>> ins_str = 'insert into book values(?, ?, ?)' 32>>> with open('books.csv', 'rt') as infile: 33... books = csv.DictReader(infile) 34... for book in books: 35... curs.execute(ins_str, (book['title'], book['author'], book['year'])) 36... 37<sqlite3.Cursor object at 0x100c2bd50> 38<sqlite3.Cursor object at 0x100c2bd50> 39<sqlite3.Cursor object at 0x100c2bd50> 40<sqlite3.Cursor object at 0x100c2bd50> 41<sqlite3.Cursor object at 0x100c2bd50> 42>>> db.commit()

投稿2020/09/29 04:48

hamazon

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toast-uz

2020/09/29 22:30

その要因は気づいていましたが、KeyError: 'title'ではなく、KeyError: 'author'が出るはずです。カンマの後のスペース削除で改善されるのは、'author'と'year'であり、'title'は変わりませんので。 元のコードでなぜKeyError: 'title'が出たのか知りたいので、質問文にコメントしたprint(book)を教えていただけますでしょうか?私にて再現させても、KeyError: 'author'が出てしまい、そのために質問をしていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問