teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

誤字修正

2020/04/26 23:36

投稿

退会済みユーザー
answer CHANGED
@@ -90,4 +90,4 @@
90
90
  $ LANG=ja_JP.UTF-8 python3 test.py
91
91
  ```
92
92
 
93
- 大分長くなりましたが、encode() decode()は必要最小限にし、Pythonの外の世界とやりとりする時にだけ使うようにします。例えばSTDOUTにprintしたりディスクの読み書きやネットワーク、popen(),system()などで外部コマンドを呼び出す時が外の世界になります。その時だけエンコードに注意しましょう。Pythonの内側では、出来る限り文字列はUnicodeオブジェクトのまま、バイト列はbytesのままにすれば、うまく行くようにPythonのライブラリが設計されているからです。今回のファイル名も外界になることは盲点で、僕も勉強になりました。
93
+ 大分長くなりましたが、encode() decode()は必要最小限にし、Pythonの外の世界とやりとりする時にだけ使うようにします。例えばSTDOUTにprintしたりディスクの読み書きやネットワーク、popen(),system()などで外部コマンドを呼び出す時が外の世界になります。その時だけエンコードに注意しましょう。Pythonの内側では、出来る限り文字列はUnicodeオブジェクトのまま、バイト列はbytesのままにすれば、うまく行くようにPythonのライブラリが設計されているからです。今回のファイル名も外界になることは盲点で、僕も勉強になりました。

5

コメント追加

2020/04/26 23:35

投稿

退会済みユーザー
answer CHANGED
@@ -1,11 +1,11 @@
1
- 手っ取り早くは、次の行を
1
+ 次の行を
2
2
 
3
3
  ```Python3
4
4
  f = open("日本語のファイル名000.csv", 'a',newline = "" ,encoding='utf-8')
5
5
 
6
6
  ```
7
7
 
8
- 次のように変更して、ファイル名のエンコーディングを明示的に指定します。これで動くと思いますし、環境依存にさせないためには、むしろ積極的に指定する方が安全かもしれません
8
+ 次のように変更して、ファイル名のエンコーディングを明示的に指定します。これで動くと思いますし、環境依存にさせないためには、むしろ積極的に指定する方が安全です
9
9
 
10
10
  ```Python3
11
11
  f = open("日本語のファイル名000.csv".encode('utf-8'), 'a',newline = "" ,encoding='utf-8')
@@ -88,4 +88,6 @@
88
88
 
89
89
  ```bash
90
90
  $ LANG=ja_JP.UTF-8 python3 test.py
91
- ```
91
+ ```
92
+
93
+ 大分長くなりましたが、encode() decode()は必要最小限にし、Pythonの外の世界とやりとりする時にだけ使うようにします。例えばSTDOUTにprintしたりでディスクの読み書きやネットワーク、popen(),system()などで外部コマンドを呼び出す時が外の世界になります。その時だけエンコードに注意しましょう。Pythonの内側では、出来る限り文字列はUnicodeオブジェクトのまま、バイト列はbytesのままにすれば、うまく行くようにPythonのライブラリが設計されているからです。今回のファイル名も外界になることは盲点で、僕も勉強になりました。

4

誤字

2020/04/26 20:06

投稿

退会済みユーザー
answer CHANGED
@@ -44,7 +44,7 @@
44
44
  POSIX
45
45
  ```
46
46
 
47
- ちなみに端末の環境は次の通り。日本語の設定するとログイン環境によってエラーメッセージが日本語になったり、英語になったり煩雑ですし、環境依存の問題かも?と悩む可能性が一つ増えるので英語のままにしています。これで困ったことはありません。
47
+ ちなみに端末の環境は次の通り。日本語の設定するとログイン環境によってエラーメッセージが日本語になったり、英語になったり煩雑ですし、環境依存の問題かも?と悩む可能性が一つ増えるので英語のままにしています。これで困ったことはありません。
48
48
 
49
49
  ```bash
50
50
  $ locale

3

説明を追加。くどいかも。

2020/04/26 19:46

投稿

退会済みユーザー
answer CHANGED
@@ -65,7 +65,7 @@
65
65
  LC_ALL=
66
66
  ```
67
67
 
68
- 言語はen_USでもエンコーディングはUTF-8なので、試してみるとうまくいきます。
68
+ 言語はen_USでもエンコーディングはUTF-8なので、修正前のコードを試してみるとうまくいきます。
69
69
 
70
70
 
71
71
  ```bash
@@ -74,7 +74,7 @@
74
74
  test.py 日本語のファイル名000.csv
75
75
  ```
76
76
 
77
- 僕の環境では存在しないロケールja_JP.UTF-8で試すと同じエラーがおきます。
77
+ 僕の環境では存在しないロケールja_JP.UTF-8で修正前のコードを試すと同じエラーがおきます。
78
78
 
