Pythonが嫌いな人のためのスレッドです。
■関連スレ
Rubyについて(アンチ専用) Part002
http://pc11.2ch.net/test/read.cgi/tech/1200210768/
Pythonについて(アンチ専用)
■ このスレッドは過去ログ倉庫に格納されています
2008/02/21(木) 10:24:06
143デフォルトの名無しさん
2008/03/01(土) 20:21:19 >>142
いただいた
いただいた
144136
2008/03/02(日) 03:39:09 >>137
「〜」はEUC-JPとUTF-8を相互変換するときのテーブルがOS/言語ごとに違うために
変換できなかったり違うグリフで表示されたりします。
俺はよく使う文字について以下のようなコードでWindows用にそろえてます。
unification = {
0x2014: 0x2015, # HORIZONTAL BAR
0xFF5E: 0x301C, # WAVE DASH
0x2225: 0x2016, # DOUBLE VERTICAL LINE
0x22EF: 0x2026, # HORIZONTAL ELLIPSIS
0xFF0D: 0x2212, # MINUS SIGN
0xFFE0: 0x00A2, # CENT SIGN
0xFFE1: 0x00A3, # POUND SIGN
0xFFE2: 0x00AC} # NOT SIGN
text = unicode(...).translate(unification)
136の例では ifp.read().translate(...) とすればよいと思われ。
「〜」はEUC-JPとUTF-8を相互変換するときのテーブルがOS/言語ごとに違うために
変換できなかったり違うグリフで表示されたりします。
俺はよく使う文字について以下のようなコードでWindows用にそろえてます。
unification = {
0x2014: 0x2015, # HORIZONTAL BAR
0xFF5E: 0x301C, # WAVE DASH
0x2225: 0x2016, # DOUBLE VERTICAL LINE
0x22EF: 0x2026, # HORIZONTAL ELLIPSIS
0xFF0D: 0x2212, # MINUS SIGN
0xFFE0: 0x00A2, # CENT SIGN
0xFFE1: 0x00A3, # POUND SIGN
0xFFE2: 0x00AC} # NOT SIGN
text = unicode(...).translate(unification)
136の例では ifp.read().translate(...) とすればよいと思われ。
145デフォルトの名無しさん
2008/03/02(日) 04:15:41 ごめ、訂正。Windows用にそろえてるんじゃなくて、PythonのEUC-JP/Shift_JIS/ISO-2022-JPコデックが
受け付けるコード値に置換してる、というのが正しいです。
ついでに説明しとくと144のunification(辞書)は、キーはWindowsで日本語入力したときに使われるコード値、
各キーの値はPythonの日本語コデックが受け付けるコード値です。
この8個の文字にOS/言語ごとの変換テーブルの違いが集中しているので、
144の置換をしておくと UTF-8 → EUC-JP/Shift_JIS/ISO-2022-JP 変換時のエラーがだいぶ減るはず。
受け付けるコード値に置換してる、というのが正しいです。
ついでに説明しとくと144のunification(辞書)は、キーはWindowsで日本語入力したときに使われるコード値、
各キーの値はPythonの日本語コデックが受け付けるコード値です。
この8個の文字にOS/言語ごとの変換テーブルの違いが集中しているので、
144の置換をしておくと UTF-8 → EUC-JP/Shift_JIS/ISO-2022-JP 変換時のエラーがだいぶ減るはず。
146デフォルトの名無しさん
2008/03/02(日) 06:08:12 蟻が十匹
147デフォルトの名無しさん
2008/03/02(日) 09:37:37 ありがとうございました
ひょっとして梶●さんですか?
ひょっとして梶●さんですか?
148デフォルトの名無しさん
2008/03/04(火) 14:14:00 hoge = {'a': 4, 'c': 2, 'b': 9}
for k,v in hoge.items():
print k,v
for k,v in hoge.iteritems():
print k,v
なにがちがうんでしょうか?
for k,v in hoge.items():
print k,v
for k,v in hoge.iteritems():
print k,v
なにがちがうんでしょうか?
149デフォルトの名無しさん
2008/03/04(火) 14:17:54 ここは質問スレではないんだが
150デフォルトの名無しさん
2008/03/04(火) 14:29:07 >>> hoge = {'a': 4, 'c': 2, 'b': 9}
>>> type(hoge)
<type 'dict'>
>>> type(hoge.items())
<type 'list'>
>>> type(hoge.iteritems())
<type 'dictionary-itemiterator'>
>>> type(hoge)
<type 'dict'>
>>> type(hoge.items())
<type 'list'>
>>> type(hoge.iteritems())
<type 'dictionary-itemiterator'>
151デフォルトの名無しさん
2008/03/04(火) 23:21:17 (´∀`)ノhoge = dict(enumerate(xrange(1000000)))
152デフォルトの名無しさん
2008/03/07(金) 21:07:32 >>> a = {'hoge': 'fuga', 'hige': 'hage'}
>>> a
{'hige': 'hage', 'hoge': 'fuga'}
>>> b = str(a)
>>> b
"{'hige': 'hage', 'hoge': 'fuga'}"
ここで文字列 b から hash を復元して
c (= {'hoge': 'fuga', 'hige': 'hage'}) を作りたいのですが
どのように書けばよいでしょうか?
>>> a
{'hige': 'hage', 'hoge': 'fuga'}
>>> b = str(a)
>>> b
"{'hige': 'hage', 'hoge': 'fuga'}"
ここで文字列 b から hash を復元して
c (= {'hoge': 'fuga', 'hige': 'hage'}) を作りたいのですが
どのように書けばよいでしょうか?
153デフォルトの名無しさん
2008/03/07(金) 21:11:56 >>> eval(b)
{'hige': 'hage', 'hoge': 'fuga'}
{'hige': 'hage', 'hoge': 'fuga'}
154デフォルトの名無しさん
2008/03/07(金) 21:17:50155デフォルトの名無しさん
2008/03/07(金) 21:40:03 >>> a = {'hoge': 'fuga', 'hige': 'hage'}
>>> import pickle
>>> pickle.dumps(a)
"(dp0\nS'hige'\np1\nS'hage'\np2\nsS'hoge'\np3\nS'fuga'\np4\ns."
>>> pickle.loads("(dp0\nS'hige'\np1\nS'hage'\np2\nsS'hoge'\np3\nS'fuga'\np4\ns.")
{'hige': 'hage', 'hoge': 'fuga'}
>>> import pickle
>>> pickle.dumps(a)
"(dp0\nS'hige'\np1\nS'hage'\np2\nsS'hoge'\np3\nS'fuga'\np4\ns."
>>> pickle.loads("(dp0\nS'hige'\np1\nS'hage'\np2\nsS'hoge'\np3\nS'fuga'\np4\ns.")
{'hige': 'hage', 'hoge': 'fuga'}
156デフォルトの名無しさん
2008/03/08(土) 02:39:38 そのまま書き出すとこんな感じ?
(dp0
S'hige'
p1
S'hage'
p2
sS'hoge'
p3
S'fuga'
p4
s.
読みやすいといえば読みやすいし
JSONやYAMLに比べると微妙なんだけど
このフォーマットって何か由来あるんですか
(dp0
S'hige'
p1
S'hage'
p2
sS'hoge'
p3
S'fuga'
p4
s.
読みやすいといえば読みやすいし
JSONやYAMLに比べると微妙なんだけど
このフォーマットって何か由来あるんですか
157デフォルトの名無しさん
2008/03/08(土) 02:57:25 pickleは人間が編集するようなものではないでしょ
フォーマットは pickle.py, pickletools.py あたり?
フォーマットは pickle.py, pickletools.py あたり?
158デフォルトの名無しさん
2008/03/08(土) 03:47:04 FORTHっぽいね
159デフォルトの名無しさん
2008/03/08(土) 04:31:54 >>153
python はこれができるからいいんだよね、
昔 perl でこれと同じ関数を2週間ぐらいかけて作ろうとしてた時に、(リファレンスやら再帰やら使って・・・)
python は両方builtin でできると知って、一気にperl 捨てたw
python はこれができるからいいんだよね、
昔 perl でこれと同じ関数を2週間ぐらいかけて作ろうとしてた時に、(リファレンスやら再帰やら使って・・・)
python は両方builtin でできると知って、一気にperl 捨てたw
160デフォルトの名無しさん
2008/03/08(土) 14:50:49 >>> a = {'hoge': 'fuga', 'hige': 'hage'}
>>> '%(hoge)s' % a
'fuga'
とか、
>>> b = {'moge': a}
>>> '%(moge)s' % b
"{'hige': 'hage', 'hoge': 'fuga'}"
とかは便利なのは分かったんですが、
>>> '%(moge[hoge])s' % b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'moge[hoge]'
>>> "%(moge['hoge'])s" % b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: "moge['hoge']"
ネストされたhashへのアクセスは出来ないんでしょうか?
>>> '%(hoge)s' % a
'fuga'
とか、
>>> b = {'moge': a}
>>> '%(moge)s' % b
"{'hige': 'hage', 'hoge': 'fuga'}"
とかは便利なのは分かったんですが、
>>> '%(moge[hoge])s' % b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'moge[hoge]'
>>> "%(moge['hoge'])s" % b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: "moge['hoge']"
ネストされたhashへのアクセスは出来ないんでしょうか?
161デフォルトの名無しさん
2008/03/08(土) 15:42:01 出来ない
162デフォルトの名無しさん
2008/03/08(土) 15:44:51163デフォルトの名無しさん
2008/03/08(土) 16:19:36164デフォルトの名無しさん
2008/03/15(土) 00:48:44 ほのぼのとしたアンチスレだな。
165デフォルトの名無しさん
2008/03/15(土) 00:53:23 ともすると本スレのほうが殺伐としていて困る
166デフォルトの名無しさん
2008/03/15(土) 13:39:38 pythonはとっとと、ソート演算子のオーバーライドをサポートしてくれ。
167デフォルトの名無しさん
2008/03/15(土) 13:56:08 演算子?
168デフォルトの名無しさん
2008/03/15(土) 14:53:55 組み込みクラスの__cmp__()を変更したいとか?
組み込みクラスはオーバーライドできない実装を受け入れて
サブクラス化するなりして問題解決した方が精神衛生上よい。
組み込みクラスはオーバーライドできない実装を受け入れて
サブクラス化するなりして問題解決した方が精神衛生上よい。
169デフォルトの名無しさん
2008/03/15(土) 23:10:49 >>166
引数でラムダ式渡すのでは困る理由は何?
引数でラムダ式渡すのでは困る理由は何?
170デフォルトの名無しさん
2008/03/26(水) 02:08:27 c++ やcommon lispに比べたらモジュールがいろいろ足りない
統計とか数式処理とか
今のままでも便利なんだけど歴史が浅いからね
統計とか数式処理とか
今のままでも便利なんだけど歴史が浅いからね
171デフォルトの名無しさん
2008/03/26(水) 06:59:06 >>170
scipyとか
scipyとか
172デフォルトの名無しさん
2008/03/26(水) 19:44:01 C++は老害言語。
173デフォルトの名無しさん
2008/03/26(水) 20:40:07 老害か。
N88Basicのことかな
N88Basicのことかな
174デフォルトの名無しさん
2008/03/27(木) 04:21:42 > c++ やcommon lispに比べたらモジュールがいろいろ足りない
スクリプト言語では Perl が一番揃ってそうだな
次が Python かな
スクリプト言語では Perl が一番揃ってそうだな
次が Python かな
175デフォルトの名無しさん
2008/03/27(木) 08:03:46176デフォルトの名無しさん
2008/03/29(土) 15:27:00 ほしゅ
177デフォルトの名無しさん
2008/03/30(日) 12:24:18 age
178デフォルトの名無しさん
2008/04/01(火) 07:40:47 おまいら、py3kについてはどう思うよ?
俺はclassic style classが使えない時点で見放したが。
俺はclassic style classが使えない時点で見放したが。
179デフォルトの名無しさん
2008/04/01(火) 08:36:31 どんな書き方ができなくなって嫌だったの?
180デフォルトの名無しさん
2008/04/01(火) 11:43:45 単純な書き換えだったら、2to3ツールって言うので自動で変換してもらえるはず
181デフォルトの名無しさん
2008/04/01(火) 11:47:31 互換性の無いバージョンだと前からアナウンスしてるんだから、
不要なものはどんどん廃してもらわんと逆に困る。
不要なものはどんどん廃してもらわんと逆に困る。
182デフォルトの名無しさん
2008/04/01(火) 12:11:52 後にPerl6と揶揄されるバージョンであった
183デフォルトの名無しさん
2008/04/02(水) 00:15:20 Perl6と違ってちゃんと予定日が決まってるようだが。
184デフォルトの名無しさん
2008/04/02(水) 00:35:13 つ4/1
185デフォルトの名無しさん
2008/04/02(水) 00:43:17 そういやParrotって四月馬鹿が発端なんだよな。
186デフォルトの名無しさん
2008/04/02(水) 01:02:26 AprilFoolを字面通り四月馬鹿と言うのは誤訳?
187デフォルトの名無しさん
2008/04/02(水) 02:48:03 伝統
188デフォルトの名無しさん
2008/04/02(水) 07:17:14 intとlongの処遇で、現行バージョンと3kの両方で動くようなソースは事実上書けない。
new style classと違って、こちらは突然のdeprecateになる。
new style classと違って、こちらは突然のdeprecateになる。
189デフォルトの名無しさん
2008/04/02(水) 11:29:03 たしかu""やexcept文の,とかも3kでは駄目だったよね
190デフォルトの名無しさん
2008/04/02(水) 11:48:49 Cで書かれたエクステンションはもっとひどい影響を受けるよ。
191デフォルトの名無しさん
2008/04/02(水) 23:43:05 互換性切るって言ってるんだから別ソースにしようぜ
192デフォルトの名無しさん
2008/04/29(火) 22:22:54 Python支持者の隠れ家スレってこちらですか。
193デフォルトの名無しさん
2008/04/30(水) 02:18:08 そうなんですのよ奥さん
なんかのらくらと、まったり批判及びフレンドリーな雑談で収まってます
なんかのらくらと、まったり批判及びフレンドリーな雑談で収まってます
194デフォルトの名無しさん
2008/04/30(水) 20:11:00 表立ってPython批判する奴って少ないんだよなあ。
批判する点も、「ああ、そこ欠点ってわかってますから」というところ
ばかりだし。
Guidoのやり方が上手なんだろうね。
批判する点も、「ああ、そこ欠点ってわかってますから」というところ
ばかりだし。
Guidoのやり方が上手なんだろうね。
195デフォルトの名無しさん
2008/05/25(日) 03:44:53 自分の読みたい本を紹介しろということをクエストっていうのか?
196デフォルトの名無しさん
2008/06/07(土) 03:08:10 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, stat
import time
def main(root):
dirsize = {}
for dirpath, dirnames, filenames in os.walk(root, topdown=False):
dirsize[dirpath] = 0
for file in filenames:
tgt = os.path.join(dirpath, file)
siz = os.stat(tgt)[stat.ST_SIZE]
dirsize[dirpath] += siz
for dir in dirnames:
tgt = os.path.join(dirpath, dir)
siz = dirsize[tgt]
dirsize[dirpath] += siz
print '"dir","%s",%d' % (tgt, siz)
print '"total","%s",%d' % (root, dirsize[root])
if __name__ == '__main__':
if len(sys.argv) >= 2:
main(sys.argv[1])
これでちゃんと動いていたような気がしたのですが
検索パス中に ▽●▲表 みたいな \5C で終わる
ディレクトリが含まれていると中断されてしまいます。
たぶん日本語の問題だろうと思って
# -*- coding: utf-8 -*-
import sys, os, stat
import time
def main(root):
dirsize = {}
for dirpath, dirnames, filenames in os.walk(root, topdown=False):
dirsize[dirpath] = 0
for file in filenames:
tgt = os.path.join(dirpath, file)
siz = os.stat(tgt)[stat.ST_SIZE]
dirsize[dirpath] += siz
for dir in dirnames:
tgt = os.path.join(dirpath, dir)
siz = dirsize[tgt]
dirsize[dirpath] += siz
print '"dir","%s",%d' % (tgt, siz)
print '"total","%s",%d' % (root, dirsize[root])
if __name__ == '__main__':
if len(sys.argv) >= 2:
main(sys.argv[1])
これでちゃんと動いていたような気がしたのですが
検索パス中に ▽●▲表 みたいな \5C で終わる
ディレクトリが含まれていると中断されてしまいます。
たぶん日本語の問題だろうと思って
197デフォルトの名無しさん
2008/06/07(土) 03:10:24 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, stat
import time
def main(root):
dirsize = {}
for dirpath, dirnames, filenames in os.walk(rootroot.decode('cp932'), topdown=False):
dirsize[dirpath] = 0
for file in filenames:
tgt = os.path.join(dirpath, file)
siz = os.stat(tgt)[stat.ST_SIZE]
dirsize[dirpath] += siz
for dir in dirnames:
tgt = os.path.join(dirpath, dir)
siz = dirsize[tgt]
dirsize[dirpath] += siz
print '"dir","%s",%d' % (tgt, siz)
print '"total","%s",%d' % (root, dirsize[root])
if __name__ == '__main__':
if len(sys.argv) >= 2:
main(sys.argv[1])
のように直したら中断はされなくなったのですが、
hoge.py . > fuga.csv
で保存しようとするとエラーになります。
(上のバージョンはリダイレクトは出来ていました。)
Python の日本語の扱いが良く分かりません。
Python 嫌いになりそうです。><
# -*- coding: utf-8 -*-
import sys, os, stat
import time
def main(root):
dirsize = {}
for dirpath, dirnames, filenames in os.walk(rootroot.decode('cp932'), topdown=False):
dirsize[dirpath] = 0
for file in filenames:
tgt = os.path.join(dirpath, file)
siz = os.stat(tgt)[stat.ST_SIZE]
dirsize[dirpath] += siz
for dir in dirnames:
tgt = os.path.join(dirpath, dir)
siz = dirsize[tgt]
dirsize[dirpath] += siz
print '"dir","%s",%d' % (tgt, siz)
print '"total","%s",%d' % (root, dirsize[root])
if __name__ == '__main__':
if len(sys.argv) >= 2:
main(sys.argv[1])
のように直したら中断はされなくなったのですが、
hoge.py . > fuga.csv
で保存しようとするとエラーになります。
(上のバージョンはリダイレクトは出来ていました。)
Python の日本語の扱いが良く分かりません。
Python 嫌いになりそうです。><
198デフォルトの名無しさん
2008/06/07(土) 03:16:16 後から貼った方が何か変なので直しておきます。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, stat
import time
def main(root):
dirsize = {}
for dirpath, dirnames, filenames in os.walk(root.decode('cp932'), topdown=False):
dirsize[dirpath] = 0
for file in filenames:
tgt = os.path.join(dirpath, file)
siz = os.stat(tgt)[stat.ST_SIZE]
dirsize[dirpath] += siz
for dir in dirnames:
tgt = os.path.join(dirpath, dir)
siz = dirsize[tgt]
dirsize[dirpath] += siz
print u'"dir","%s",%d' % (tgt, siz)
print u'"total","%s",%d' % (root, dirsize[root])
if __name__ == '__main__':
if len(sys.argv) >= 2:
main(sys.argv[1])
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, stat
import time
def main(root):
dirsize = {}
for dirpath, dirnames, filenames in os.walk(root.decode('cp932'), topdown=False):
dirsize[dirpath] = 0
for file in filenames:
tgt = os.path.join(dirpath, file)
siz = os.stat(tgt)[stat.ST_SIZE]
dirsize[dirpath] += siz
for dir in dirnames:
tgt = os.path.join(dirpath, dir)
siz = dirsize[tgt]
dirsize[dirpath] += siz
print u'"dir","%s",%d' % (tgt, siz)
print u'"total","%s",%d' % (root, dirsize[root])
if __name__ == '__main__':
if len(sys.argv) >= 2:
main(sys.argv[1])
199デフォルトの名無しさん
2008/06/07(土) 03:22:05200デフォルトの名無しさん
2008/06/07(土) 03:24:12201デフォルトの名無しさん
2008/06/07(土) 03:50:59 検索パス中に日本語が入っていて
hoge.py c:/ > fuga.csv
で保存しようとするとエラーになります。
hoge.py c:/ > fuga.csv
で保存しようとするとエラーになります。
202デフォルトの名無しさん
2008/06/07(土) 03:53:38 これとか?
http://python.rdy.jp/wiki.cgi?page=%C6%FC%CB%DC%B8%EC
site-packageディレクトリにsitecustomize.pyを設置して、文字コードを指定する。
sys.setdefaultencoding('cp932')
http://python.rdy.jp/wiki.cgi?page=%C6%FC%CB%DC%B8%EC
site-packageディレクトリにsitecustomize.pyを設置して、文字コードを指定する。
sys.setdefaultencoding('cp932')
203デフォルトの名無しさん
2008/06/07(土) 05:34:50 >>198
KeyErrorで止まるのならこれで動くんじゃないかと
decode()の呼び出しで無駄が多いから調整してね
print '"total","%s",%d' % (root.decode('cp932'), dirsize[root.decode('cp932')])
ていうかここアンチスレか
KeyErrorで止まるのならこれで動くんじゃないかと
decode()の呼び出しで無駄が多いから調整してね
print '"total","%s",%d' % (root.decode('cp932'), dirsize[root.decode('cp932')])
ていうかここアンチスレか
204デフォルトの名無しさん
2008/06/07(土) 05:54:35 >>201
だからエラーの内容貼れって
だからエラーの内容貼れって
205デフォルトの名無しさん
2008/06/07(土) 07:54:49 encodeしてないだけだろ
206デフォルトの名無しさん
2008/06/07(土) 12:21:50207デフォルトの名無しさん
2008/06/07(土) 13:07:50 よくわからんが、os.walkをやりたいだけか?
http://docs.python.org/lib/os-file-dir.html
http://docs.python.org/lib/os-file-dir.html
208デフォルトの名無しさん
2008/06/07(土) 13:23:12 >>197
> Python の日本語の扱いが良く分かりません。
> Python 嫌いになりそうです。><
標準出力がリダイレクトされていない場合、Python の print 文は
与えられた Unicode 文字列を自動的に cp932 等の実行環境固有のエンコーディングで
エンコードして印字するようになっている。これは Python インタプリタを
対話的に利用するときには便利な仕組みだ。「実行環境固有のエンコーディング」が
具体的に何であるかは sys.stdout.encoding を見れば分かる。
一方、標準出力がファイル等にリダイレクトされている場合、
どのエンコーディングで文字列をエンコードすべきかを決めるのは難しい問題だ。
cp932 がいいかもしれないし用途によっては utf-8 や iso-8859-1 の方がいいかも知れない。
つまり、Python の立場からは標準出力をリダイレクトする場合のエンコーディングを
これと決めることができない。このことは、標準出力をリダイレクトしているときには
sys.stdout.encoding が None になることから分かる。
この場合、print 文は sys.stdout.encoding の代わりに sys.getdefaultencoding() が返す
エンコーディングでエンコードして出力する。このエンコーディングは Python の出荷時の
設定では ascii になっているので、日本語等を含む Unicode 文字列を print しようとすると
実行時エラーになる。
結局のところ、標準出力をファイルにリダイレクトできるようにプログラムを書くには
sys.stdout.encoding による自動エンコードに頼らないようにしなければいけないということだ。
個人的には、Unicode 文字列をファイルなり標準出力なりに書き出すときは
明示的にエンコードするように心がけるべきだと考えている。暗黙の自動エンコードに
頼るとロクなことがない。
> Python の日本語の扱いが良く分かりません。
> Python 嫌いになりそうです。><
標準出力がリダイレクトされていない場合、Python の print 文は
与えられた Unicode 文字列を自動的に cp932 等の実行環境固有のエンコーディングで
エンコードして印字するようになっている。これは Python インタプリタを
対話的に利用するときには便利な仕組みだ。「実行環境固有のエンコーディング」が
具体的に何であるかは sys.stdout.encoding を見れば分かる。
一方、標準出力がファイル等にリダイレクトされている場合、
どのエンコーディングで文字列をエンコードすべきかを決めるのは難しい問題だ。
cp932 がいいかもしれないし用途によっては utf-8 や iso-8859-1 の方がいいかも知れない。
つまり、Python の立場からは標準出力をリダイレクトする場合のエンコーディングを
これと決めることができない。このことは、標準出力をリダイレクトしているときには
sys.stdout.encoding が None になることから分かる。
この場合、print 文は sys.stdout.encoding の代わりに sys.getdefaultencoding() が返す
エンコーディングでエンコードして出力する。このエンコーディングは Python の出荷時の
設定では ascii になっているので、日本語等を含む Unicode 文字列を print しようとすると
実行時エラーになる。
結局のところ、標準出力をファイルにリダイレクトできるようにプログラムを書くには
sys.stdout.encoding による自動エンコードに頼らないようにしなければいけないということだ。
個人的には、Unicode 文字列をファイルなり標準出力なりに書き出すときは
明示的にエンコードするように心がけるべきだと考えている。暗黙の自動エンコードに
頼るとロクなことがない。
209208の続き
2008/06/07(土) 13:24:23 じゃあ具体的にどうすればいいのかという話だけど、お勧めは次の方法だ。
まず次のように標準出力を適当なエンコーダで包む。
import codecs
Writer = codecs.getwriter(sys.getfilesystemencoding())
stdout = Writer(sys.stdout)
その上で print 文をすべて次のように書く。
print >>stdout, '"total","%s",%d' % (root, dirsize[root])
この例ではリダイレクトしているか否かに関わらず sys.getfilesystemencoding() の返す
エンコーディングでエンコードするようにしている。このエンコーディングは、俺の知る限り
標準出力がリダイレクトされていない場合の sys.stdout.encoding と一致している。
sys.getfilesystemencoding() を使う代わりに、例えば cp932 に決めうちしちゃうとか、
コマンドライン引数で出力エンコーディングを指定するようにするといった方法も考えられる。
標準出力リダイレクト時のエンコーディングをどうするかは用途に強く依存する問題なので
こればかりはプログラムを書く人(つまり197さん)が決めるしかない。
まず次のように標準出力を適当なエンコーダで包む。
import codecs
Writer = codecs.getwriter(sys.getfilesystemencoding())
stdout = Writer(sys.stdout)
その上で print 文をすべて次のように書く。
print >>stdout, '"total","%s",%d' % (root, dirsize[root])
この例ではリダイレクトしているか否かに関わらず sys.getfilesystemencoding() の返す
エンコーディングでエンコードするようにしている。このエンコーディングは、俺の知る限り
標準出力がリダイレクトされていない場合の sys.stdout.encoding と一致している。
sys.getfilesystemencoding() を使う代わりに、例えば cp932 に決めうちしちゃうとか、
コマンドライン引数で出力エンコーディングを指定するようにするといった方法も考えられる。
標準出力リダイレクト時のエンコーディングをどうするかは用途に強く依存する問題なので
こればかりはプログラムを書く人(つまり197さん)が決めるしかない。
210デフォルトの名無しさん
2008/06/07(土) 14:04:17 >>209
u'"total","%s",%d'じゃない?
u'"total","%s",%d'じゃない?
211210
2008/06/07(土) 14:14:49 ごめん、勘違いしてた
str % unicode はunicodeになるからいいのか
str % unicode はunicodeになるからいいのか
212デフォルトの名無しさん
2008/06/07(土) 14:16:34 >>211
その辺がマンドクセなんでp3kではbyteとunicodeのみになるんだろうな。
その辺がマンドクセなんでp3kではbyteとunicodeのみになるんだろうな。
213デフォルトの名無しさん
2008/06/07(土) 14:44:12 >>210-211
確かに u"・・・" にすべきだった。指摘ありがとう。
一般論としては u"・・・" にする必要があるかどうかは文字列の中身に依る。
例えば u"・・・" ではなく "・・・" を使って日本語で
print >>stdout, '"総計","%s",%d' % (root, dirsize[root])
としたら % 演算子の処理のところで暗黙の string → unicode 変換が起こる。
ソースのエンコーディングと sys.getdefaultencoding() の値によってはエラーになるわけだ。
文字列の中身が ASCII 文字だけなら暗黙の変換が起こってもまず問題ない。
ただ、無駄な変換ではあるし、暗黙の自動変換を避ける方針でやりましょうと言ってる
わけだから、やはり u"・・・" にするのが妥当だ。
というわけで>>209を訂正:
誤: print >>stdout, '"total","%s",%d' % (root, dirsize[root])
正: print >>stdout, u'"total","%s",%d' % (root, dirsize[root])
確かに u"・・・" にすべきだった。指摘ありがとう。
一般論としては u"・・・" にする必要があるかどうかは文字列の中身に依る。
例えば u"・・・" ではなく "・・・" を使って日本語で
print >>stdout, '"総計","%s",%d' % (root, dirsize[root])
としたら % 演算子の処理のところで暗黙の string → unicode 変換が起こる。
ソースのエンコーディングと sys.getdefaultencoding() の値によってはエラーになるわけだ。
文字列の中身が ASCII 文字だけなら暗黙の変換が起こってもまず問題ない。
ただ、無駄な変換ではあるし、暗黙の自動変換を避ける方針でやりましょうと言ってる
わけだから、やはり u"・・・" にするのが妥当だ。
というわけで>>209を訂正:
誤: print >>stdout, '"total","%s",%d' % (root, dirsize[root])
正: print >>stdout, u'"total","%s",%d' % (root, dirsize[root])
214デフォルトの名無しさん
2008/06/07(土) 15:55:33 print文はデバッグ用です。異論は認めない
215デフォルトの名無しさん
2008/06/07(土) 16:03:11 逆に、printをデバッグ用に使う奴はダメだろ。
216デフォルトの名無しさん
2008/06/07(土) 16:07:23 デバッグのつもりが余計に訳分からなくなる罠w
217デフォルトの名無しさん
2008/06/08(日) 00:00:44 0100
とすると
64
と表示される。
8進数なんて誰も使わんわ。
危ないからやめてくれよう
とすると
64
と表示される。
8進数なんて誰も使わんわ。
危ないからやめてくれよう
218デフォルトの名無しさん
2008/06/08(日) 00:03:06 二進数表記が欲しいなーと思ったことはあったような無かったような
219デフォルトの名無しさん
2008/06/08(日) 00:06:59 >217
Python3.0から8進表記は0o777のようになるとか
>218
同じく0b1101とかでできるようになる
Python3.0から8進表記は0o777のようになるとか
>218
同じく0b1101とかでできるようになる
221デフォルトの名無しさん
2008/06/08(日) 06:47:57 >>208
ありがとう
ありがとう
222デフォルトの名無しさん
2008/06/08(日) 14:16:16 こないだC++0xスレで二進表記ネタで喧嘩してたな。
いわく、二進表記は「馬鹿がする馬鹿な要望」と。
いわく、二進表記は「馬鹿がする馬鹿な要望」と。
223デフォルトの名無しさん
2008/06/08(日) 19:12:05 0b1101
0x0D にすべきか 0xFD にすべきか
0x0D にすべきか 0xFD にすべきか
224デフォルトの名無しさん
2008/06/08(日) 19:19:35225デフォルトの名無しさん
2008/06/08(日) 19:19:57 >>224
256じゃなくて255だった。orz
256じゃなくて255だった。orz
226デフォルトの名無しさん
2008/06/09(月) 04:50:57 代入する先の変数の型がbyte以外は0xFDで良いと思う
227デフォルトの名無しさん
2008/06/09(月) 07:18:58228デフォルトの名無しさん
2008/06/09(月) 10:24:40 >>226
Python の変数には型はない。
Python の変数には型はない。
229デフォルトの名無しさん
2008/06/09(月) 11:07:15 2の補数とかバイト数とか、どちらかといえばハード側の概念を
わざわざ持ち出す理由はないような
わざわざ持ち出す理由はないような
230デフォルトの名無しさん
2008/06/09(月) 11:21:32 表現って概念に疎いんだろうな
231デフォルトの名無しさん
2008/06/09(月) 16:43:15 リテラル周りは、煩雑になりがちだから、あんま記法は増やさないでほしい。
というか、その言語の持ってる特徴がよくわかる所だよな… >リテラル周り
というか、その言語の持ってる特徴がよくわかる所だよな… >リテラル周り
232デフォルトの名無しさん
2008/06/09(月) 18:38:37 うにコードや円光度は暗黙に適当に変換してくれて
必要なときだけ確定するのと同じようになればいいよ
必要なときだけ確定するのと同じようになればいいよ
233デフォルトの名無しさん
2008/06/10(火) 06:34:26 >>232はi18nで困ったことがないんだろうな。全部sjisで決め打ちなんじゃね?
234デフォルトの名無しさん
2008/06/10(火) 06:51:02 MS屋さんはMSがいろいろ面倒をみてくれるのでお気楽です
MSDNを漁る苦労は真似したくないけど
MSDNを漁る苦労は真似したくないけど
235デフォルトの名無しさん
2008/06/14(土) 08:57:59 うーんガンダム
236デフォルトの名無しさん
2008/07/16(水) 23:46:44 二進表記はいらんけど、
メガバイト単位のながーいビット列を
自在にあやつるモジュールが欲しいざんす。
メガバイト単位のながーいビット列を
自在にあやつるモジュールが欲しいざんす。
237デフォルトの名無しさん
2008/07/17(木) 05:20:03 簡単だから自作汁
238デフォルトの名無しさん
2008/07/27(日) 02:27:23 入門書のお勧めたのむ!
239デフォルトの名無しさん
2008/07/27(日) 02:32:47240デフォルトの名無しさん
2008/07/27(日) 02:40:38 ありがとう。
でも、喫茶とかで読みたいので、
本でよろしくです。
でも、喫茶とかで読みたいので、
本でよろしくです。
241デフォルトの名無しさん
2008/07/27(日) 03:07:56242デフォルトの名無しさん
2008/07/27(日) 14:20:02■ このスレッドは過去ログ倉庫に格納されています
ニュース
- テレビ朝日 本社から男性が転落し死亡。関連会社社員か 当たった通行人が左肩軽傷 [阿弥陀ヶ峰★]
- テレビ朝日本社から20~30代の関連会社社員とみられる男性が転落し死亡 六本木けやき坂通りの通行人にはけが人なし [少考さん★]
- 小島瑠璃子さん、代表取締役を務める会社を破産申請 [牛丼★]
- 「残クレ」でマイホーム、国が銀行向け保険 新型住宅ローン普及促す -日経 ★3 [少考さん★]
- 日本、G7への中国招待を懸念 議長国フランスに慎重な対応要請 [どどん★]
- 【サッカー】日本代表、FIFAランキング“4位”の強豪イングランドとの対戦が正式決定! 来年3月に聖地ウェンブリーで激突へ [久太郎★]
- 千晴におちんちん舐めてもらいたい♥
- ✋🏿( ・᷄ὢ・᷅ )どうも、VIPの堕天使ベルゼブブです
- 日本政府さん、中国が開示した音声データに対して捏造であるとなぜか主張しない!それなのにネトウヨは捏造捏造と連呼する模様 [472617201]
- 姉は貧乳で妹は巨乳ってパターンよくあるよな
- 【悲報】ジャップ、日中戦争に賛成が5割弱...軍歌の音が聞こえる... [856698234]
- ひまだねー
