回答編集履歴
6
誤字修正
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したり
|
93
|
+
大分長くなりましたが、encode() decode()は必要最小限にし、Pythonの外の世界とやりとりする時にだけ使うようにします。例えばSTDOUTにprintしたりディスクの読み書きやネットワーク、popen(),system()などで外部コマンドを呼び出す時が外の世界になります。その時だけエンコードに注意しましょう。Pythonの内側では、出来る限り文字列はUnicodeオブジェクトのまま、バイト列はbytesのままにすれば、うまく行くようにPythonのライブラリが設計されているからです。今回のファイル名も外界になることは盲点で、僕も勉強になりました。
|
5
コメント追加
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
誤字
answer
CHANGED
@@ -44,7 +44,7 @@
|
|
44
44
|
POSIX
|
45
45
|
```
|
46
46
|
|
47
|
-
ちなみに端末の環境は次の通り。日本語の設定するとログイン環境によってエラーメッセージが日本語になったり、英語になったり煩雑ですし、環境依存の問題かも?と悩む可能性が一つ増えるので英語のままにしています。これで困ったことはありません。
|
47
|
+
ちなみに端末の環境は次の通り。日本語の設定をするとログイン環境によってエラーメッセージが日本語になったり、英語になったり煩雑ですし、環境依存の問題かも?と悩む可能性が一つ増えるので英語のままにしています。これで困ったことはありません。
|
48
48
|
|
49
49
|
```bash
|
50
50
|
$ locale
|
3
説明を追加。くどいかも。
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
書式の改善?
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
正しいコマンドに変更
answer
CHANGED
@@ -12,27 +12,62 @@
|
|
12
12
|
```
|
13
13
|
|
14
14
|
|
15
|
-
僕の最初のコメントの提案がうまく行かなかった理由はおそらくja_JP.UTF-8ロケールが存在しないためです。
|
15
|
+
僕の最初のコメントの提案がうまく行かなかった理由はおそらくja_JP.UTF-8ロケールが存在しないためです。locale -aコマンドを僕の環境で実行するとja_JP.UTF-8はありません。Ubuntuを日本語の設定なしでインストールすると多分同じ結果になると思います。
|
16
16
|
|
17
17
|
```bash
|
18
|
-
|
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.
|
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
|
-
$
|
50
|
+
$ locale
|
28
|
-
en_US.UTF-8
|
51
|
+
LANG=en_US.UTF-8
|
29
|
-
|
52
|
+
LANGUAGE=
|
30
|
-
|
53
|
+
LC_CTYPE="en_US.UTF-8"
|
54
|
+
LC_NUMERIC="en_US.UTF-8"
|
31
|
-
|
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
|