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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

3回答

1643閲覧

PythonでTypeError

neko_hara

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

1クリップ

投稿2018/03/18 10:20

前提・実現したいこと

書籍「Pythonによるクローラー&スクレイピング入門 設計・開発から収集データの解析まで」のサンプルコードを実行中に以下のエラーが出ました。

行き詰まってしまったので、エラーを解消する方法を教えていただければと思います。

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

line 377, in write self.stream.write(data) TypeError: write() argument must be str, not bytes

該当のソースコード

Python

1import sys, codecs 2sys.stdout = codecs.getwriter("utf-8")(sys.stdout) 3 4import time 5import requests 6 7 8 9PAGE_URL_LIST = [ 10 'http://example.com/1.page', 11 'http://example.com/2.page', 12 'http://example.com/3.page', 13] 14 15for page_url in PAGE_URL_LIST: 16 res = requests.get(page_url, timeout=30) 17 print( 18 "ページURL: " + page_url + ", " + \ 19 "HTTPステータス: " + str(res.status_code) + ", " + \ 20 "処理時間(秒): " + str(res.elapsed.total_seconds()) 21 ) 22 time.sleep(1) 23

試したこと

サンプルコードをそのまま実行すると以下のエラーが出ました。

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

そこで色々と調べて以下の文を追加しました。

import sys, codecs sys.stdout = codecs.getwriter("utf-8")(sys.stdout)

追加するとTypeErrorが発生し、どう対処すればよいのか分からなくなってしまいました。

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

環境は以下の通りです。
・Python 3.6.2
・macOS Sierra 10.12.6
・エディターはATOMを使っています

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

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

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

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

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

guest

回答3

0

bassboneさん回答のように環境変数LC_ALLがCになってたりすると調子悪くてsys.stdout.encodingがutf-8ではなくascii相当になってしまうようです。

  • LC_ALLを未設定状態にする
  • LC_CTYPE and/or LANGにUTF-8であることを示すような値を設定する

例:ja_JP.UTF-8, en_US.UTF-8, etc.

というように設定すると期待通りに動作すると思います。

一方LC_ALL/LC_CTYPE/LANGの設定如何にかかわらずPythonインタープリタの入出力のエンコーディングを指定する場合

bash

1export PYTHONIOENCODING=utf-8

としておいたり、Pythonコード内で

python

1# python 2.x 2import sys, codecs 3sys.stdout = codecs.getwriter('utf_8')(sys.stdout) 4# python 3.x 5import sys, io 6sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')`

などの方法があるようです。質問者さんが参考にしたページはPython2.xのページではないでしょうか?

投稿2018/03/18 14:30

KSwordOfHaste

総合スコア18394

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

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

neko_hara

2018/03/19 12:07

回答ありがとうございました。 原因は別のところにありました(回答いただいたのにすみません。。) ただ環境変数の設定はご指摘のようにUTF-8の指示がなかったのでコメントを参考に変更しました。
KSwordOfHaste

2018/03/19 12:16

本Q&Aがきっかけで、改めてLC_ALL,LC_CTYPE,LANGなどについてちゃんと調べておかないとなぁと思いました。自分自身もこのあたりの変数の役割の正確な意味がずーっと曖昧なままなのです><
guest

0

(1) まずエラーメッセージを読んでみましょう

line 377, in write

self.stream.write(data)

TypeError: write() argument must be str, not bytes

直訳(大括弧内は説明のために追加)すると
「 377行目の write関数 [エラーが発生した場所を示しています]
self.stream.write(data) [エラーが発生した行の内容です]
型の間違い:write()の引数は文字列(str)でなければならないのに、バイト列(bytes)の引数になっています [発生したエラーの詳細を説明しています]
」となります。

(2) エラーが起きているコードを含んでいるファイルを探しましょう
write関数でエラーというメッセージなのに、質問の"該当のソースコード"ではwrite関数が使われていません。
エラーが出ているコードを修正しないとエラーは無くなりません。そして、そのためには修正すべきコードがどこにあるかが判っている必要があります。
ファイルが見つかったら、そのコードを"該当のソースコード”として追加してください。今のままの質問では問題を解決すべきコードが判らないので、回答不能です。

(3)”試したこと”に書かれているエラーは、unicodeへデコードしようとしているコードで発生したものと思われますが、エラーが発生した付近のコードがないので、回答不能です。

(4) 『書籍「Pythonによるクローラー&スクレイピング入門 設計・開発から収集データの解析まで」のサンプルコード』は公開されていない(その本を持っている人しか読めない)という現実を認識してください。

投稿2018/03/18 14:03

coco_bauer

総合スコア6915

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

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

neko_hara

2018/03/19 12:04

回答ありがとうございました。 実行したコードは全て記載していました。実行環境が悪かったようです。
guest

0

ベストアンサー

こちらが参考になりませんでしょうか?
http://d.hatena.ne.jp/heavenshell/20090219/1235057228

環境変数に「LC_ALL=C」がある場合に同様の事象が起きるようです。

投稿2018/03/18 10:52

bassbone

総合スコア767

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

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

neko_hara

2018/03/19 12:02

ありがとうございました。 紹介いただいたページから色々と探っているうちに解決しました。 ATOMのscriptで実行しているのが良くなかったようです。Terminalでは実行できました。
bassbone

2018/03/19 12:11

解決して何よりです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問