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

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

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

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

Q&A

解決済

3回答

21464閲覧

\nがうまく使えない

gunmed

総合スコア55

Python 3.x

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

0グッド

0クリップ

投稿2019/01/16 15:12

編集2019/01/16 15:14

\nを使いこなせるようにする

今回は以下のようなコードを書きました。

コード

working_day = ['2016-07-10', '2016-07-11', '2016-07-12', '2016-07-13', '2016-07-14'] with open('output/working_days.log', 'w', encoding='utf=8') as f: for a in working_day: f.write(a) f.write('\n') print('書き込み完了')

そしてファイルを見るとしっかりと書き込まれていました。
ここで、f.write('\n')ですが、別にわざわざ書く必要ないかなと思い、以下のように変更して実行するとエラーになりました。

###変更後のコード

working_day = ['2016-07-10', '2016-07-11', '2016-07-12', '2016-07-13', '2016-07-14'] with open('output/working_days.log', 'w', encoding='utf=8') as f: for a in working_day: f.write(a\n) print('書き込み完了')

エラー

File "working_days.py", line 8 f.write(a\n) ^ SyntaxError: unexpected character after line continuation character

確かに違和感はあるのですが、具体的にはどうしてエラーになっているのかわかりません。
f.write(a'\n')と試したのですが同様エラーでした。

\nは文字列に直接書き込めて改行できると理解していたので、一応以下のようになることをもう一度確認しました。

a = 'I\n am a student' print(a)
I am a student

今回は文字列ではなく、変数の後につけてるからエラーがでているのかなと考えました。
また、わざわざf.writeを2つに分けて書いたのも、たまたまできただけで、なぜ分けたかについても、理由はわかってないので、教えていただきたいです。
\nについての理解も間違っていたら指摘していただけると幸いです。

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

mac 1014.1

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

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

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

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

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

guest

回答3

0

ベストアンサー

\nは文字列の中で改行を表す記号です。文字列リテラルの外には書けません。書くとしたらa + "\n"となります(+で文字列を連結できます)。


以下は完全に余談です。

具体的にはどうしてエラーになっているのか

エラーを読んでみましょう。

SyntaxError: unexpected character after line continuation character
(拙訳)構文エラー: 行継続文字(line continuation character)の後ろに予期されない文字がある

「line continuation character」とは何でしょうか。ドキュメントに答えがあります。

二つまたはそれ以上の物理行を論理行としてつなげるためには、バックスラッシュ文字 () を使って以下のようにします(中略)

python

1if 1900 < year < 2100 and 1 <= month <= 12 \ 2 and 1 <= day <= 31 and 0 <= hour < 24 \ 3 and 0 <= minute < 60 and 0 <= second < 60: # Looks like a valid date 4 return 1

2. 字句解析 — Python 3.6.5 ドキュメント

行末に\を置くことで、論理行が次の行まで続いていると示すことができる機能がある訳です。まあpythonは改行とインデントで構文を表現する言語なので、こういうものが必要になるのです。

その「line continuation character」の構文として解釈されてしまったために、質問のエラーが出ています。本来は行末にあるべきものですから、その次には(改行以外)なにも置いてはいけない訳です。

でもそうだとしたらエラーメッセージのマーカは)ではなくnのところにでも出てくれそうな気がしますね。実際のところ、常に行末に矢印を出すように処理系が実装されているようです。

>>> . File "<stdin>", line 1 . ^ SyntaxError: unexpected character after line continuation character >>> .. File "<stdin>", line 1 .. ^ SyntaxError: unexpected character after line continuation character >>> ................... File "<stdin>", line 1 ................... ^ SyntaxError: unexpected character after line continuation character

たまにこういうこと(エラー位置がずれて表示される)もある、ということは頭の片隅にでも入れておいてください。

とまあ、要するに「まったく意図しない構文として解釈されて構文エラーになっていた」というケースです。構文エラーの対策は「構文を覚えること」だけなので、頑張って勉強してください。

投稿2019/01/16 15:40

編集2019/01/16 15:51
hayataka2049

総合スコア30933

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

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

gunmed

2019/01/17 02:11

回答ありがとうございます。 余談も含めとても勉強になりました。 エラーの内容もしっかりチェックしていこうと思います。
guest

0

f.write(a'\n')と試したのですが同様エラーでした。

f.write(a + '\n') と書いてください。
双方がリテラルである場合を除き、隣合っている文字列が勝手に結合されることはありません。

投稿2019/01/16 15:16

編集2019/01/16 15:32
LouiS0616

総合スコア35660

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

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

gunmed

2019/01/17 02:09

回答ありがとうございます。 結合について理解が深まり、いい勉強になりました。
guest

0

aは文字列じゃないです。変数名です。\nは文字列の中に書く必要があります。

分けずに書くと、f.write(a+'\n')ですね。

投稿2019/01/16 15:19

otn

総合スコア84559

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

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

gunmed

2019/01/17 02:10

回答ありがとうございます。 変数と文字列をしっかり認識していこうと思います。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問