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

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

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

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python

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

Q&A

解決済

2回答

1384閲覧

python datetime エラー

tttkkk

総合スコア38

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python

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

0グッド

1クリップ

投稿2021/12/06 13:52

datetimeを使用してpythonのコードを書いたのですが、エラーが生じてしまいました。
私自身なりに調べはしたのですが、エラーの解決にはならず、ご教授いただけないでしょうか。

私の投稿に稚拙な部分もあるかとは思いますが、何卒よろしくお願いいたします。
そのような部分があるようでしたら、私の今後のためにもご指摘いただけますと幸いです。

環境としましては

  • OS window
  • python3.9.7
  • 実行環境 jupyter lab

以下が私の書いたコードでございます。

python

1import datetime 2import smtplib 3import ssl 4from email.mime.text import MIMEText 5 6import sys, codecs 7sys.stdout = codecs.getwriter('utf-8')(sys.stdout) 8 9today_date = datetime.datetime.today() 10print(today_date))

エラーメッセージとしてましては以下でござました。

python

1utf_8_encode() argument 1 must be str, not bytes

私がいくつか調べた中ではデータの型が文字列型でなければいけないのかとも思い、

python

1today_date = datetime.datetime.today() 2print(today_date))

の部分を

python

1#① 2today_date = datetime.datetime.today() 3print(str(today_date)) 4 5#② 6today_date = datetime.date.today() 7print(today_date)

①、②ように変更してみましたがエラーメッセージは同様でした。

また

python

1#③ 2today_date = datetime.today() 3print(today_date)

③のように変えてみましたところ
エラーメッセージが変わり以下のようでございました。

python

1module 'datetime' has no attribute 'today'

分かりづらい部分もあるかとは存じます、
解決方法などを教えていただけますと幸いです。
何卒よろしくお願いいたします。

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

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

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

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

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

TakaiY

2021/12/06 14:19

こちらで、最初のソースとほぼ同じもの(使っていないimport と最後の文法ミスを直した)を実行したところ、問題なく表示できています。 jupyter lab のカーネルにゴミが入っている可能性があります。 カーネルを再起動して、提示されたコード蚤実行してみるなどしてみてください。
bsdfan

2021/12/06 14:54

sys.stdout = codecs.getwriter('utf-8')(sys.stdout) これはpython 2の情報を参考にされてませんか?
tttkkk

2021/12/07 12:44

TakaiY様 カーネルの再起動を試してみましたが、やはり結果としては同じでした。 カーネルにゴミというのは具体的にどのようなものなのでしょうか。 bsdfan様 申し訳ございません。 私が参考にしたのはyoutubeでして、2020/08/23に公開されたものでございました。 そのころはpython2 なのでしょうか。 参考にしたyoutubeは下記でございます。 https://youtu.be/AMzlyi9rvQE?t=335
bsdfan

2021/12/08 13:59

そもそも、sys.stdout = codecs.getwriter('utf-8')(sys.stdout) は何の目的でいれていますか? 質問からは、上記の行が必要な理由が見当たりません。 この行を消してうまく動くなら、消していいと思います。
tttkkk

2021/12/09 12:42

bsdfan様 上記でも申し上げさせていただきました部分もございますが、 gmailの送信などを自動化しようと下記動画を参考に勉強しておりました。 https://youtu.be/AMzlyi9rvQE 動画ではエンコードエラーが発生することがあるため、 それを防ぐ目的で sys.stdout = codecs.getwriter('utf-8')(sys.stdout) というのを入れておりました。 これは基本的に入れる必要のないコードになるのでしょうか。
bsdfan

2021/12/10 03:21

参考動画の環境とか、動画の投稿者がどこまで理解してこれを追加しているのか不明ですが、質問者さんの環境では不要でしょう。 むしろ、このコードをいれていることが、質問の問題が起こっている原因です。 これは、python 2で、ターミナルに出力する文字コードをutf-8にしたいときの手法なのですが、 - python 3でstdoutの文字コードをかえるのは違うやり方になる - jupyterの場合、stdoutがjupyterのものに入れ替わっているので、そんなことはしなくてよい
tttkkk

2021/12/10 12:23

bsdfan様 ありがとうございます。 bsdfan様のおっしゃる通り、問題のコードはコメントアウトでもして、 勉強を進めてまいりたいと思います。 動画で紹介されていたコードは 基本的にはpython2で使用するコードなのですね。 私も動画の方がどこまで分かっているのかは定かではありませんが、 ひとまずは前に進めそうでよかったです。
guest

回答2

0

下記で普通に出ると思います

PYTHON

1import datetime 2today_date = datetime.datetime.today() 3print(today_date)

投稿2021/12/06 14:12

giit

総合スコア91

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

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

tttkkk

2021/12/07 12:31

ご回答ありがとうございます。 単純にそれだけをjupyter labに打ち込んで実行させてみましたが、 エラーメッセージが出てしまいました。 ただエラーメッセージは今までと違い write() argument must be str, not <class 'bytes'> というものでした。
guest

0

ベストアンサー

sys.stdoutio.TextIOWrapper クラスのインスタンスなので、

python

1>>> import sys 2>>> print(type(sys.stdout)) 3<class '_io.TextIOWrapper'>