79
79
  ```bash
80
80
  $ LANG=ja_JP.UTF-8 python3 test.py
@@ -82,4 +82,10 @@
82
82
  File "test.py", line 8, in <module>
83
83
  f = open("\u65e5\u672c\u8a9e\u306e\u30d5\u30a1\u30a4\u30eb\u540d000.csv", 'a',newline = "" ,encoding='utf-8')
84
84
  UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)
85
+ ```
86
+
87
+ .encode('utf-8')を追加した修正後のコードであれば、存在しないロケールを無理やり指定してもエラーになりません。
88
+
89
+ ```bash
90
+ $ LANG=ja_JP.UTF-8 python3 test.py
85
91
  ```

2

書式の改善?

2020/04/26 19:45

投稿

退会済みユーザー
answer CHANGED
@@ -44,7 +44,7 @@
44
44
  POSIX
45
45
  ```
46
46
 
47
- ちなみに端末の環境は次の通り。
47
+ ちなみに端末の環境は次の通り。日本語の設定するとログイン環境によってエラーメッセージが日本語になったり、英語になったり煩雑ですし、環境依存の問題かも?と悩む可能性が一つ増えるので英語のままにしています。これで困ったことはありません。
48
48
 
49
49
  ```bash
50
50
  $ locale
@@ -65,7 +65,7 @@
65
65
  LC_ALL=
66
66
  ```
67
67
 
68
- 言語はen_USでもエンコーディングはUTF-8なので、試してみるとうまくいきます。日本語の設定するとログイン環境によってエラーメッセージが日本語になったり、英語になったり煩雑ですし、環境依存の問題かも?と悩む可能性が一つ増えるので英語のままにしています。これで困ったことはありません。
68
+ 言語はen_USでもエンコーディングはUTF-8なので、試してみるとうまくいきます。
69
69
 
70
70
 
71
71
  ```bash

1

正しいコマンドに変更

2020/04/26 19:39

投稿

退会済みユーザー
answer CHANGED
@@ -12,27 +12,62 @@
12
12
  ```
13
13
 
14
14
 
15
- 僕の最初のコメントの提案がうまく行かなかった理由はおそらくja_JP.UTF-8ロケールが存在しないためです。次のコマンドを僕の環境で実行するとen_US.UTF-8しかありません。Ubuntuを日本語の設定なしでインストールすると多分同じ結果になると思います。
15
+ 僕の最初のコメントの提案がうまく行かなかった理由はおそらくja_JP.UTF-8ロケールが存在しないためです。locale -aコマンドを僕の環境で実行するとja_JP.UTF-8ありません。Ubuntuを日本語の設定なしでインストールすると多分同じ結果になると思います。
16
16
 
17
17
  ```bash
18
- grep -v ^# /etc/locale.gen
18
+ $ locale -a
19
-
19
+ C
20
-
20
+ C.UTF-8
21
+ en_AG
22
+ en_AG.utf8
23
+ en_AU.utf8
24
+ en_BW.utf8
25
+ en_CA.utf8
26
+ en_DK.utf8
27
+ en_GB.utf8
28
+ en_HK.utf8
29
+ en_IE.utf8
30
+ en_IL
31
+ en_IL.utf8
32
+ en_IN
33
+ en_IN.utf8
34
+ en_NG
35
+ en_NG.utf8
36
+ en_NZ.utf8
37
+ en_PH.utf8
38
+ en_SG.utf8
21
- en_US.UTF-8 UTF-8
39
+ en_US.utf8
40
+ en_ZA.utf8
41
+ en_ZM
42
+ en_ZM.utf8
43
+ en_ZW.utf8
44
+ POSIX
22
45
  ```
23
46
 
24
47
  ちなみに端末の環境は次の通り。
25
48
 
26
49
  ```bash
27
- $ echo $LANG
50
+ $ locale
28
- en_US.UTF-8
51
+ LANG=en_US.UTF-8
29
- $ env | grep LC_
52
+ LANGUAGE=
30
- LC_TERMINAL=iTerm2
53
+ LC_CTYPE="en_US.UTF-8"
54
+ LC_NUMERIC="en_US.UTF-8"
31
- LC_TERMINAL_VERSION=3.3.9
55
+ LC_TIME="en_US.UTF-8"
56
+ LC_COLLATE="en_US.UTF-8"
57
+ LC_MONETARY="en_US.UTF-8"
58
+ LC_MESSAGES="en_US.UTF-8"
59
+ LC_PAPER="en_US.UTF-8"
60
+ LC_NAME="en_US.UTF-8"
61
+ LC_ADDRESS="en_US.UTF-8"
62
+ LC_TELEPHONE="en_US.UTF-8"
63
+ LC_MEASUREMENT="en_US.UTF-8"
64
+ LC_IDENTIFICATION="en_US.UTF-8"
65
+ LC_ALL=
32
66
  ```
33
67
 
34
- 言語はen_USでもエンコーディングはUTF-8なので、試してみるとうまくいきます。
68
+ 言語はen_USでもエンコーディングはUTF-8なので、試してみるとうまくいきます。日本語の設定するとログイン環境によってエラーメッセージが日本語になったり、英語になったり煩雑ですし、環境依存の問題かも?と悩む可能性が一つ増えるので英語のままにしています。これで困ったことはありません。
35
69
 
70
+
36
71
  ```bash
37
72
  $ LANG=en_US.UTF-8 python3 test.py
38
73
  $ ls