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

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

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

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

SQLite

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

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

1回答

3167閲覧

CSVをSQlite3に読み込ませた上で、表示させると、ユニコードのuがついてしまう。

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

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

SQLite

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

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2016/01/04 13:13

「入門Python3」(オライリー)という本の復讐問題の中の、8-5〜8-9(p.271)をやっていて、分からないところがありました。

8-5 次の行を使って、books.csvというCSVファイルを作ろう。
title,author,year
The Wierdstone of Brisingaman,Alen Garner,1960
Perdido Street Station,China Mieville,2000
Thud!,Terry Pratchett,2005
The Spellman Files,Lisa Lutz,2007
Small Gods,Terry Pratchett,1922

8-5は、下記の本の解答どおりでできました。

python

1import csv 2text = '''title,author,year 3The Wierdstone of Brisingaman,Alen Garner,1960 4Perdido Street Station,China Mieville,2000 5Thud!,Terry Pratchett,2005 6The Spellman Files,Lisa Lutz,2007 7Small Gods,Terry Pratchett,1922 8''' 9with open('books.csv', 'wt') as outfile: 10 outfile.write(text)

8-6 sqlite3モジュールを使って、books.dbというSQLiteデータベースを作り、そのなかにtitle(文字列)、author(文字列)、year(整数)というフィールドを持つbookというテーブルを作ろう。

8-6も、下記の本の解答通りでできました。

python

1import sqlite3 2conn = sqlite3.connect('books.db') 3curs = conn.cursor() 4curs.execute('CREATE TABLE book (title VARCHAR(20) PRIMARY KEY, author VARCHAR(20), year INT)')

8-7 books.csvを読み出し、そのデータをbookテーブルに挿入しよう。

8-7も、下記の本の解答通りやって、エラーはでませんでした。

python

1ins_str = 'INSERT INTO book (title, author, year) VALUES(?, ?, ?)' 2with open('books.csv','rt') as infile: 3 books = csv.DictReader(infile) 4 for book in books: 5 curs.execute(ins, (book['title'], book['author'], book['year']))

8-8 bookテーブルのtitle列を選択し、アルファベット順に表示しよう。

8-8は、本の解答によると、

python

1sql = 'select title from book order by title asc' 2for row in curs.execute(sql): 3 print(row)

です。しかし、これでは、
(u'Perdido Street Station',)
(u'Small Gods',)
(u'The Spellman Files',)
(u'The Wierdstone of Brisingaman',)
(u'Thud!',)
と表示されてしまいます。
解答では、
('Perdido Street Station',)
('Small Gods',)
('The Spellman Files',)
('The Wierdstone of Brisingaman',)
('Thud!',)
となっており、uがついていません。

なぜ、私の場合はuがついてしまうのでしょうか?

ユニコードの扱いがどこかでおかしかったのだと思いますが、Sqlite3の時点でおかしかったのではないかと思います。
試しに、

python

1with open("books.csv") as fin: 2 cin = csv.reader(fin) 3 list = [row for row in fin] 4list

を実行してみると、
['title,author,year\n',
'The Wierdstone of Brisingaman,Alen Garner,1960\n',
'Perdido Street Station,China Mieville,2000\n',
'Thud!,Terry Pratchett,2005\n',
'The Spellman Files,Lisa Lutz,2007\n',
'Small Gods,Terry Pratchett,1922\n']
と表示され、
CSVに時点では、uがついていないためです。
なお、Pythonのバージョンは、2.7.11です。

お分かりの方、ご教示頂ければ幸いです。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

原因は、Python3用の例題をPython2.7でコーディングしているからであり、エラーではありません。Pythonのバージョンによる仕様の違いです。

下記ページの説明をご参照ください。
2系と3系の違い

2.x系:文字列の型は「unicode」と「str」の2種類が存在
3.x系:文字列の型は「unicode」型のみ

その結果、同じ「unicode型」の文字列でも、「入門Python3」の例題の実行結果では u が付きませんが、mulberryfieldsさんがご使用のPython2.7.11では u が付きます。これは想定どおりなので、正解とみなして先へ進んで頂ければOKです。

投稿2016/01/04 21:11

pi-chan

総合スコア5936

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

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

退会済みユーザー

退会済みユーザー

2016/01/04 23:25

ご回答、ありがとうございます。 Pythonの2系と3系で、文字列の型の種類に違いがあるのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問