同じクラスのインスタンスとして再作成すれば良いのではないでしょうか。

python

1import datetime 2import smtplib 3import ssl 4from email.mime.text import MIMEText 5 6import sys, io 7sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 8# print(type(sys.stdout)) # => <class '_io.TextIOWrapper'> 9# print(sys.stdout.encoding) # => utf-8 10# sys.stdout.encoding = 'utf-8' # => AttributeError: readonly attribute 11 12today_date = datetime.datetime.today() 13print(today_date) 14 15# 162021-12-06 23:48:06.126966

投稿2021/12/06 14:52

編集2021/12/07 02:32
melian

総合スコア20655

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

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

tttkkk

2021/12/07 12:37

ご回答頂きありがとうございます。 教えていただきましたコードを実行させていただきました。 まずそもそもなのですが、 import sys print(type(sys.stdout)) を実行した時点で write() argument must be str, not <class 'bytes'> というエラーメッセージが出てしまっております。 そして import datetime import smtplib import ssl from email.mime.text import MIMEText import sys, io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') today_date = datetime.datetime.today() print(today_date) こちらのコードも実行させていただいたのですが、 module 'io' has no attribute 'textIOWrapper' というエラーメッセージが出てきてしまいました。 このようなご回答をいただいてもなお 私自身で何が悪いのか把握できないのが大変申し訳ございませんが、 これらから何か原因などは見つかりますでしょうか。
melian

2021/12/07 12:46

質問文によれば Python 3 を使われているとのことですが、module 'io' has no attribute 'textIOWrapper' というエラーから推察すると Python 2 ではないのかと思います。print(sys.version) を実行して確認して下さいと言いたいところですが、きっとエラーになってしまうでしょうね。。。
tttkkk

2021/12/07 12:55

続けてのコメント失礼いたします。 vscodeで各コードを実行してみましたところ、エラーなく実行できたものとできなかったものがございました。 できたものに関しては import sys print(type(sys.stdout)) import datetime import smtplib import ssl from email.mime.text import MIMEText import sys, io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') today_date = datetime.datetime.today() print(today_date) でございます。 これらはターミナルに期待した通りの結果が返ってきました。 できなかったのものに関しては 最初に私が投稿しましたコードでございます。 import datetime import smtplib import ssl from email.mime.text import MIMEText import sys, codecs sys.stdout = codecs.getwriter('utf-8')(sys.stdout) today_date = datetime.datetime.today() print(today_date) こちらではエラーメッセージが投稿したものとは違い write() argument must be str, not bytes というものでございました。 vscodeで実行できるものがあるにもかかわらず、 jupyter labだと実行できないという点でも何か問題があるのでしょうか。
melian

2021/12/07 13:02

これは憶測になりますが、Jupyter lab の python コマンドの設定が Python 2 になっているのではないでしょうか。私は Jupyter lab を使っていないので設定方法は判りませんが。。。
tttkkk

2021/12/07 13:52

下記サイトを参考にjupyter labでのpythonのバージョンを確認してみました。 https://qiita.com/yossyyossy/items/4b20936e5ed544a79ce9 バージョンを確認するコードは melian様に教えていただきましたコードと同じでして、 新たにipynbファイルを作成して import sys print(sys.version) を実行しましたところ 3.9.7 (default, Sep 16 2021, 16:59:28) [MSC v.1916 64 bit (AMD64)] が返ってきました。 このことから私のjupyter labのpythonバージョンはpython2ではないかと思います。 また新しく作成したipynbファイルで import datetime import smtplib import ssl from email.mime.text import MIMEText #import sys, codecs #sys.stdout = codecs.getwriter('utf-8')(sys.stdout) today_date = datetime.datetime.today() print(today_date) を実行しましたところ(私が投稿したコードのsysの部分をコメントアウトしたもの)、 問題なく今日の日付を取得することができました。 やはり原因はsysを上手く処理できないということでしょうか。 さらに新しいipynbファイルにて、malian様に教えていただきました import sys, io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') を実行しましたところ 今までにはなかったエラーメッセージである 'OutStream' object has no attribute 'buffer' が出てきてしまいました。 何か解決方法は導き出せるものなのでしょうか。 お手数をおかけしますが、何卒宜しくお願い致します。
melian

2021/12/07 14:17

sys モジュールに関して、 import sys help(sys) を実行して表示される文章の最初の数行はどうなっていますか?
tttkkk

2021/12/08 12:37

ご丁寧に回答をしてくださり誠にありがとうございます。 import sys help(sys) を実行してまして、最初の数行は以下でございました。 Help on built-in module sys: NAME sys MODULE REFERENCE https://docs.python.org/3.9/library/sys The following documentation is automatically generated from the Python source files. It may be incomplete, incorrect or include features that are considered implementation detail and may vary between Python implementations. When in doubt, consult the module reference at the location listed above. あくまで最初の数行でして、実行結果自体はかなり行数があるものでございました。 もしもっと先の行の結果が必要でしたらすぐに回答させていただきます。
melian

2021/12/08 13:05

ありがとうございます。確かに Python 3.9 の sys モジュールですね。。。う〜ん、ちょっとお手上げ状態です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問