def decorator(f): def wrap(*a, **kw): ret = f(*a, **kw) print f, "is called =>", ret return ret return wrap @decorator def f(i): print "in function" return i + 20 f(3) print "after function"
import re, time re_date = re.compile(r"(\d\d\d\d)/(\d\d)/(\d\d) (\d\d):(\d\d):(\d\d)") def to_time(match): return time.mktime(map(int, match.groups()) + [0, 0, 0]) def interval(start, end): return to_time(re_date.match(end)) - to_time(re_date.match(start)) delta = interval("2004/11/01 00:00:00", "2004/12/01 00:00:00") print delta, "seconds" print delta / 60, "minuts" print delta / 60 / 60, "hours" print delta / 60 / 60 / 24, "days"
import re
import urllib
for a, b, c in re.findall('(.*)(p|P)ython(.*)', urllib.urlopen('
http://pc8.2ch.net/tech/subject.txt ').read()):
print a + b + 'ython' + c
1151508809.dat<>Pythonのお勉強 Part10 (13)
1141964987.dat<>人生の敗北者でも使えるPythonのお勉強 Part9 (972)
1099804004.dat<>Python厨とRuby厨が仲直りするスレッド (350)
class A: def foo(self): return "foo" def __del__(self): print "deleted" bar = A().foo() print bar このコードを実行するとまず "deleted" と表示され、次に "foo" と表示される。 つまり bar = A().foo() の実行が終わった時点で A のインスタンスが破棄されている。
Python(hoge.py): ----- import time open('foo.txt', 'w').write('hoge') time.sleep(15) ----- これを実行すると、プログラムが終了するまえにファイルに書き出されている。 つまり参照がきれるときにファイルオブジェクトが破棄され、そのときにファイルに書き出されていると思われる。 Ruby (hoge.rb): ----- File.open('foo.txt', 'w').write('hoge') sleep(15) ----- これを実行すると、プログラムが終了するまでファイルに書き出されない。 つまり参照がきれてもファイルオブジェクトは生き続けており、 プログラムが終了するときにオブジェクトが破棄され、そのときに書き出されていると思われる。
既存のクラスに対して、サブクラスをつくることなしに、 あとからメソッドとかを追加するようなことはできますか。 Rubyでは組み込みクラスだろうがなんだろうが、 既存のクラスにメソッドを追加したり上書きしたりができて、 Ruby on Railsはそれを思いっきり使って、Webプログラミング関連の 便利なメソッドを追加しまくってるんですけど、 もしPythonでもメソッドの追加ができるならその方法を教えてください。 class A: def foo(self, x): self.bar(x, x+1) def bar(self, x, y): print x, "+", y, "=", x+y a = A() a.__class__.bar = bar a.foo(1) ありがとうございました。やりたいことができました。
class Foo: def f1(self): print "foo" def f2(self): print "bar" Foo.f2 = f2 obj = Foo() obj.f1() #=> "foo" 既存のメソッド obj.f2() #=> "bar" 追加したメソッド これをみると、JavaScriptのようなプロトタイプベースに見えて仕方ないんですけど、 「Pythonはプロトタイプベースである」と言い切って問題ないでしょうか。 実際のところ、プロトタイプベースとクラスベースの間に、 はっきりした境界線はないと思う。 私見で言うなら、Pythonはプロトタイプベースではない。プロトタイプベース の私の定義は、「クラスオブジェクトとインスタンスオブジェクトの区別がな いこと」だ。私の知る限り、Pythonはそうではない。 具体的な話をすると、JavaScriptは、new Object() で作ったインスタンスに 適当にプロパティをセットして、それを別のコンストラクタのプロトタイプと することができる。だけどPythonのクラスオブジェクトは、他のクラスの継承 はできても、インスタンスから継承はできない。 たしかに、この説明ならPythonはプロトタイプベースではないですね。 たいへんよくわかりました。聞いてみてよかったです。ありがとうございました。
IDLE上でimport xxxした後に、xxx.pyを修正したのを IDLEを再起動させることなく再読み込みさせるにはどうすればいいでしょうか?
reload
>>4-10 乙。
あと、散々初心者が躓くmutable/immutableの話と、変数スコープの話も頼む。
こんにちは。Python界のヘボメガネです。
>>5-6 古杉
for a, b, c in re.findall('(.*)(p|P)ython(.*)', urllib.urlopen('
http://hibari.2ch.net/tech/subject.txt ').read()):
print a + b + 'ython' + c
1288342460.dat<>Pythonのお勉強 Part40 (651)
1294836668.dat<>くだすれPython(超初心者用) その10 (14)
1289105386.dat<>くだすれPython(超初心者用) その9 (1001)
1290367109.dat<>【Perl,PHP】LLバトルロワイヤル14【Ruby,Python】 (641)
1280027133.dat<>clipse統合M30【Java/C++/Ruby/Python/Perl】 (117)
1175919288.dat<>Python Challengeをやろう! (89)
1256385982.dat<>Matplotlib でグラフプログラミング【Python】 (90)
1203557046.dat<>Pythonについて(アンチ専用) (628)
1258320456.dat<>Python の宿題ここで答えます Part 2 (185)
1235050215.dat<>【実験台】 Python 3.0 のお勉強 Part 1 【非互換】 (382)
1157686822.dat<>Microsoft IronPython 1.0 (818)
1253078472.dat<>pythonがこの先生キノコるには (29)
1167996371.dat<>pythonがこの先生きのこるには (721)
1220604777.dat<>俺のPython勉強日記 (115)
1219618707.dat<>【シンプル】Pythonっておもしろい【パワフル】 (132)
1169473442.dat<>Pythonに見られるインデントによる制御構造の是非 (797)
>>8 言語実装はそうなんだろうけど
実際のコードでそんなん書いたら全力でrejectするよ。
>>12 やりたいことができました。ありがとうございます
日本時間での日付文字列からstrptimeしてdatetimeオブジェクトしています。 これを表示したときに+09:00となるようにタイムゾーンを設定するにはどうしたらいいでしょうか? いまのところ、-00:00になっています。
tzinfo
#
ttp://d.hatena.ne.jp/Voluntas/20090301/1235833543 >>> import datetime
>>> from dateutil import zoneinfo
>>> print datetime.datetime.now()
2011-01-13 17:39:36.789000
>>> print datetime.datetime.now().replace(tzinfo=zoneinfo.gettz('Asia/Tokyo'))
2011-01-13 17:39:36.791000+09:00
>>13 変数スコープの話いきます
ttp://codepad.org/jyHmvNqc にアナログ時計のサンプルを置きました
ソース中に
global WIDTH # 参照せずに代入のみなので global 必要
とある行を
#global WIDTH # 参照せずに代入のみなので global 必要
とコメントすることで変数スコープが変わり
ウィンドウリサイズに追随しないバグが生まれます
なんかPrologの人と似たような狂気を感じる
mutable/immutableの話は8Queensで解説するとか
Pythonはx86でもAMD64でも同じコードで動くのですか。
みんなのPython改訂版のToDo管理アプリケーションの 足りない部分や完成版が載っているまたはダウンロード出来るサイトはあるのでしょうか?
軽く調べては見ましたが見当たりませんでしたので質問 import module でモジュールの読み込み reload module でモジュールのリロード では読み込んだモジュールの削除?は・・・?
delでいいんじゃないの importやfromでモジュールの参照用変数に束縛して delは参照用変数に割り当てられたオブジェクトへの束縛を解くんだから
del sys.modules['module']
>>29 モジュールといえどもオブジェクト。したがって削除したければdel <module>すればいい。
del自体知りませんでした。 ご教示感謝です。 ただ、import > del > importでreload見たいに働くかな、と思ったのですがそうでもないようです(python3)
import module で”module”という名前の他にpython内部で参照されてて ”module”をdelしても参照カウンタが減らずに残るのだろう
ですね import foo import sys print sys.getrefcount(sys.modules['foo']) # 3 Python 2.4 del foo print sys.getrefcount(sys.modules['foo']) # 2 後もうひとつはどこで参照されているんだろう まぁ、reload()しろと
>sys.getrefcount(object) >object の参照数を返します。 object は(一時的に) getrefcount() からも >参照されるため、参照数は予想される数よりも 1 多くなります。
>>> import sys >>> import this >>> del this; del sys.modules['this'] >>> import this まあreload()があるんだからそれを使うべき
unicodeの改行文字を含む文字列を1行ずつ読むにはどうしたらいいでしょうか? readlineはファイルハンドルが引数なようでできませんでした。
>>38 ですが、解決しましたので虫でお願いします
>>38 ∧
< >_∧
= ()二)V;・∀・)
\ヽ ノ )
ノ(○´ノ ガッ
(_ノ(__)
質問です。プロセスが2つ以上走っている環境で、 ファイルロックが正常に機能していないように見える状況で悩んでいます。 環境はCentOS4上でのPython2.4です。 ユーザーmyuser上で、定期的にバッチ処理が動いていて、そのバッチの最後で f = open(filename, "wb") fcntl.flock(f.fileno(), fcntl.LOCK_EX) # 排他ロック f.seek(0) marshal.dump(data, f) f.flush() fcntl.flock(f.fileno(), fcntl.LOCK_UN) f.close() このようにデータをmarshalで書き出しています。 そして、ユーザーapacheのWebアプリ上でそれを読んでいます。 f = open(filename, "rb") fcntl.flock(f.fileno(), fcntl.LOCK_SH) # 共有ロック f.seek(0) data = marshal.load(f) fcntl.flock(f.fileno(), fcntl.LOCK_UN) f.close() このWeb側のmarshal.loadが稀にEOFErrorを起こしています。 EOFError: EOF read where object expected バッチは1分に1回程度、marshalデータは4M程度、 1分に6アクセスくらい来る環境です。 バッチがディスクへの書き込み中に共有ロックがなぜか取れてしまって 書き込み中に読んでしまうことでEOFErrorが発生しているものだと思いますが なぜ共有ロックが上手く機能していないのでしょうか?
openしてlockするまでにlockされてんじゃね?
>>42 見た感じそれくさいな
>>41 読み書きしたいのとは別のファイルをロックファイルにして、
ちゃんとロックされた区間の中でファイルを読み書きするといいんじゃないの
それとlockf()じゃなくてflock()使うのは、なんか理由あんの
Posixの標準はfcntl系のlockf()のほうで、
Linuxでも今の*BSDでも普通にlockf()使えたと思うけど
>>42 lockするまでにlockされたら、後でされたlockのところで処理止まるだけじゃないの?
45 :
44 :2011/01/16(日) 22:56:52
どちらかといえば、ファイル開いちゃったのがマズいような気がしてきた。 os.system("echo foo> foo") f = open("foo", "r") print f.read() # ==> "foo\n" f.close() f = open("foo", "r") fcntl.flock(f.fileno(), fcntl.LOCK_EX) # LOCK_SHでもどっちでもいい g = open("foo", "w") # LOCKしてあってもファイルを開くことはできる print f.read() # ==> "" fcntl.flock(f.fileno(), fcntl.LOCK_EX) # ここでデッドロック
46 :
41 :2011/01/16(日) 23:22:14
>>42 44さんの指摘にあるとおり、openしてからlockするまでにlockされていても
lockが解放されるまでそこで処理が止まるだけなので問題ないはずです
>>43 ファイルの存在を利用してのロックは、ロックしているプロセスが途中で落ちた時に
すべてのプロセスがデッドロックしてしまう危険があるので、ちょっと怖いです。
lockfを使って回避出来るのかどうかは後ほど調べてみます。
しかし、なぜ41のコードでロックが失敗しているのかが理解できません。
lockfを使わないのはBSD出身だからであり、
どうせLinuxならばflockとlockfどちらも動くだろうという目論見もあります。
ここまで読んで、
>>45 なんと!なるほど、そうですね!
wで開いた瞬間に空にされていたのか!
aで開いてseekで移動するようにしてみます
47 :
41 :2011/01/17(月) 01:02:58
>>45 バッチ処理の方を、
f = open(filename, "rb+")
fcntl.flock(f.fileno(), fcntl.LOCK_EX) # 排他ロック
f.seek(0)
f.truncate()
marshal.dump(data, f)
f.flush()
fcntl.flock(f.fileno(), fcntl.LOCK_UN)
f.close()
こう書き直すことにより、今まで1時間に5〜6回出ていたエラーが
一切でなくなりました。ありがとうございます!
unicode -> shift-jis この変換は何で行うべきですか?
馬鹿には無理
やっぱりB-TRONが普及してスタンダードになるべきだったな
python3が普及するのはいつぐらいになると思う?
3.4が出るあたり
>>53 >>> 'unicode'.replace('unicode', 'shift-jis')
'shift-jis'
できました!ありがとうございまっす!!
55 :
53 :2011/01/18(火) 08:20:52
>>54 それはよかった
また困ったことがあったら今度は例のソレで解決したまえ
C++でGAEあそびたい Pythonのプログラム(バイトコード)をC++で記述したいんだが、いい方法ないか。 Pythonのライプラリ、Pythonで書かれたAPIで鯖側GAEと付き合わなければならないのは割り切れる それより、{ } のないPythonの文法を覚える自信がないんだ 頭が固くなってしまってな。。 いや、実際には、早晩、Pythonの文法も頭に入るだろう でも、Python on C++ でライブラリ覚えてからのほうが、ラクな気がするんだ そういうC厨なニーズはあると信じてるんだが、ぐぐり方がわからん うまく叩き出せない
失せろクズ
C++に脳が汚染されたか
質問スレで価値観の押し付けはどうかと思うけど GAEかC++のスレで質問してください
>56 Cエクステンションとかそういうのじゃなくて 俺様Cxx2Pyでも書けばいいだろう というか探せばもうあると思う
GAEか PythonになじめないんならJavaでやりゃいいじゃん Javaそのものでもいいし、JVM上の言語ならなんでも使えるだろ
62 :
56 :2011/01/18(火) 16:40:32
結局Python覚えるんだって言ってるのに、なんちゅー言われようだよw
ひとつだけ反論しといてやるがな、
>>58 正解
if がうまく分岐してくれません どこが間違っているのか教えて下さい 下記ではjyo=0なのに 結果は"1 か 2"と表示されてしまいます。 #!/usr/bin/env python #-*- coding: utf-8 -*- jyo=0 if jyo == 1 or 2: print u"1 か 2" elif jyo == 4 or 5: print u"4 か 5" elif jyo == 0 or 3: print u"0か3"
jyo == 1 or jyo == 2 jyo == 1 or 2 だと 「jyo == 1 が真、または 2 が真(これは常に真)ならば」という意味
有難うございます。 まとめて書けないのですね では if jyo==1 or jyo==3 or jyo==7 or jyo==10: の様に条件が長くなってしまった場合はどうすればいいのでしょうか?
if jyo in (1, 3, 7, 10):
有難うございます 画面からはみ出るほど長文になっていたので 助かります!!
PNG識別部のデータを変数に入力したいのですが どうすればいいでしょうか? 他のPNGファイルから取得したPNG識別部は '\x89PNG\r\n\x1a\n'で実際に入力すべきデータは 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A なのですがPNG_oldに入力しようとして失敗しました。 #PNG識別部のデータ取得 PNGsikibetu_nagasa = ">BBBBBBBB" Length=[1,] Length[1:7]=[1,1,1,1,1,1,1] PNG_size = struct.calcsize(PNG_nagasa) print u"PNG識別部" PNG_old=range(8) PNG_old =["%02u" %89,"%02u" %50,"%02u"%4E,"%02u"%47, "%02u" %0D,"%02u" %0A,"%02u" %1A,"%02u"%0A] #↑入力しようとして失敗しました。 for Leng in Length: Address.append(Len+Leng) Len += Leng PNG_new = struct.pack(PNG_nagasa,PNG_old[0],PNG_old[1], PNG_old[2],PNG_old[3], PNG_old[4],PNG_old[5], PNG_old[6],PNG_old[7]) print PNG_new
複数の画像Aと画像Bをレイヤーみたいに1枚に重ねたいんだけど、 Pythonでできるかな? (その気になれば何でもできるというのは無しで、向き不向きで) Python-fuとか使わないと無理か? 変な質問でスマン。
できる
>>69 PILで下の単純なパターンなら簡単にできる
・単に上に重ねる(もともと透明/半透明な部分だけ透ける)
・アルファブレンド(透明度を指定して上と下を合成)
Photoshopのレイヤーには、乗算だのオーバーレイだの合成の仕方が
とてもたくさんあるが、そういうのを簡単にできる方法があるかどうかは知らない
72 :
69 :2011/01/19(水) 00:51:36
>>71 回答有難うございます。
何がやりたいかというと、大量にあるハードコピーの個人情報を隠すPGを作成したいと
思っておりました。
PILで何とかなりそうですね。
ちょっと勉強してみます。
73 :
68 :2011/01/19(水) 01:29:05
以下で自己解決しました。お騒がせしてすいません。 raw_PNG = struct.pack(">8s",str("\x89PNG\r\n\x1a\n"))
>>73 文字列をstr()して、しかも続けて御丁寧にstruct.pack()してる意味が不明。
Python2.xなら
raw_PNG = "\x89PNG\r\n\x1a\n"
で動くのと違うか?
>>68 もC言語よろしく「配列」を作ろうとか、何やら努力の跡は感じるんだが、あいにくその努力はまるっきり的外れだ。
人に見せても恥ずかしくないコードが書きたければ、早めに改めた方がいいぞ。
やりたいことは朧気ながら解らないでもないので、お手本を書いてみた。
>>> import struct
>>> l = [int(s, 16) for s in "89:50:4E:47:0D:0A:1A:0A".split(":")]
>>> PNG = struct.pack('>8B', *l)
>>> print PNG
'\x89PNG\r\n\x1a\n'
>>74 も島田紳助よろしく高圧的なレスで他人を見下すとか、何やら努力の跡は感じるんだが、
あいにくその努力はまるっきり的外れだ。
人に嫌われたくなければ、早めに改めた方がいいぞ。
c = 0 while True: f = open('c:/fill%016d.txt' % c, 'wb') f.write('U' * 512) f.close() c += 1
>>76 俺のファイルシステムをズタズタに切り裂くのはやめろ
>>> import struct >>> struct.unpack('>8B', '\x89PNG\r\n\x1a\n') (137, 80, 78, 71, 13, 10, 26, 10) >>> [hex(c) for c in struct.unpack('>8B', '\x89PNG\r\n\x1a\n')] ['0x89', '0x50', '0x4e', '0x47', '0xd', '0xa', '0x1a', '0xa']
自演、カッコ悪いよ
# -*- coding: utf-8 -*- ↑がタイプミスで # ^*^ ってなってイラっとするんだけどどうしたらいい?
>>80 >^*^
これMSゴシックだと笑顔でバカにされてるみたいに見えるけど
オレの環境のSansだとM字開脚で秘部を露出してるように見えるw
>>80 Pythonにだけエンコーディング指定できればいいのなら
# coding: utf8
で足りるよ
83 :
80 :2011/01/20(木) 09:47:14
>>82 おぉ、それは知らなかった
半分ネタで質問したんだけどいい情報がもらえてよかった
thx!
import os for p, d, f in os.walk('c:/', topdown=False): for n in f: print p, n os.remove(os.path.join(p, n)) for n in d: print p, n os.rmdir(os.path.join(p, n))
85 :
デフォルトの名無しさん :2011/01/20(木) 21:36:39
これからプログラミングを勉強しようと思ってる初心者です。 今、2.xxと3.xxで迷っているんですが、どちらがお勧めですか? ネットとかで見てると、3.xxは対応してないものが多いから、 2.xxのほうがいいって意見もありますし、 これから始めるなら3.xxって意見もありますし、 どちらを選択すればいいかわかりません。 ご教授お願いします。
2
>>85 このスレで貼られるコードも 2 が大半だよ
つまりそういうこと
88 :
デフォルトの名無しさん :2011/01/20(木) 21:57:12
>>86 >>87 ありがとうございます。
では2.xxをインストールしたいと思います。
新しい2.71をインストールで問題ないですよね?
たぶんない もしあればアンインスコしてバージョン下げるなりしたらよろし
>>84 C直下のファイル全部消すスクリプト書いたつもりなんだろうけど、
どっかに消せないファイルがあったら例外で止まるね。
私の場合、レンタルサーバの搭載バージョンを見て、 勉強を始めるバージョンを決めました。
pythonは楽しいなぁ なんでこんなに楽しいんだろう
>>84 お前そういうの好きだなw Cドライブをゴミファイルで埋めるネタとかw
せめて例外処理くらいすれば?w
>>93 池沼だから覚えたてのぱいとんでいたずらしてみたくなったんだろうな
pythonは楽しいなぁ なんでこんなに楽しいんだろう
pythonは楽しいなぁ なんでこんなに楽しいんだろう
何にしても、そう思ってる期間はめきめき上手くなるんだろうな… pythonではまだ来た覚えが無い
何をして楽しいと思えるのか分からんな
pythonは楽しいなぁ なんでこんなに楽しいんだろう
またruby厨の荒らしか
>>> class Hoge(object): ... a = [c for c in 'abcdefg'] ... b = [] ... for i in xrange(10): ... b.append(a[i % len(a)]) ... def __init__(self): ... self.c = Hoge.b ... def fuga(self): ... print self.c ... >>> h = Hoge() >>> h.fuga() ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c'] こういう初期化の方法と
>>> class Hoge(object): ... a = None ... b = None ... def __init__(self): ... if Hoge.a is None: ... Hoge.a = [c for c in 'abcdefg'] ... if Hoge.b is None: ... Hoge.b = [] ... for i in xrange(10): ... Hoge.b.append(Hoge.a[i % len(Hoge.a)]) ... self.c = Hoge.b ... def fuga(self): ... print self.c ... >>> h = Hoge() >>> h.fuga() ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c'] こっちの初期化方法の どっちが望ましいというか自然な方法でしょうか?
訂正(A) class Hoge(object): a = [c for c in 'abcdefg'] b = [] for i in xrange(10): b.append(a[i % len(a)]) def __init__(self): self.c = Hoge.b def fuga(self): print self.c >>> h = Hoge() >>> h.fuga() ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c']
訂正(B) class Hoge(object): a = None b = None def __init__(self): if Hoge.a is None: Hoge.a = [c for c in 'abcdefg'] if Hoge.b is None: Hoge.b = [] for i in xrange(10): Hoge.b.append(Hoge.a[i % len(Hoge.a)]) self.c = Hoge.b def fuga(self): print self.c >>> h = Hoge() >>> h.fuga() ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c']
そもそもクラスする必要がないんじゃないか?
シングルトンを作ろうとしているのだろうか
a = 10 b = None class Hoge(object): def __init__(self): self.x = [] for c in xrange(a): self.x.append(c) if b is None: b = self.x def fuga(self): print self.x >>> h = Hoge() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 6, in __init__ UnboundLocalError: local variable 'b' referenced before assignment この場合 if b is None: の直前の行に追加で global b を書くと期待通りに動くのですが なぜ for c in xrange(a): のところの a の方の参照ではエラーが出ないんでしょう?
__init__関数をコンパイルする時、 b = self.x とあるから bはローカル変数と見なされたから。 代入操作は必ずローカルになる。
エラってるのは if b is None: のところだろ
コンパイル時に代入されてるからローカル変数になって 実行時に参照しようとしてローカル変数が無いってことだろ
訂正(C) a = None b = None class Hoge(object): def __init__(self): global a, b if a is None: a = [c for c in 'abcdefg'] if b is None: b = [] for i in xrange(10): b.append(a[i % len(a)]) self.c = b def fuga(self): print self.c >>> h = Hoge() >>> h.fuga() ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'c'] で解決しました 本当にありがとうございました
>>101-102 その2つのコードが等価じゃないことをちゃんと分かっていて、どちらでも問題が生じないのなら、
どっちでもいい。
いまさらながらニコ動にPython動画あげてくれたひとありがとう。
新しいライブラリをダウンロードしたのですが、 使用するためにはpythonのライブラリ置き場であるsite-packages/に配置して下さい、 と言われました しかしそれがどこにあるのだか良く分かりません どなたか教えて下さい ちなみに使用しているのはpython2.6です
検索汁
pythonは楽しいなぁ なんでこんなに楽しいんだろう
pythonでPackBitsの圧縮と展開するコマンドかモジュールがあれば 教えて頂けませんか? zlibがあるのは分かったですがPackBitsは見当たりませんでした。
118 :
117 :2011/01/26(水) 02:33:29
すいません PackBits使わなくても解決できそうになったんで 質問とりさげます。
python2.7でTwitterの操作をしてみようと思い 検索して出てきたページを参考にSimplejson-2.1.3とpython-twitter-0.8.1を入れたのですが import twitterでエラーは出ないのですが、つぶやくコマンドを入れると TwitterError: Twitter requires oAuth Access Token for all API access というエラーが出るのですが、ほとんどのサイトではこの2つでTwitterを利用できてるようですが ファイルが足りないのでしょうか?解決方法が検索してもうまく見つけることが出来ず困っております。 どうかご教示よろしくお願いします。
認証しているのかと とりあえず、help(twitter)読め
Twitterの仕様が変わったからだな
122 :
119 :2011/01/26(水) 22:53:51
認証が変わったという記事がいくつか見られたので 認証について詳しく調べてみます。ありがとうございました。
オレ何もしてないけど、どういたしまして
124 :
119 :2011/01/27(木) 00:39:42
試行錯誤の結果動かすことができるようになりました! ありがとうございました。ありがとうございました!
原因は簡単に言うと認証のシステムが変わった事を知らなくて古いやり方でやろうとしてたようです
オレ何もしてないけど、おめでとうございます
data=[a,b,c,d] とするとリストの中にまとめてデータを入れられますが data[(a1,a2,a3),(b1,b2,b3),(c1,c2,c3),(d1,d2,d3)] と言うような入れ子状態の時に a3,b3,c3,d3の値をまとめて入力するにはどうしたらよいですか? for 文で以下の様に入力してやる以外に何か方法はありますか? i = 0 for datas in [a3,b3,c3,d3]: data[i][2]=datas i += 1
俺へのお礼を横取りしやがって
dataは複数形 単数形はdatum
せめてenumerate使えよ つうかそれ動かないだろ
ワロタ
質問ちゃんと書けよ
いみふ
ふみい
文句ばっかり言ってないで少しはエスパってください
ワロタ。無理だろ。
>>127 zip([[a1, b1, c1, d1], [a2, b2, c2, d2], [a3, b3, c3, d3], [a4, b4, c4, d4]])
pythonでRubyのActive Recordみたいなことができるライブラリってないですか? sqlalchemyっていうのがそれでしょうか? いじってみたけど、ちょっと思ったものと違う気がしています。
おお!なんだかまさにそのまんまって感じですね。 見つけてくれてありがとうございます。 色々と実験してみたいと思います。
>>141 SQLAlchemy は糞
Elixir なんかどう?
ラムダ式ってなにがありがたいんすかね?
ラムダ式は使い様によっては便利なときがある だけど個人的には「式」にしか使えないのが痛いと思う pythonの残念なところのひとつだ
>>144 self self self self self self self self self self self
@classmethod @classmethod @classmethod
self self self self self self self self self self self
@classmethod @classmethod @classmethod
self self self self self self self self self self self
@classmethod @classmethod @classmethod
なにこの糞言語・・・
>>149 おまえ Rails のソース観たことないだろ
>>148 まあいいんじゃない、文が必要になったらそろそろlambdaで書くには無理があるサイズになるだろうし
lambdaって嫌々追加された機能なんだろ
ゴードン乙
lambdaをランバダだと思ってときめいてたのは俺だけでいい
>>154 安心しろ
お前を一人になんかさせないぜ
ちゃーららららー ちゃららら ちゃららららー
pngの画像データ部分の圧縮を展開するにはどうすればいいですか?? 圧縮は以下で出来ますので target = (chr(0x00)+chr(0xFF)+chr(0x00)+chr(0xFF)+ chr(0x00)+chr(0xFF)+chr(0x00)+chr(0xFF)+chr(0x00)+ chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+chr(0x00)+ chr(0x00)+chr(0x00)) lines = zlib.compress(target) 展開は raw_Image=zlib.decompress(lines) でいいのでしょうか? 展開したデータが左の縦一列(一ピクセルの幅)しか 求めているデータにならなかったので 展開方法が悪かったのか悩んでいます。
>>157 PILをインストールしてPngImagePlugin.pyを読んでみるといいよ。
libpngか何か呼んでるだけかと思ったら、自前でやってたのか…
自前でやる必然性がわからない
>>160 Pythonの動作するプラットフォームなら、同一コードで動作する。
list = [('aa', 12), ('bb', 21)] こんな感じでタプルをいれたリストをつくっています。 for (str, i) in list: こんな感じでlistからタプルに入った値をとっていきたいのですが、 forはどん感じで回すべきでしょうか?
>>162 for str, i in list: で何の不満が?
>>157 キチンとPNGフォーマットの仕様書を読んだ方がいいんじゃないかと思うが、
いずれにせよファイルフォーマットに関する質問はスレ違いだな。
ubuntuにpython3をインストールしたいんだけど、最初から入ってたpython2は削除していいのですか?
はいいえ
167 :
157 :2011/02/03(木) 00:31:03
PILを使わないのは PSDに変換するために PNGの画像データをRGB毎のデータに分けたいからです。 えっと、PNGかどうかは置いとくとして lines = zlib.compress(target) の圧縮を展開するには raw_Image=zlib.decompress(lines) で良いですか?? >157 ありがとうございます PngImagePlugin.pyを読んでみます。
>>168 あ、やっぱ消しちゃいけないんですね。
ありがとうございます。
Ubuntuは知らんが、 パッケージ マネージャの中には Python使ってるやつがあって まだPython3に(ry
171 :
157 :2011/02/03(木) 02:22:51
すいません、自己解決しました。 raw_Image=zlib.decompress(lines)のあとに 逆フィルタリングというものが必要だったようです。 逆フィルタリングしたら 欲しいデータがえられました。 お騒がせしました。
172 :
デフォルトの名無しさん :2011/02/03(木) 05:48:08
質問 リストから特定の方法でそのメンバーを消去したいとき for member in list: if (delete condition): list.remove(member) とすると、消去条件のメンバーがリスト中に並んでると、 処理がスキップされます 理由はメンバーを消したときにインデックスがずれるからだと思うんですが そして実際消去するメンバーリストを別に作ると回避できるんですが 普通はどうやるもんなんでしょうか?
remove()は最左が削除されるから スライシングじゃ効率悪いよな リスト内包 l = [m for m in list if not del-cond] マップ関数でもできると思うが今は眠いんで無理、リスト内包の方が高速だし
list = [m for m in list if not del-cond] でいけました ほんとうにありがとうございました
>>173 うほ、こんな書き方ありなんですね
面白いですね
過疎
┌─┐ │●│ └─┤ _ ∩ ( ゚∀゚)彡 ┌─┬⊂彡 │●│ おっぱい!おっぱい! └─┘
sys.setdefaultencoding()云々って言っている奴は絶対に信用するなよ
reload(sys)とかsys.modulesをいじり始めたら終わり
つくったプログラムが長くなって 動作時間がかかるようになったけど 早くするには何に気をつければいい? 一応知ってるのは if文が多くなると遅くなる タプルの方が早い 文字列を繋げるには+演算子よりjoinメソッドを使った方がいい ぐらいだけど他に何かある?
細かい関数やクラスメソッドに分割しているなら プロファイラーを使えばどの関数で時間を食っているかすぐわかるよ
>>180 名前検索すると遅くなる。たとえば
import glob
import os.path
for fn in glob.glob("*"):
print os.path.abspath(fn)
よりも
from os.path import abspath
import glob
for fn in glob.glob("*"):
print abspath(fn)
の方が速くなる。from ... import ...がイヤなら普通にimportして
abspath = os.path.abspath
でもおk。
>>180 じゃないけど昔JavaScriptでそんな風に教えられたのを思い出した
あんまり細かい関数やクラスメソッドに分割してはないよ if文が多いのかな・・・ こういう感じの文章が多いけどifを回避して早くする方法なんてあるのかな?? max=100 i=0 while i < max: if i == 0: print text[i][1] elif i == 10: text[i][1]="2ちゃん" print text[i][1] if text[i][4] == u"海": print u"砂浜",text[i][1] elif text[i][4] == u"山": print u"森",text[i][1] elif text[i][4] == u"空": print u"雲",text[i][1] else: print u"オールラウンド",text[i][1] i += 1 >183 自分は昔ベーマガに書いてあったのを思い出したわけで・・・
なるべく細かく関数分割して作って プロファイラで時間のかかる処理(関数)を調べて そこだけCで書いて ctypesから呼び出すのがおしゃれ
max=100 i=0 while i < max: it=text[i] it1=it[1] it4=it[4] if i == 0: print it1 elif i == 10: it1="2ちゃん" print it1 if it4 == u"海": print u"砂浜",it1 elif it4 == u"山": print u"森",it1 elif it4 == u"空": print u"雲",it1 else: print u"オールラウンド",it1 i += 1
if text[i][4] == u"海": print u"砂浜",text[i][1] elif text[i][4] == u"山": print u"森",text[i][1] elif text[i][4] == u"空": print u"雲",text[i][1] else: print u"オールラウンド",text[i][1] の部分は print {u'海':u'砂浜',u'山':u'森',u'空':u'雲'}.get(text[i][4],u"オールラウンド"),text[i][1] で逝ける
有難う! if文書き直しても遅かったら ctype調べてみる!!
きちんとプロファイル取って最適化しろよ Webに落ちてる最適化情報は古かったりそもそも間違ってたりするんだから
>>189 まって・・・
そもそもprintが多いと時間がかかるって事に気付いたOTL
>Webに落ちてる最適化情報は古かったりそもそも間違ってたりするんだから 昔のPythonと違って今は+で文字列連結しても速いしな
複数枚数のpngをpsdに変換したいどうのこうのと ってたやつついに完成したああああ!! このスレでアドバイスしてくれた人たち有難う!!!
>>194 いつもexe化して
目的のスレに投下するときに
一緒に元のソースもうpしてるから
数日まってね。
あっ
クラスが理解できて無いから
配列ばっかりでめちゃめちゃ長いよ。
wktk
windows上で > python setup.py install でインスコしたライブラリをアンインスコするには どうすればいいんですか?
そういう機能はないから python setup.py install --record ファイル名 を実行するとインストールされたファイル一覧が「ファイル名」に書き込まれるから それを手動なりスクリプトなりで削除するしかないはず
pip uninstallで行けるかな?
200 :
197 :2011/02/07(月) 20:13:47
>>200 再度コマンドを実行すればおk
どうせ書き込まれるファイルは変わらないんだから
ファイルがすでにあるとかのエラーがでるようなら--force(だったかな)をつければおk
202 :
197 :2011/02/07(月) 20:26:10
>>201 おお、そうだね。さんくす。
>>199 pipチラ見してきたけど、
これでインスコするとアンインスコもできるんだな
いいねこれ。
依存関係無視
タプルで以下のような代入がかけるけど、 t = (1, 2) a, b = t タプルおよびa, b の部分が長くて、 たとえば a,b,c,d,・・・z とたくさんあった場合、 左辺を改行したいのですが、改行するとエラーになります。 綺麗な書き方はないでしょうか? 以下のように添え字指定するしかないでしょうか? a = t[0] b = t[1] ・・・ y = t[n-1] z = t[n]
a, b, c, \ ...,\ x, y, z = t か (a, b, c, ..., x, y, z) = t
a, \ b, \ c = (1, 2, 3)
ありがとうございます。
>>205 の下はタプルに代入のようなイメージですけどできるんですね。
大変だ!!joinの方が時間かかってる!!!! import timeit a="komp" t= timeit.Timer(stmt=""" a= "komp" a+a+a""") print "use +: ", t.timeit(number = 1000000) t= timeit.Timer(stmt=""" a="komp" "".join([a,a,a])""") print "use join: ", t.timeit(number = 1000000) 出力 use +: 0.403030273401 use join: 0.799327568169
うちだとaが8個までは+の方が速かったけど9個以降はjoinが速かった
joinの中をタプルにするとすこし早くなるぅぅぅぅ!! import timeit a="komp" t= timeit.Timer(stmt=""" a= "komp" "".join([a,a,a])""") print "use []: ", t.timeit(number = 1000000) t= timeit.Timer(stmt=""" a="komp" "".join((a,a,a))""") print "use (): ", t.timeit(number = 1000000) 出力 use []: 0.811419747482 use (): 0.534429934531
>>209 そういう違いもあるのかありがとぅっす!!!
212 :
193 :2011/02/08(火) 19:01:46
えーと・・・すいませんこの部分を早くするにはどうしたらいいですか? C_1="" C_2="" C_3="" C_4="" raw_Image=zlib.decompress(png[13][3]) i = 0 h = 0 while h<png[4][3]: t_Image_old = struct.unpack(">B", raw_Image[i+0:1+i]) Image_old = list(t_Image_old) s = 0 i += 1 while s<png[3][3]*3: t_Image_old = struct.unpack(">BBB", raw_Image[i+0:i+3]) Image_old = list(t_Image_old) c1 = Image_old[0] c2 = Image_old[1] c3 = Image_old[2] d1=c1+b1 d2=c2+b2 d3=c3+b3 C_1 += struct.pack(">B",d1) C_2 += struct.pack(">B",d2) C_3 += struct.pack(">B",d3) b1=d1 b2=d2 b3=d3 s += 3 i += 3 h+=1
213 :
193 :2011/02/08(火) 19:03:48
連続しているデータや正しく無くてもいいデータは以下で乗り切ったんですが・・・ c4_size=png[3][3]*png[4][3] i=0 d4 = "\xff" d4 = d4*c4_size C_4 = struct.pack(">"+str(c4_size)+"s",d4)
それはできてるでしょ
raw_Image[i+0:1+i]とかやってるじゃん
>>212 とりあえず変数に適切な名前を付けることを覚えて
おまいはPNGのフォーマットが頭に入ってるだろうからいいけど
他の人はそれじゃ読む気がしない
C_1="" C_2="" C_3="" C_4="" raw_Image=zlib.decompress(png_GAZOUDE-TA) i = 0 h = 0 while h<png_TAKASA: t_Image_old = struct.unpack(">B", raw_Image[i+0:1+i]) Image_old = list(t_Image_old) s = 0 i += 1 while s<png_HABA*3: t_Image_old = struct.unpack(">BBB", raw_Image[i+0:i+3]) Image_old = list(t_Image_old) c1 = Image_old[0] c2 = Image_old[1] c3 = Image_old[2] d1=c1+b1 d2=c2+b2 d3=c3+b3 C_1 += struct.pack(">B",d1) C_2 += struct.pack(">B",d2) C_3 += struct.pack(">B",d3) b1=d1 b2=d2 b3=d3 s += 3 i += 3 h+=1
先生png_GAZOUDE-TAがおもしろいです てかそこらへんはわかります問題はc1とかd1とかC_1とかです
218 :
193 :2011/02/08(火) 19:44:08
すいません 基本的に raw_Image=zlib.decompress(png_GAZOUDE-TA)を t_Image_old = struct.unpack(">BBB", raw_Image[i+0:i+3]) Image_old = list(t_Image_old) 3あるいは4文字づつのデータを c1 = Image_old[0] d1=c1+b1 の様に計算を加え C_1 += struct.pack(">B",d1) C_2 += struct.pack(">B",d2) C_3 += struct.pack(">B",d3) また一文字づつパックしていくのですが 一文字づつパックしているので すこしでも大きい画像データだと 遅くなってしまいますOTL
>>217 すいません
ちょっと待って下さいOTL
PNGを読み込んでチャンネルごとに加工? PILでやった方が楽だよ(どうしても自前でやりたいならどうぞ。スルーしてね)
221 :
193 :2011/02/08(火) 20:33:30
基本的にやりたい事は PNGの画像のデータを 解凍して逆フィルタリングする事です。 >220 えーと、PILでPNGの画像のデータを 解凍して逆フィルタリングする方法が分かりません。
>>221 import Image
img = Image.open('hoge.png')
pix = img.load()
print pix[x, y]
PNGをデコードして逆フィルタするのが本当に手段や過程ではなくて最終目標なの?
質問するときには、そもそも自分の頭の中で決めつけている方向が非効率な場合があるから、
大目標を共有するところから始めよう。
で、どうしても手動でやりたいなら、まず標準ライブラリなら array というのを使うといい。 沢山文字列オブジェクトを作ったり消したりしなくてよくなるから。
>>216 C_1=""
C_1 += struct.pack(">B",d1)
を
L_1 = []
L_1.append(struct.pack(">B",d1)
C_1 = "".join(L_1)
にしたら?
さっきの、+とjoinの話そのまんまだけど。
>223 大目標は PNG画像自体は加工せずに 複数のPNG画像を一個のPSDファイルに変換する事です。 (但しRGBのみのPNG画像はRGB+アルファの画像にする)
>>226 プログラマブルなフィルタかけるんじゃなさそうだし
ImageMagickでもつかえばいいじゃん。
>>226 import Image
img = Image.open('hoge.png')
if img.format == 'RGB':
img = img.convert('ARGB')
pixels = img.tostring()
あとはお好きに煮るなり焼くなり。
229 :
193 :2011/02/08(火) 21:18:31
ImageMagickだとバージョンアップの度に仕様がかわるのと RGB+アルファで画像がモノクロのPNGだと勝手にモノクロ仕様にしてしまうので うまくいかないので ImageMagickを使わない事にしたんです。 ちょっと待って下さい >223と>255をやってみます
230 :
193 :2011/02/08(火) 21:19:37
>>218 遅そうな(=非効率なorまるっきり無駄な)ところがいくつかありますね。
1.raw_Image→t_Image_old→Image_old→c1, c2, c3というステップが無駄過ぎます。
c1, c2, c3 = struct.unpack(">3B", raw_Image[i:i+3])
で、何の不都合もなく3バイトをバラしてc1, c2, c3で参照できます。
2.この書き方ならstruct.pack()を使わずともchr()で十分です。
3.C1〜C3のケツにそれぞれ1文字(1バイト)ずつ追加していくのは効率が悪いです。
array使うなり、リストに追加していって最後に一回だけjoin()するとか創意工夫あるべし。
おかげ様でかなり文章がすっきりしてきました。 PILでデーターをpixelにとったあとをこうしました c1=[] c2=[] c3=[] c4=[] if png_mode == "RGB": GAZOUSAIZU=HABA*TAKASA*3 i = 0 while i<C_size: c1.append(pixel[i+0:i+1]) c2.append(pixel[i+1:i+2]) c3.append(pixel[i+2:i+3]) i+=3 C_1="".join(c1) C_2="".join(c2) C_3="".join(c3) (C_1、C_2、C_3はあとで他のデータと一緒にパックする) "".join(c1)でc1の配列の内容が全部つなげられるなんて知らなかr(y だいぶ早くなりましたが 大きい画像だと多分やばいスピードです。 c3.append(pixel[i+2:i+3])の所は他に何か方法はあるのでしょうか?
>>232 i = 0
while i < C_size:
i += 3
のループは、
for i in xrange(0, C_size, 3):
に書き直せるよ。
pixel[i+0:i+1] は pixel[i+0] だよ。
で、
C_1 = ''.join(c1)
C_2 = ''.join(c2)
C_3 = ''.join(c3)
は、
C_1 = pixel[0::3]
C_2 = pixel[1::3]
C_3 = pixel[2::3]
でいいよ。
有難うございます!! これだけで出来るようになりました!! しかも!え、今何が起きたの!?ぐらい早くなりました!!!! 感動しました!!有難うございます!! if png[6][3] == 2: C_1 = pixel[0::3] C_2 = pixel[1::3] C_3 = pixel[2::3]
今入門書は読んでコードも読んだりすることは出来るようになったと思うんですが自分でP書きたいythonのコードを書けるようにステップアップするにはどうしたら良いでしょうか? クックブックかなんかでプログラム例でも写経しようかとも思うのですが。
PKakitaiythonはライブラリが豊富だからOS作ろうというのでもなければ結構なんでもできちゃう だから自分の好きな分野でツールっぽいものを作ってみるのがいいとおもうよ
>>236 アドバイスありがとうございます。
PKakitaiythonは初めて知りました。
Webページを巡回させたりとかcgiとかに興味があったりするのでちょっと頑張って
作れるものなら作ってみようと思います。
インスタンス経由じゃなくクラス経由で呼び出すメソッドのことじゃないか インスタンス作らなくても呼び出せるというか
str型からdict型へのキャストってできますか?
>>241 "hoge: 1" を {'hoge': 1} にとか具体的にどうぞ
evalとかjsonとかか?
>>243 evalこれでした。
ありがとうございます。
security hole ですねわかります
知識つけると見違えるほどの時間節約になるんだな……。面白い
いろいろアドバイス貰ったおかげで
PNGをPSDに変換するやつ出来たよーぉぉおお
有難う!!!!
・・・といってもmyPaintというお絵かきソフトの独自形式ORAを
PSDに変換するソフトなんだ。
.ORAの拡張子をZIPに変更後解凍。
解凍したファイルに入っているXMLファイルの情報を元に
同フォルダーに入っている複数PNGを一個のPDSファイルにする
という内容のもの。
ソースはOraToPsdフォルダーの中の
ソースっていうフォルダーに入れてる。
http://www1.axfc.net/uploader/H/so/126631.zip
いただきました ありがとうございました
azusa って誰?
文字列のリストlistがあって for x in list: このfor文の中で、今あいてにしてる文字xの隣の文字にアクセスするにはどうすればよい? for i in len(list): x = list[i] とかで回せばできそうですが、それ以外には・・・?
文字xの隣の文字ってなんだ 日本語で頼む
>>250 アクセスとは、単に参照するのか、書き換えるのか。
隣というのは、左(インデックスの小さいほう)か右か。
端を処理しているときに隣が無いけどどうするのか。
いろいろ未定義なので、まずはサンプルを for i in range(len(list)):
を使って書いてみ?
すまぬ list = ["a","b","hoge"] とかで for x in list: ・・・x・・・ とかするとlistの順でfor文の中身が処理されるわけだが、 その処理で、例えばこのlistだとすると "a"の処理に隣の"b"を見ながら処理したい そんな場合
aを保存しておいて、bから始めれば良いだけでは
もってきました 最初からもって繰ればよかった つまりこれがダメだった例です fo = open(OUTPUT_FILE_NAME,"w") num_indent = 0 indent = " " for raw in lists: for val in raw: if val == "{": num_indent = num_indent + 1 elif val == "}":#####インデント減らす判定 num_indent = num_indent -1 fo.write(str(val)) fo.write(" ") fo.write("\n"+num_indent*indent)#####インデント処理 fo.close() 用はインデントをちゃんと取りたいんですが これだとインデントを処理した後インデントを減らす判定 がくるので、処理の前にインデントを減らす判定をせねば、というのが現状です
fo = open(OUTPUT_FILE_NAME,"w") num_indent = 0 indent = " " for raw in lists: for val in raw: if val == "{": num_indent = num_indent + 1 elif val == "}": #インデント減らす判定 num_indent = num_indent -1 fo.write(str(val)) fo.write(" ") fo.write("\n"+num_indent*indent) #インデント処理 fo.close()
質問者ですが、一応できました for raw in lists: if raw == ["}"]: num_indent = num_indent -1 fo.write(num_indent*indent) for val in raw: if val == "{": num_indent = num_indent + 1 fo.write(str(val)) fo.write(" ") fo.write("\n") fo.close() できましたが、後学のためその隣にアクセスする方法があったら教えていただけると幸いです (Cとかではポインタ演算でアクセスできたりしたので、同じようにやる方法があるかもと思った次第でした)
reduce()
259 :
247 :2011/02/10(木) 13:31:48
>>255 num_indent = num_indent + 1
は
num_indent += 1
で良いよ。
で、根本的な問題は、次の行のインデントを先に出力していることじゃない?
fo = open(OUTPUT_FILE_NAME,"w")
indent = " "
num_indent = 0
for raw in lists:
K = raw.strip() # 左右の空白文字削除
L = K.lstrip('}') # 行頭の } を削除
# 行が } で始まるときだけ、現在の行のインデントを減らす。
num_indent -= len(K) - len(L)
fo.write(indent * num_indent)
fo.write(K + '\n')
# それ以外の '{', '}' は、次の行のインデントから影響する。
num_indent += L.count('{') - L.count('}')
fo.close()
おっと、 raw って文字列じゃなくてリストだったのか。
じゃぁ
>>260 raw.strip() の代わりに ''.join(raw).strip() とかしないと動かない。
で、隣にアクセスする方法だけど、
for curr, next in zip(lists, lists[1:]):
ただし、これだとcurrに最後の要素が入らないから、
for curr, next in zip(lists, lists[1:] + ['']):
とかかな。別に、普通に for i in range(len(lists)) でも良いよ。
for raw in lists: if raw == ["}"]: num_indent = num_indent -1 fo.write(num_indent*indent) for val in raw: if val == "{": num_indent = num_indent + 1 fo.write(str(val)) fo.write(" ") fo.write("\n") fo.close()
pilでpsdをレイヤーごとにPNGにするには seekの()に何を入れればいいですか?? import Image image=Image.open("test1.psd") image.seek(0) image.save("layer1.png") del image
265 :
264 :2011/02/10(木) 17:22:39
ごめん、超勘違い このseekでとれるのは最初のチャンネルだけだった
16進数を10進数にするにはどうしたらいいですか?
int('0xff', 16) ffhとかは例外吐くので自分で正規化した方がいい
ありがとうございます!!
pythonでディレクトリとか作れんのな。 これってシェルスクリプトの領域かと思ってた
すいません、もうひとつ質問です \xff\xfe\xffというような感じで16進が入っている場合 どうやって変換すればいいですか 辞書でやるにも長すぎるし jisyo={"\x00" : 0, "\xff" : 255, "\xfe" : 254, "\xfd" : 253, "\xfc" : 252, "\xfb" : 251, "\xfa" : 250, "\xf0" : 249, "\xf9" : 248, "\xf8" : 247,・・・・・ もともと文字列なので\をゼロに置換しようにも print "kaisuu:",repr(kaisuu[0])[0] とかしてみても\記号自体すら取得できません。 変換するデータが長いので struct.unpack(">B","\xff")を使うと大変な事になりそうです。
>>270 >>> "\\x01\\x0f".decode('string_escape')
'\x01\x0f'
>>270 >>> s = r'\xff\xfe\xff'
>>> s
'\\xff\\xfe\\xff'
>>> s.decode('string_escape')
'\xff\xfe\xff'
>>> map(ord, "\xff\xfe\xff") [255, 254, 255]
275 :
270 :2011/02/11(金) 20:53:08
有難うございます。 ちょっと理解出来ないので 色々調べてみます。
>>274 うぉぉぉおおおお有難うございます!!
すごい便利ー!!!
ディレクトリ内のファイル走査させるつもりで作ったんですが
ファイルは確かにあるのに以下のエラーが出てしまいます。
内容はめちゃくちゃだと思いますが間違いの指摘お願いします。
OSError: [Errno 2] No such file or directory
http://codepad.org/j8qAvuw4
>>277 エラーが出たときの引数を貼ってください
/home/usr名 ファイル名はaccum.pyで場所が/home/usr名/workspace/accum.py です。 すぐ近くのディレクトリが少ない所にファイルを置くとちゃんと見付かったんですが。
>>279 スタックトレースもちゃんと張ってください。
エラーの箇所が os.listdir なのか os.path.isfile なのか判断できません。
>>279 あと、 not os.path.isfile の代わりに os.path.isdir 使ったほうが良いと思うよ。
file でも dir でも無いケースがあるかもしれない。デッドリンクとか。
/home/usr名だとうまくいったので/homeで試してみると 以下のようなエラーが出ました。 目的のファイルはちゃんと見付かっているんですがちゃんと終了できてないのかな。 度々すみません。 OSError path: /home/.Trash-root Path: /home/usr名/workspace/accum.py OSError path: /home/lost+found
>>281-283 isdirに変更しました。。
スタックトレースは見てませんでしたがちょっと確認してみます。
スタックトレースですが以下のような感じです。
気が向いたときで良いので回答頂けるかたお願いします。
>>283 どうもありがとうございます。
一度os.walkで書き直してみようと思います。
Traceback (most recent call last):
File "/home/user名/workspace/serch_file.py", line 28, in <module>
search(sys.argv[1], sys.argv[2])
File "/home/user名/workspace/serch_file.py", line 22, in search
search(next, file)
File "/home/user名/workspace/serch_file.py", line 26, in search
traceback.print_exception()
TypeError: print_exception() takes at least 3 arguments (0 given)
というか「手を加える前の」
>>277 を実行した際のコマンドラインと出力
(その中にスタックトレースが入ってる)を貼ってくれると答える側としたらうれしい
$ python yourscript.py arg1 arg2
TraceBack ...
...
OSError: [Errno 2] No such file or directory: '...'
$
みたいなの
os.walkをつかって書き直すのは
>>277 のどこがまずかったか突き止めてからだろう
>>287-288 これが修正以前のときのです。。
>>288 tracebackモジュールは初めて使ったのでわからなかったので間違ってましたね。
ご指摘ありがとうございます。
Traceback (most recent call last):
File "/home/user名/workspace/serch_file.py", line 28, in <module>
search(sys.argv[1], sys.argv[2])
File "/home/user名/workspace/serch_file.py", line 26, in search
search(next, file)
File "/home/user名/workspace/serch_file.py", line 26, in search
search(next, file)
File "/home/user名/workspace/serch_file.py", line 26, in search
search(next, file)
File "/home/user名/workspace/serch_file.py", line 26, in search
search(next, file)
File "/home/user名/workspace/serch_file.py", line 26, in search
search(next, file)
File "/home/user名/workspace/serch_file.py", line 18, in search
list = os.listdir(pas)
OSError: [Errno 2] No such file or directory: '/home/user名/.mozilla/firefox/cz9umq1k.default/lock'
解決しました。。。
>>282 の方のおっしゃってるように元のデータのisfileをisdirに
変更するだけでした。
皆さんには根気強く教えていただき本当にありがとうございました。
>>289 もしかして"No such file or directory"の意味も分からない?
No such file or directory「そのようなファイルまたはディレクトリ
はありません」指定のパス名の構成要素が存在しないか、またはパス名
が空の文字列でした。
lockがロックファイルなんだとしたら すぐ作られたり消えたりしてエラー引き起こしそうだね
PILで最初は存在しないPNGを作るにはどうしたらいいですか? 最初にImage.open(画像パス)しても存在しないとエラーが出ます というのも 画像サイズと RGB+アルファデータの取得が出来たので そのデータをPNGに入れたいからです。
有難うございます やってみたのですがdataの部分はどのようにデータを入れればいいのでしょうか? てっきりチャンネルごとの情報を入れればいいと思い (255,255,255,255)と入れてみたのですが駄目でした。 image = Image.frombuffer("RGBA",(1,1),(255,255,255,255)) image.save("testmo.png")
im = Image.frombuffer('RGBA', (1, 1), '\x255\x255\x255\x255')
>>> im = Image.frombuffer('RGBA', (1, 1), '\xff\xff\xff\xff') >>> im <PIL.Image.Image image mode=RGBA size=1x1 at 0x1265B70>
\x255 はないわw im = Image.frombuffer('RGBA', (100, 100), '\x40\xff\xc0\x80'*10000)
stringじゃないbufferってどうやって作るん?
im = Image.frombuffer('RGBA', (256, 256), ''.join([''.join([''.join([chr(y), chr(0), chr(x), chr(255)]) for x in range(256)]) for y in range(256)]))
>>301 import array
b = array.array('B')
for y in range(256):
for x in range(256):
b.fromlist([y, x, 0, 0])
len(b)
262144
import Image
im = Image.frombuffer('RGBA', (256, 256), b)
__main__:1: RuntimeWarning: the frombuffer defaults may change in a future release; for portability, change the call to read:
frombuffer(mode, size, data, 'raw', mode, 0, 1)
だめポorz
tostring()あるのは分かってるけど
それだとbuffer渡しじゃなくて結局string渡してるから
>>300 への回答にはなっていないのでは
>>> import array >>> b = array.array('B') >>> for y in range(256): ... for x in range(256): ... b.fromlist([y, x, 0, 0]) ... >>> import Image >>> im = Image.frombuffer('RGBA', (256, 256), b.tostring()) >>> im.save('hoge.png') でいけましたほんとうにありがとうございました でも画面になにも出ませんorz
>>303 Warningメッセージ読みなよ
'raw', mode, 0, 1を付けろって書いてあるでしょ
>>306 アルファ値が0になっている
import array
b = array.array('B')
for y in range(256):
for x in range(256):
b.fromlist([0, y, x, 255])
import Image
im = Image.frombuffer('RGBA', (256, 256), b, 'raw', 'RGBA', 0, 1)
im.save('hoge.png')
で上手く逝きました
>>302 とは上下が逆になってしまっていますね
>>> im = Image.frombuffer('RGBA', (256, 256), b, 'raw', 'RGBA', 0, 1) >>> im.save('hoge.png') >>> im2 = Image.frombuffer('RGBA', (256, 256), b.tostring()) >>> im2.save('hoge2.png') ほんとだ なんでだろ><
Image.frombuffer と Image.fromstring の違いが分からない
312 :
296 :2011/02/12(土) 12:34:59
有難うございます 普通に”\xff\xff\xff\xff”とかのデータを入れちゃえばいいんですね、 たすかりました!!
めっちゃ効率悪そうなんだが
>>313 取得したデータ自体が”\xff\xff\xff\xff”とかなんで
いい感じっす。
unko = ['A', 'B', 'C', 'D'] for x in unko: print '今の要素 = ', x print '次の要素 = ', ??? というコードがあったとき、 このfor文の中で「xの次の要素」を取り出す方法を教えてください。 よろしくお願いいたします。
317 :
316 :2011/02/12(土) 17:35:51
インデントが消えてしまいました。申し訳ございません。正しくは以下の通りです。 unko = ['A', 'B', 'C', 'D'] for x in unko: print '今の要素 = ', x print '次の要素 = ', ???
>>315 いただきました
ありがとうございました
319 :
316 :2011/02/12(土) 17:46:11
何度もすみません。 unko = ['A', 'B', 'C', 'D'] for x in unko: print '今の要素 = ', x print '次の要素 = ', ???
spam = ['A', 'B', 'C', 'D'] for x, y in zip(spam, spam[1:]): print '今の要素 = ',x print '次の要素 = ',y ↓結果 今の要素 = A 次の要素 = B 今の要素 = B 次の要素 = C 今の要素 = C 次の要素 = D
323 :
デフォルトの名無しさん :2011/02/12(土) 19:43:29
いまDjangoの公式チュートリアルをしてるのですが、apache - mod_pythonの設定がどうもうまくいきません。
ImportError: Could not import settings 'mysite.settings' (Is it on sys.path? Does it have syntax errors?): No module named mysite.settings
というエラー文から、どうやらPythonPathがうまく通っていないようなのですが、
http://djangoproject.jp/doc/ja/1.0/howto/deployment/modpython.html?highlight=mod_python にある通りに記述してもエラーが解消しません。
エラー文で検索しても、httpd.confでPythonPath設定しろ、というものしか見つからず困ってしまっています。
CentOS5上で、Python 2.6.5、Django1.2.3をインストールして進めています。何か原因に思い当たるものがありませんでしょうか?
>>323 mod_python はもう終わりだから mod_wsgi 使おう。
あと、mod_pythonはちゃんと Python 2.6.5 をベースに自分でビルドしたよね?
mod_python がシステムの Python 使ってると動かないよ。
Pythonってdefineみたいな機能ってない?
マクロ?
>>323 settings.pyを作ってないんだろ
>mysite.settings は、 Django プロジェクトの設定ファイルを指す
>Python import パスになるよう、自分の環境に合わせて置き換えて下さい。
CentOS5 のデフォルトの Python って 2.4 だろ
>>324 の逝ってる通り
mod_python が 2.4 のままだと思われ
330 :
デフォルトの名無しさん :2011/02/12(土) 21:17:18
>>324 >>328 mod_pythonはyumで最新を投入しました。
python26-mod_python.i386 3.3.1-13.el5 installed
python本体もシステムのじゃなくて、上記したとおり2.6.5を入れなおしています。こちらもyumを利用しています。
mod_wsgiは知らなかったのでこれから調べてみます。
あとソースから入れるのも一度試してみます。
>>327 settings.pyは自動生成なので、ちゃんとファイルはありますし、中身の書き換えも行っています。
回答くださった皆様、ありがとうございます。引き続きなにか心当たりありましたらお願いします。
331 :
デフォルトの名無しさん :2011/02/12(土) 21:21:20
>>329 ありがとうございます。
django.cgiも初見だったので、覗いてみます。
>>330 $PYTHONPATH/mysite/settings.pyは存在するの?
>PythonPath には、アプリケーションから import したいモジュールの
>各々の親ディレクトリを入れなければなりません。
>また、 DJANGO_SETTINGS_MODULE の親ディレクトリも入れねばなりません。
333 :
316 :2011/02/12(土) 23:59:31
>>320-322 うおおおお!
ありがとうございます。
半角スペースとタブは、レンダリングされないだけで、正しく書き込めてはいるんですね。
てっきり、半スペとタブは消されて書きこまれてるのかと思ってました。
すいません UbuntuだとPythonではUnicode扱えないのでしょうか IDLEだと日本語入力できず、Netbeansではアスキーコードじゃない とエラーが出てしまいます
sys.setdefaultencoding() 禁止
Python2.7にしたは良いんだがTkinter使えないじゃん。 なんか依存関係が大変そう
>>334 つ $ locale
つ $ python -c "import locale; print locale.getpreferredencoding();"
ちなみに、IDLEは使わないほうがいい。unicodeリテラル (u"あいう") はIDLEもIPythonも
Python の compile() の仕様のせいでぶっ壊れてる。
インタラクティブシェルで日本語をマトモに使いたいなら python 内蔵のが一番。
一応、readlineを使った補完も可能。
nanoの出番のようだな
CentOSの俺涙目
340 :
315 :2011/02/13(日) 02:32:46
ちょっと欲が出て少し早くしようとして 以下の様に変えてみましたが 他にスマートに出来る方法なんてあるのでしょうか? やっている事としては4つの文字列から 同じ位置の文字を取り出してtouという配列に入れて 最後に結合するだけです。 for s in xrange(0,layersuu,1): tougouimage="" tou=range(len(chimrawlayer[s][1])*4) for i in xrange(0,(len(chimrawlayer[s][1]))*4,4): tou[i]= chimrawlayer[s][1][i] #赤の情報 tou[i+1]=chimrawlayer[s][2][i] #緑の情報 tou[i+2]=chimrawlayer[s][3][i] #青の情報 tou[i+3]=chimrawlayer[s][0][i] #アルファの情報 tougouimage ="".join(tou) image = Image.frombuffer("RGBA",(channelInfo[s][3],channelInfo[s][2]),tougouimage,"raw","RGBA",0,1) image.save(layername[s]+".png") del image
うああああ ごめんなさい自己解決!!! tou[0::4]とか使えば良かったごめんなさい
>>339 私も CentOS ですが UTF-8 で難なく使えてますよ
341=340です すいませんOTL
344 :
334 :2011/02/13(日) 04:01:30
>>335 >>337 「みんなのpython」を頭からこなしてるようなプログラミング入門者で
正直「???」な状態ですが、解決にたどり着けそうな感じがします
ありがとうございました
あーあ、
>>335 が何しても結局print "こんにちは"とかになりそうな予感w
禁止するならちゃんとフォローしろよwバカだなw
346 :
デフォルトの名無しさん :2011/02/13(日) 04:45:41
ビルドって何? PY2exeと何が違うの?
>>344 >>337 の最初の2行の実行結果を晒せって意味だよ
>>345 print "こんにちは" じゃだめだ
print u"こんにちは" 煮汁
>>334 よく分からんがコードの一番最初に
#!/usr/bin/env python
# -*- coding: utf-8 -*-
ではダメなの?
349 :
346 :2011/02/13(日) 15:17:20
350 :
デフォルトの名無しさん :2011/02/13(日) 15:23:01
blobnextno = blobno.getNextNum() #数字 key_name2 = key_name1 + "/" + str(blobnextno) TypeError: 'unicode' object is not callable 気にしたことなかったけど、ユニコード文字列の連結ってどうやんだっけ?
moji=u"あいう" hazu=1 mm=moji+str(hazu) で普通にできたよ
>>350 strと同じ名前の変数使ってた・・・ すまん 忘れてくれ
strにunicode文字列入れるなよw
u"spam" + "egg"は、u"spam" + "egg".decode(sys.getdefaultencoding())と等価らしい。 ……また悪名高いgetdefaultencodingか。 当然ながらこの悪しき風習はPython3では削除され、同じ型同士でしか結合できなくなる。
だれもそんな話はしてない訳だが
>>354 じゃあ、>351はpython3では使えないって事でOK?
>>356 使えるよ。Python3ではstrの戻り値もunicodeだから
>>349 ビルドの中身はその時々によって違うよ
C拡張モジュールを setup.py install するとCコンパイラでコンパイル、リンクする処理が中に入るし
py2exe で実行ファイルを作る処理もビルドと言える
>>358 はーん、
「いつもpy2exeばっかだけど
アタイもいつかカッコイイ『び・る・ど』したいなァ」
とか思ってたけど
実はビルドやってたんだね。
あのpy2exe用のsetup.pyの中身を書くのが
ビルドする為の(人間がする)作業なのか!!!
有難う
>>354 非ASCII文字は全部unicode型に統一しておけば、あまり問題は生じない
datetimeで現在から24時間前のdatetimeオブジェクトはどうやって作れますか?
>361 timedeltaでどうにか
>>361 datetime.datetime.today() - datetime.timedelta(hours=24)
>>362 sys.argvのエラーとは何ですか?
あなたの言葉では分からないので具体的にお願いします
367 :
362 :2011/02/13(日) 20:53:34
>>365 説明不足ですいません。
えーと
ファイルを作った.pyにドラッグ&ドロップして
そのパスを取得するのに
sys.argvを使いました。
しかしpy2exeでEXE化したファイルに
ドラッグ&ドロップするとそのexeファイルが動かないので
cd /d %~dp0
TUKUTTA.exe %1
という内容のバッチファイルを作って動かしていました。
バッチファイルなしで作ったexeファイルを動かすには
http://stackoverflow.com/questions/2292703/how-can-i-get-the-executables-current-directory-in-py2exe を読んで
os.path.realpath(sys.argv[1])を使えばいいっていうところまでは分かったんですが
os.path.realpath(sys.argv[1])を使った.pyのファイルに任意のファイルをドラッグ&ドロップしたのですが
なにかエラーが発生して途中で終わってしまいます。
ウィンドウにエラー情報がなんか書かれてるのは分かるんですが
あっという間にウィンドウが閉じてしまってエラー内容が分かりません。
sys.argvのエラー内容なのでバッチファイルで
cd /d %~dp0
TUKUTTA.py %1
pause
してもエラーが起きないから確認しようがないし
PyScripterでテスト起動も出来ないし
困っています
>>367 バッチファイルはexeファイルも起動できるんだぜ
>>368 バッチファイルを使うと普通に動くのですが
バッチファイルを使わずにexeファイルに直接ファイルをドラッグ&ドロップすると
うまく動かないのです。
370 :
362 :2011/02/13(日) 21:11:03
とりあえず無限ループを仕込んで どこでエラーが出ているかは分かったんですが なんのエラーで止まっているのかさっぱりわからないですOTL
cd /d %~dp0 TUKUTTA.py %1 pause は、.exeじゃなくて.pyを動かしてるのだけどね。
372 :
362 :2011/02/13(日) 21:25:28
ごめんなさい、エラーの原因分かりました。 今から原因書きます
原因と言っても起きた現象で説明するしか出来ないですが・・・ os.path.realpathとかpy2exeとか関係なかったです。 tukutta.py ***************************************** argv0="C:/Users/tukutta.py" argv1="C:/Users/tekitou.txt" ft=file(filename,"w") ft.write(u"テスト") ft.close() *************************************** tukutta.pyを起動すると tukutta.pyと同じところにtext.txtが出来ます ところが **************************************** argv0=sys.argv[0] #このファイルのパス argv1=sys.argv[1] #ドロップしたファイルのパス filename="text.txt" ft=file(filename,"w") ft.write(u"テスト") ft.close() **************************************** にした場合は tukutta.py自身に任意のファイルをドラッグ&ドロップしてもエラーで止まりますが バッチファイルを間に挟むときちんと動きます。 バッチファイルなしで動かすには filename="text.txt"の部分を pydirpath = os.path.dirname(argv0) filename=os.path.join(pydirpath,"text.txt") にしないといけないようでした
そんなこといちいち報告しなくてもみんな判ってるよ
そんな・・・ では、argvを使っている時のエラー確認はどうすればいいのでしょうか?? 今回みたいにargvを使っていてうまくいかない場合、 エラーメッセージを確認しようがありません。
if __name__ == '__main__': try: main() except: ここで自分でログに出力汁
ありがとうございます。 調べたら tyr: p+=1 except : print u"エラー発生" とかいうふうに使うのは分かったんですが エラーの時に出る C:\Users\****\Desktop\dododo.py 594 exceptions.IndexError: list index out of range というメッセージとかはどうやって出力するのでしょうか??
378 :
377 :2011/02/14(月) 00:04:52
#恥ずかしいので書き直し #!/usr/bin/env python #-*- coding: utf-8 -*- try: p+=1 oji="a" p+oji print u"正常" except: print u"エラー(文字と数字を足してるから)" 結果 エラー(文字と数字を足してるから)
(再現)コードは動かしてから貼ってね
ってあれか、動かしてるのか それはp += 1の時点でNameError
381 :
378 :2011/02/14(月) 00:21:08
>379 くぁあああやめて 378のライフはもうゼロなのよぉぉぉお とりあえず sys.stderr.writeは関係ありますか?? pythonエラーで検索したら出てきたけど 「sys モジュールには、 stdin、 stdout、および stderr を表す属性値も存在します。 後者の stderr は、警告やエラーメッセージを出力して、 stdout がリダイレクトされた場合でもそれらが読めるようにする上で便利です: 」 の意味がさっぱりわからんのだけどOTL
もちろんあるお import sys sys.stdout = open('sys-stdout.txt', w') sys.stderr = open('sys-stderr.txt', 'w') とかやれば標準出力への出力はsys-stdout.txtに書き込まれるし 標準エラー出力への出力も同様
import traceback try: 1/0 except: traceback.print_exc()
上でもはまってるけどcatch-allはexceptは初心者殺しなのでやめれ
#!/usr/bin/env python #-*- coding: utf-8 -*- import sys sys.stdout=file("C:/Users/***/Desktop/out.txt","w") sys.stderror=file("C:/Users/***/Desktop/error.txt","w") try: p=1 moji="a" p+moji print "seijyou" except: print "ijyou" いまやっとsys.stdoutが理解できた。 出力したout.txtにijyouって書かれてた。 でも最後の行にp+mojiって書いても sys.stderrorで指定したerror.txtに何も入らないよ・・・ぱtpらっしゅ
その調子で例外処理も理解すればおk 面倒ならtry: except: を消す
ああ、あとsys.stderrorでなくsys.stderrだから
error.txtの内容はいった!!! Traceback (most recent call last): File "C:\Users\***\Desktop\era-.py", line 16, in <module> p+moji TypeError: unsupported operand type(s) for +: 'int' and 'str' うひゃああああできたぁあああありがとううううう!!!
今気付いたんだけど
>>247 で作ったPNGをPSDにするやつで作ったPSDを
>>315 でPNGにしようとするとエラーで出来ないーよーあひゃ
たぶん
>>247 のPSDのエクストラデータサイズとレイヤー名のパッドの計算方法が
>>247 と
>>315 でちがうよーぉー
photoshopからの出力で計算してるのは247の方だから
>>315 が違ってるとおもうおー
あはははDLしたひとごめんねー
どひえー
390 :
デフォルトの名無しさん :2011/02/14(月) 12:32:11
Pythonで標準入力関数ってなんですぐに教えないの? Cで言うならscanfみたいな
Python先生の講義はどこで見れますか?
>>390 そういやraw_input見る機会ってそこまでないね。
むしろscanfをなんで最初の方のプログラムで使うのかと Cの入門書のライターに問いたい アドレス演算子が謎だわ何を作るかと思えば対話型プログラムだわもうね
入力できないとつまらないじゃん。 特にCに関しては
argvで十分っす
>>393-394 最初に教えるのは C そのものではなくコマンドラインから標準入出力をリダイレクトして実行することの方が良いと思う
>>395 に同意
で scanf よりも fgets, sscanf な
Cとスクリプト言語を比べる人って・・ 入門書とかで勉強しなくてもPythonは使えるからね 特にguiなんてちょっとライブラリ拾ってドキュメント読みながら書けばあっという間
>>390 Cでいう
while (fgets(fp, buff, sizeof buff))
はPythonで書くと
for line in fp:
だけど、fpがstdinの場合に入力してENTER入れても入力待ちのままになってて
同じ動きにならない
for line in iter(lambda: file.readline(), '')
のように書けばいいけど、そういう問題/現象やその解決といった話をしだすと
既に初心者向けじゃない匂いがする
Cのscanf()が本当はちっとも初心者向けでないのと同じかな
>>> import sys >>> c = 0 >>> for line in sys.stdin: print c, line, c += 1 ... asdf qwer poiu ;lkj ^Z 0 asdf 1 qwer 2 poiu 3 ;lkj ^Z >>> んー 入力時に一行ずつflushさせるにはどうすればいい?
でけたー >>> import sys >>> c = 0 >>> while True: line = sys.stdin.readline() print c, line, c += 1 if not line: break ... asdf 0 asdf qwer 1 qwer poiu 2 poiu ;lkj 3 ;lkj 4 5 6 7 ^Z 8 >>>
blobstoreにpostしたとき、form要素は日本語無事通ったんだけど アップロードした日本語ファイル名をblob_info.filenameから取得したとき ローカルでは普通に日本語のままですが、サーバー上では ?ISO-2022-JP?B?*****************************==?= みたいになってます。 これからどうやったら元の日本語ファイル名に戻せるんでしょうか?
import email.header try: print email.header.decode_header('?ISO-2022-JP?B?*****************************==?=') except email.errors.HeaderParseError: print u'がんがれ'
import email.header s = '?ISO-2022-JP?B?*****************************==?=' try: for line in email.header.decode_header(s): print line[0].decode(line[1]) except email.errors.HeaderParseError: print u'がんがれ'
ああ encoding 情報が None になるときもあるのか import email.header s = '?ISO-2022-JP?B?*****************************==?=' try: for line in email.header.decode_header(s): print line[0].decode(line[1] if line[1] else 'ascii') except email.errors.HeaderParseError: print u'がんがれ'
>>407 line[0].decode(line[1] if line[1] else 'utf-8')
にしたらローカルでも本番でもアスキー日本語両方うまく行きました!
大謝!!
>>399 2引数のiterって知らなかった
そんなのあるのか……
えっ
pythonでとあるサイトからファイルをダウンロードするコードを書きました
import urllib
urllib.urlretrieve('
http://www.python.org/ ', 'C:\python.html')
ファイルをダウンロードしたら特定の処理(定義した関数)を実行したいのですが
「ダウンロードを完了した」事を知る方法はございますでしょうか?
作ったプログラムを起動したときに出る メッセージが書かれてる黒い画面を出さないようにするには どうすればいいですか?
拡張子を .py ではなく .pyw にしてから実行したらどうなるか試してみて
>414 元の.pyだと動きますが.pywだと何も起きないですOTL
つまり書かれているエラーメッセージは致命的なんですね
具体的にどう違うの? それともtime.timeが違うという寒いボケ?
print の方に時間が掛かってるだけとか
2ではprint ""って書けますね 何で3でprint("")って書くようになったんですか?
Perlみたいでカッコ悪いから
組み込み関数にすることで分別や関数型の意識を強めるから
print a, b, c と書いてたのが print(a, b, c) になるのでしょうか?
%が互換性のためだけに残されている
3は今からやるなって言われてますが3から始めた素人です print("")で苦闘したのは今でも覚えてます(2日前の出来事です) 仕様が変わるのなら今のうちに成れて後々の学習コストの節約になると考えているのですが それでも2から始めたほうがいいのでしょうか?
Yes, we can.
>>426 言っておくが使用バージョンを2から3に移行するのは簡単だぞ
書き溜めたりプロジェクトのコードを移行するのが面倒なだけだ
学習コストとかアホか、3はライブラリが少ない分大損だ
%ってめちゃ使うじゃん! 将来的に廃止?
formatが導入されてから%つかってないわ
あれってperlの書き方をそのまま持ってきたんだっけ?何由来だろう。 今更修正されるなんて思ってなかった部分だから、 書き方変わるって初めて聞いた時は驚いた <文字列フォーマット
>>431 由来を知らん子がいるとは隔世の感があるな……。
format()より手っ取り早いから好きなんだけどなぁ。
list=[] list.append=a list.append=b list.append=c ...... じゃなくて あらかじめリストの個数が分かってて list[0]=a list[1]=b list[2]=c ...... としたい場合最初のリストの宣言はどうすればいいですか?
list = range(3)とか
list = [a,b,c] とかじゃなくて?
list = [0 for i in range(3)] list[0]=a list[1]=b list[2]=c みたいなことしたいのかな?
[0]*3
>>434 L = [0]*3
L[0] = a
L[1] = b
L[2] = c
有難うございます。 変数には気をつけます。 appendが3つだと[]の方が遅いけど 六個だと[]の方が早いですね・・・ 微妙 #!/usr/bin/env python #-*- coding: utf-8 -*- import timeit t = timeit.Timer(stmt=""" a = [] a.append(1) a.append(2) a.append(3) a.append(4) a.append(5) a.append(6) """) print "use append: ", t.timeit(number = 1000000) t = timeit.Timer(stmt=""" a =[0]*3 a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=5 a[5]=6 """) print "use []: ", t.timeit(number = 1000000)
>>441 a[3]=4 a[4]=5 a[5]=6 がerrorに
なってるからではなくて?
warota
>>441 app = a.append
app(1)
app(2)
app(3)
ってやると速くなるよ。
PythonでAAを表示させいんですが何かいい方法はありませんか? Tkinterでプロポーショナルフォントを指定して表示させてもなぜかズレちゃいます
import timeit t = timeit.Timer(stmt=""" a=[] app = a.append app(1) app(2) app(3) app(4) app(5) app(6) app(7) app(8) app(9) app(10) """) print "use app: ", t.timeit(number = 1000000) t = timeit.Timer(stmt=""" a =[0]*10 a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=5 a[5]=6 a[6]=7 a[7]=8 a[8]=9 a[9]=10 """) print "use []: ", t.timeit(number = 1000000)
447 :
446 :2011/02/17(木) 15:52:49
[]の方が早かったですね・・・
use app: 2.25716801996
use []: 1.84721263457
>>442 間違えたのです・・・OTL
>>445 import Tkinter
root = Tkinter.Tk()
t = Tkinter.Text(root, font=(u'MS Pゴシック', 12))
t.insert('end', u'|∧ ∧ | ∧ ∧ | ∧_∧ |\n')
t.insert('end', u'|( ゚Д゚).| (=゚ω゚)|( ;´Д`).|\n')
t.pack()
root.mainloop()
>>448 うおおありがとうございます
うまくできました
sympyというライブラリについて質問です。
シンボリックな微分が出来るので、これを
C#から呼んで得られた出力により再びC#のコードにしたいのですが、
sympyの出力は当然C#の関数名とは一致しません。
http://docs.sympy.org/dev/modules/printing.html ドキュメントを見るとどうも出来そうなのですが、よくわかりません。
例えば以下のように変換したいです。
x[0] ** 2.1 → Math.Pow(x[0], 2.1)
sin(x[0]) ** (x[1] + x[0]) -> Math.Pow(sin(x[0]), x[1] + x[0])
もしどなたかsympyの出力形式の指定方法について知っていたら教えて下さい。
自分で作った.pyをpy2exeでexe化したら IOError: cannot identify image file (画像ファイルを特定することができない) というエラーがでて前のpyだとちゃんと動くのにexeだとうまく動きません。 どうしたらよいでしょうか? エラーメッセージ sys.stderrで取得した標準エラーメッセージは Traceback (most recent call last): File "PsdToOra.py", line 300, in <module> File "Image.pyo", line 1980, in open IOError: cannot identify image file です。 自分で作った(PsdToOra.py)の300行目は im = Image.open(newpsd) なのでnewpsdをos.path.existsで存在チェックしたのですが ちゃんと存在してましたOTL newpsdのパスもちゃんと取得できたのに一体何が悪いのか・・・OTL newpsd:C:\Users\***\Desktop\hiyuu\PsdToOra5\dist\henkan.psd
psdとして認識出来ないって意味だろ
うーんnewpsdを自力でキー入力して開くと開けるので ファイル自体は壊れてないようです・・・ >>> import Image >>> im=Image.open("C:/Users/***/Desktop/hiyuu/PsdToOra5/dist/henkan.psd") >>> print im.size[1] 480 >>>
多分PsdPlugin.pyをロードできていない py2exeは必要なモジュールを常に全部拾えるわけじゃないから そういう場合は自分で追加してやる必要がある
ありがとう!
ああああ、検索したら
http://www.google.co.jp/search?hl=ja&biw=1135&bih=530&q=PsdPlugin.py+python&aq=f&aqi=&aql=&oq= なんにもでないいぃぃ
なにをどうやって追加したらいいですかOTL
↓今までのsetup.py
# -*- coding: utf-8 -*-
#python2.6で作成
#PsdToOra.pyをexe化するときに使う
from distutils.core import setup
import py2exe
py2exe_options = {
"compressed": 1,
"optimize": 2,
"bundle_files": 2,
"includes" : ["gzip"] }
setup(
options = {"py2exe": py2exe_options},
console = [
{"script" : "PsdToOra.py", "icon_resources": [(1,"py.ico")]}],
zipfile = None)
PsdToOra.py で明示的に import PsdImagePlugin としてみたら?
>>456 できたぁぁぁああああ!!!!
有難う超ありがとう!!!
ありがとうううぅぅううう!!!
setup.py でやるとしたら setup(options={'py2exe': {'packages': ['PsdImagePlugin']}}) みたいになるはず
459 :
デフォルトの名無しさん :2011/02/18(金) 10:11:41
PythonのC APIについて質問があるのですが Pythonで import array buffer = array.array("f") の2行ををCのAPIを使って、 PyObject *module = PyImport_Import(PyString_FromString("array")); PyObject *func = PyObject_GetAttrString(module, "array"); PyObject *buffer = PyObject_CallObject(func, PyString_FromString("f")); と書いたのですがbufferが0になってしまいます。 どこが悪いのでしょうか? moduleもfuncも値が入っているのは確認しています。 Pythonは2.6.6、IDEはVS2008です。 よろしくお願いします。
PyObject_CallObject(PyObject *callable_object, PyObject *args)のargsはタプルを渡す PyObject_CallMethodが楽
>>460 ありがとうございます。
今は環境が無いので午後試してみます。
>>460 動きました。
ありがとうございました。
class B(db.Model): masterID = db.StringProperty() masterPass=db.StringProperty() bkdata_max_num = db.IntegerProperty() def getNextNum(self): def procedure(): if self.bkdata_max_num is None: self.bkdata_max_num = 0 self.bkdata_max_num = self.bkdata_max_num + 1self.put() return self.bkdata_max_num return db.run_in_transaction(procedure) import models.blob br = B.get_by_key_name(u"******") self.bkID = br.getNextNum() AttributeError: 'NoneType' object has no attribute 'getNextNum'
>>464 そうなんですか、初心者なんでもっと根本的な文法知らないのかと思って・・・
自己解決・・・B.get_by_key_name(u"******")でNoneが帰ってきてました NoneTypeね・・・言われてる通りですた
テキスト処理はawkの方がかんたんだ・・・・ awkモードとか有ればいいのに。
○○のほうが簡単ですむ仕事なら、○○にまかせればいいんじゃないかなあ。 Pythonが万能であるわけでもないし。
c++のヘッダファイル(.h)の宣言やらを読む方法ってある?
>>469 ぱっと思いつくのはANTLRで解析とか
C++のパースなんて複雑すぎて素人が手を出せるもんじゃないだろう
完璧主義で言えば自分用のコンパイラ作るようなもんじゃん
timeitで起動時間を調べようとしたら stack = "<?xml version='1.0' encoding='UTF-8'?>\n" の行で止まってしまいます。 #で行をとあしてみたところ どうも¥記号がある行の前後ぐらいで 止まるようです。 そこでこのtimeitの代わりに起動時間を調べるコマンドか ¥があってもtimeitが動く方法がありましたら教えて下さい。
filename="C:/Users/ユーザー名/Desktop/hatena.txt" fo = file(filename,"rb") の行で TypeError: 'str' object is not callable (strオブジェクトはよい出す事が出来ない) というエラーが出たりでなかったりするのですが なにがいけないのでしょうか???
>>475 そのエラーが出るときは、fileという名前の変数に文字列を代入してたりしない?
文字列の入ってる変数に()をつけて関数のように呼ぼうとすると
そういうエラーが出るよ
477 :
475 :2011/02/20(日) 00:23:59.77
うーん とりあえずfileをopenにしたらエラーがでなくなりました。 filenameという変数にはファイル名を入力してますが じっさいfileという変数は使っていません。
478 :
450 :2011/02/20(日) 00:36:19.76
479 :
474 :2011/02/20(日) 00:40:26.04
とりあえず、今の日時取得でできました。 import datetime t_old=datetime.datetime.now() 作ったプログラム t_new=datetime.datetime.now() time= t_new-t_old print time
パイソンってローカル変数を辞書で定義してるの?
辞書で管理してるようにみえて、実は違う。 でもだいたい辞書だと思っていい。 でもやっぱり辞書じゃない。 x = 1 locals()['x'] = 2 print(x) #=> 2 に変わる def f(): y = 1 locals()['y'] = 2 print(y) #=> 1 のまま f()
>>481 なんか難しいですねw
ありがとうございます
locals()で得た辞書は変更するな、ってことになってたんだっけ。 何らかの方法で、他のローカルスコープを変更するのって、できないの? def f(): y=1 g(???) print y # ==> 2 できてもするべきじゃないし、戻り値を複数返せるから普通は必要にならないのだけど。
基本的な質問で悪いんですが 拡張子を指定してファイル名を取得するってどうやりますか?? ↓*を付けたら駄目でした txtlist=os.listdir("C:/Users/username/desktop/*.txt"')
>>483 他のローカルスコープは変更できない。
locals() で得た辞書は、内部のテーブルのコピーなので、変更しても
内部のテーブルが更新されない。
2次元配列で L=[[1,2,3,4],[1,2,3,4],[1,2,3,4]] をL1=[1,1,1]にしたいのですが L1=[] for l in L: L1.append(l[0]) にするんじゃなくて L1=L[::1][0:1]かなと思ったんですが L1=[[1, 2, 3, 4]]になってしまいました。 なにが違うんでしょうか??
>>488 L[::n] の意味を勘違いしてる。nはスキップで、
L = [0,1,2,3,4,5,6]
L[::2] => [0,2,4,6]
なので、 n=1 は省略したときと変わらない。
L=[[1,2,3,4],[1,2,3,4],[1,2,3,4]] に対して
L[::1] は [[1,2,3,4], [1,2,3,4], [1,2,3,4]] という、 L の浅いコピー。
それに対して [0:1] すると、 L[::1] の [0] だけを要素に持ったリストが
作られるから、[[1,2,3,4]] になる。
L1 = [x[0] for x in L]
で良いと思う。
>489 有難うございます! 一行で書けるforも教えて頂き有難うございます!!
windowsでctypes使って、C++で作ったdllを読み込んでるんだが、 これCリンケージ指定しないとctypesで使えないんかね?
492 :
491 :2011/02/20(日) 13:29:28.61
ごめん自決した
>>491 C++の mangling rule を把握していて、thiscallを使わなければ、
後は気合でなんとかなるかもしれない。
が、Cリンケージ指定するべきだと思うぞ。C++リンケージはC++以外の
言語からアクセスするためのものじゃない。
494 :
491 :2011/02/20(日) 13:38:13.88
>>493 ん、やっぱりか
Cリンケージと __declspec(dllimport) でいいんだよね
PILでRGBAのPNG画像をかさねて一枚の画像を出力しようとしましたが
background = Image.frombuffer("RGBA",(縦 , 横),画像データ,"raw","RGBA",0,1)
surface = Image.open(RGBAのPNGファイル)
background.paste(surface,(縦、横,高さ,幅))
background.save(合成PNG)
とやったら
(↓)合成のPNG画像の透明部分が透明のまま重なってしまいました。
http://bbs12.aimix-z.com/photovw.cgi?room=lapius&image=271.jpg (分かりにくかったので透明部分は黄色に塗ってます)
これはどうしたらいいのでしょうか?
pythonで作ったプログラムはpythonをインストールしていないPCで動作するのでしょうか? インタプリタを通さないと動きませんよね? 超初心者な質問ですいません。
>>498 うむ。その通り、動かないよ。はい、次の質問は?
>>499 ではどうやって動くプログラムを書くのですか?
Pythonをインストールしてください
クライアント側もpythonインストールしなくちゃだめなのか
>>503 CSS環境でサーバーにpythonがインストールしてあるのだとエスパーすると、クライアント
のPCではpythonのプログラムはエディタで作成できるけれど、そのプログラムはサーバー
上で実行することになる。クライアント側PCにpythonがインストールしてあれば、サーバー
とは何の関係も無しにプログラムの作成、実行はできるようになるよ。
もしくは505が言っているようにpy2exeを使う方法もある。 「py2exeはPython スクリプトをスタンドアロンのWindows実行形式に変換するモジュールで, distutils の拡張として実装されている. py2exeを使って実行形式にしたプログラムは, Pythonをインストールせずに実行することができるようになる」
質問です。 文字列を日本語のかどうか調べて 文字数(バイト数)を数えて 日本語の文字列なら別の文字列に変換するか 文字化け的でもいいので適当な文字列に 変換する方法を教えて下さい。
>>509 文字エンコーディング判定モジュール"Universal Encoding Detector"を使え。
>>510 できましたー!!
有難うございます!!
こんな面白いものがあるんですね!!
512 :
デフォルトの名無しさん :2011/02/20(日) 22:39:31.10
PILの使い方について日本語で解説している場所、本があれば教えてください。
ググれカス
先輩諸氏、使っているIDEを教えてください。参考にしたいです。
秀丸
IDEじゃねぇだろ
Emacs
>>515 Rubyに限らずスクリプト言語界隈では、IDEより高機能エディタを使うのが主流。
ここにいる連中はおっさんが多くて、IDEなんて使いこなせないから、ここで聞いても無駄。
ただRubyを扱えるIDEも最近は進化しているらしいから、自分で使ってみよう。
いまのところこんなのがある。
・Aptana (高機能だけどEclipseベースなので重いしメモリ食い)
・RDE(軽いけど更新が止まってる。Windows専用)
・RubyMine(エディタ好きからも好評だけど日本語化はされてないかも)
・NetBeans(Sunとともに終了)
Aptana使ってみたけどよくわからんかった。
Pythonの場合だと、無料系ではこんな感じ。 * pydev (Eclipse) 重い。高機能 * PyScripter (Delphi) Windows専用。軽い。pydevとは少し違う方向で高機能 * PythonWin (Python+pywin32) Windows専用。軽い。低機能。特におすすめはしない。 * nbPython (NetBeans) 開発中 * Eric (Python + Qt) 起動が重い。PyQt開発を除けば中機能。 その他低機能軽量IDEや発展途上IDEが幾つかある。 WindowsならおすすめはPyScripter
初心者でなんとなくanjutaつかってるんだけど、評価はどうよ
どうも。参考になりました。 ググったらpycharmというのがひっかかったんですが、まずpyscripterつかってみます。ありがとうございました。
作ったファイルを圧縮するプログラムがエラーを出します どうしたらいいのでしょうか?? zippath = os.path.join(batdir ,"henkan.zip") zip = zipfile.ZipFile(zippath, 'w') for root, dirs, files in os.walk(dirpath): dec_root = root.decode("cp932") for file in files: ullpath = os.path.join(root, file) zippathfile = os.path.relpath(fullpath,dirpath) enc_path = zippathfile.encode('mbcs') enc_fullpath = fullpath.encode('mbcs') zip.write(enc_fullpath,enc_path) zip.close() enc_path = zippathfile.encode('mbcs')の行でエラーがでます。 エラー内容は以下なのですが UnicodeDecodeError: 'ascii' codec can't decode byte 0x94 in position 5: ordinal not in range(128) 今まででエラーが出ずに ちゃんとzipファイルをはきだしていたのに 急に出だして文字のアスキコードとか関係あるのか 困っています・・。
>>524 ullpath が怪しい。
のはさておき、UnicodeDecodeErrorが出てるってことは、
zippathfile.encode() を呼び出すときに zippathfile がそもそもバイト列で、
それを Unicode にデコードしてから .encode() しようとして、ASCIIじゃ
デコードできないっていうエラーになってる。
dirpath が unicode になっているか確認してみ? dirpath が unicode なら、
root, dirs, files は全部 unicode になって、 fullpath も zippathfile も
unicode になって、 .encode() の呼び出しでデコード処理が実行されなくなるから。
chardet.detect()でdirpath調べたら100%ascii zippathfileも全部asciiでした これって別にユニコード変換とかしなくてもいいって事ですか??? どうすればいいんですか?
>>526 chardetの判定結果をあてにするな。自動検出はあくまでも推測でしかない。
'ascii' codec can't decode byte 0x94 in position 5
が本当に zipfilepath.encode('mbcs') で発生したのであれば、
zipfilepath の 5バイト目に非ASCII文字 (\x94) が入ってるんだよ。
いいから最初から dirpath を unicode で扱いな。
>527 有難うございます!! dirpath=unicode(dirpath)を 変換前に入れたらエラーがでなくなりました!!!
530 :
sage :2011/02/22(火) 08:36:24.09
http://doruby.kbmj.com/fujiwara_blog/20090813/_python_curses_1 ここの chat.py ってどなたか手元の環境で動きますか?
OS X 10.6.6 の Python 2.5、2.6、2.7、
および RedHat Linux 5.5 の Python 2.6 で、
curses が恐らく C の内部でこけます。
Traceback (most recent call last):
File "chat.py", line 114, in <module>
view = CursesWindow()
File "chat.py", line 9, in __init__
curses.wrapper(self.loop,host)
File "/usr/local/lib/python2.6/curses/wrapper.py", line 43, in wrapper
return func(stdscr, *args, **kwds)
File "chat.py", line 13, in loop
self.init_windows(scr)
File "chat.py", line 30, in init_windows
self.cmd_window = scr.subwin(3,79,22,0)
_curses.error: curses function returned NULL
ぐぐると readline とぶつかってる可能性が出てくるのですが、
上記ページでは動くとのことなので、どの環境だと動くのか知りたいです。
また、解決方法をご存知であれば教えて下さい。
動いた。Ubuntu 10.10 Python2.6.6。
532 :
531 :2011/02/22(火) 09:05:28.24
理由は端末サイズが小さすぎるとかかもね
layername[i].replace("背景","Background") layername[i].replace("レイヤー","Layer") layername[i].replace(" ","") if not layername[i].isalnum(): layername[i]="Layer"+str(i) こういうのを作ったんですが if not layername[i].isalnum(): layername[i]="Layer"+str(i) はうまく動くもののreplaceが動きません。 (エラーは出ず文字が置換されず) 何が悪いのでしょうか??? 以下もやってみたのですがlayername[i]=="背景"の場合にも layername[i]="Background"されませんでした・・・ if layername[i]=="背景": layername[i]="Background"
replaceは置換した文字列を返すので layername[i] = layername[i].replace(...)
ソースの encoding と PSD の encoding も考えとけよ
>534 やってみたんですが print u"変更前:",layername[i] layername[i] = layername[i].replace("背景","Background") layername[i] = layername[i].replace("レイヤー","Layer") layername[i] = layername[i].replace(" ","") layername[i] = layername[i].replace(" ","") print u"変更後:",layername[i] if not layername[i].isalnum(): layername[i]="Layer"+str(i) 結果はこんな感じでreplaceが反応してくれませんでした・・・ 変更前: 背景 変更後: 背景 変更前: レイヤー 1 変更後: レイヤー1 変更前: name 変更後: name >535 またお前かって言われてスルーされたらと思うと怖いお〜>< >536 えッ何の事だか本当に分からないので 少し説明お願いします
>>537 ス ル ー し た い か ら コ テ ハ ン 付 け ろ
>>535 じゃないけど本当にコテハン付けて。
読みたくないから。
>>537 print u"変更前:",layername[i]
の代わりに
print u"変更前:", repr(layername[i])
ってしてみて。これで layername[i] が unicode か str かも分かるから。
あと、このソースコード自体はどのエンコーディングで保存している?
実行しているOSは?
541 :
537 :2011/02/22(火) 19:43:34.78
>540 reprを付けたら 変更前: '\x94w\x8ci' 変更後: 背景 変更前: '\x83\x8c\x83C\x83\x84\x81[ 1' 変更後: レイヤー1 変更前: 'name' 変更後: name となりました ソースのエンコーディングは # -*- coding: utf-8 -*- です。 実行しているOSはwindows vistaです。
>>541 なら、Shift-JIS(というかWindows-31J)の文字列に対して、UTF-8で
置換しようとしているから、マッチしない。
Unicode にしたら治る。
lname = layername[i].decode('cp932') # cp932 は Windows-31J の別名
lname = lname.replace(u"背景", u"Background")
...
print u"変更後", lname
layername[i] = lname
543 :
デフォルトの名無しさん :2011/02/22(火) 20:19:50.12
windows7の64bitでPythonを使いたいのですが どこからダウンロードしたらイイですか。 ちなみにPyOpenGLを使うには何をダウンロードしたら良いのでしょうか。
pyscripterとても良いですありがとう
>542 有難うございます、出来ました!!
>>546 下のURLはググれってことだよ言わせんな恥ずかしい
>>546 ああやっぱ今繋がらないんですね
ありがとうございます
IDEってなに?
似非SCSI
>>549 正規表現そのものより、メソッドの挙動が思ってるのと違うんじゃないかなぁ。
re.search('a(b)(c)d', 'abcd\nabcd').group()
=> 'abcd'
re.search('a(b)(c)d', 'abcd\nabcd').group(1)
=> 'b'
re.search('a(b)(c)d', 'abcd\nabcd').group(2)
=> 'c'
re.search('a(b)(c)d', 'abcd\nabcd').group(3)
=> IndexError: no such group
re.search('a(b)(c)d', 'abcd\nabcd').groups()
=> ('b', 'c')
re.findall('a(b)(c)d', 'abcd\nabcd')
=> [('b', 'c'), ('b', 'c')]
re.findall('a(b)cd', 'abcd\nabcd')
=> ['b', 'b']
re.findall('abcd', 'abcd\nabcd')
=> ['abcd', 'abcd']
pythonの正規表現よくわかってないんだけど、 searchは最初の1個マッチした時点で返ってくるのかな?
裾野が広がるってこういうことなんだな
jpから落とすといろいろめんどくさい テンプレからもなるべく省いてるんだから空気読んで欲しい
559 :
530 :2011/02/23(水) 11:03:11.76
.orgもタイムアウトするじゃんw Pythonがんばれよ
しないし応答も遅くないぞ
>>552 返信遅れましたがありがとうございました。
一度家で修正してみます。
565 :
Perl忍者lvl2(悪) ◆M5ZWRnXOj6 :2011/02/23(水) 20:55:08.96
僕もPythonやりたくなったんだけど Perlとの違いおしえて ぼくもPythonやっていいかな?
失せろカス二度とくんな
567 :
Perl忍者lvl2(悪) ◆M5ZWRnXOj6 :2011/02/23(水) 21:19:49.35
ひどい・・・
ここの人たちは真面目だから冷やかしとか冗談は通用しないよ。
>>565 > Perlとの違いおしえて
名前が違う。
> ぼくもPythonやっていいかな?
そう言うことを聞くからには当然「ダメ」と言われたらやらないんだよな?
なら当然答えは「ダメ」になるな。失せろカス二度とくんな。
まさに正論
Python忍者に改名汁 話は其れからだ
>>572 貴様、産廃をこっちに押し付けようとするPerl使いだな
木構造を使ったプログラムを書きたいのですか、標準的なライブラリって存在するでしょうか。
スレちがいかもしれないけど、 EmacsからM-x pdbでpdb起動してpythonスクリプト表示しても なんにも表示されないけどなんで?
画像ファイルを開いて、Blobのフィールドに入れたいのですが、どのようにしてsql文に挿入するべきでしょうか? image = open('path/to/image', 'rb').read() cur.execute("INSERT INTO image(name, ext, image) VALUES(%s, %s, ???)" % (name, ext, image)) %sで入るのかと思ったのですが、unicodeの文字列?だと勘違いされているようでエラーが出てしまいます。
>>576 文字列の % 処理をSQL作るのに使っちゃダメ。
Blogを保存できないくらいなら良いけど、SQLインジェクション許して
ヤバイデータを撒き散らすことになるよ。
cur.execute("INSERT INTO image(name, ext, image) VALUES(%s, %s, ???)" % (name, ext, image))
を
cur.execute("INSERT INTO image(name, ext, image) VALUES(%s, %s, %s)", (name, ext, image))
にすればいけるんじゃないかな。(MySQLdbの場合)
>>578 うまくいきました。ありがとうございます。
>>578 >文字列の % 処理をSQL作るのに使っちゃダメ。
>Blogを保存できないくらいなら良いけど、SQLインジェクション許して
>ヤバイデータを撒き散らすことになるよ。
生データ渡すからいけないんであって
Validation 通したデータなら問題ないんじゃね?
taint処理が正確なら良いのだけど、UTF-8の化け文字などを見通せして、 フィルター書ける輩は少ないからねぇ・・・
>> 575 python 実行時に -u オプションつけるか、環境変数 PYTHONUNBUFFERED を設定するとかでどうよ
>>580 validationだけじゃなくて、正確なエスケープが必要。
自分で _mysql の関数使って正しくエスケープするなら、 % も使えなくはない。
>>581 化けてる文字を削除/正規化したいとかDB以前の文字列の問題のような。
一度適切なencodeを事前にしておけばいいだけじゃないの?
>>583 validationってexecute前のパラメータに対して行うからエスケープ
関係ないかと思ったけど違うの?
585 :
584 :2011/02/25(金) 17:17:28.39
あ、%演算子使ってたのか。勘違いしてた。%演算子は無条件にダメでいいよ。 例外的に使うケースを考えて正確にしても、俺のようにかえって勘違いしやすくなる。
Traceback (most recent call last): File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3245, in _HandleRequest self._Dispatch(dispatcher, self.rfile, outfile, env_dict) 中略 File "C:\Program Files\Google\google_appengine\lib\django_0_96\django\newforms\util.py", line 15, in smart_unicode s = unicode(s, settings.DEFAULT_CHARSET) UnicodeDecodeError: 'utf8' codec can't decode byte 0x89 in position 0: invalid start byte Python2.5です。windows7 GAEを使ってローカルサーバでテストしているのですが、このエラーでつまづいてしまいました。 Djangoを使って入力フォームの作成をしています。
ちょっと質問なんですが、 PythonでGUIアプリを作るときに、 ツールキットではなくそれをラッピングした フレームワークって何かありますか? Webフレームワークのように、アプリケーションを作りやすくする基盤に当たるものです。
上の方で出てましたが、PythonのSQLインジェクション対策ってどんな感じでしょうか? phpでいうmysql_escape_stringみたいな関数ってありますか?
dbapi2なら SQL文の文字列:"SELECT カラム名 FROM テーブル名 WHERE カラム1=? AND カラム2=?" と 入力されたデータ:(1つ目の?に入るデータ, 2つ目の?に入るデータ) を分けてexecute関数に渡す
>>591 ありがとうございます。
executeの引数が2つで、executeで安全なものにして合成されるってことですね。
2.6ですが、下記コードがエラー(bad character range)になります。 import re re1 = re.compile(u"[あ-ん]") ドキュメントには、reモジュールのパターンにunicodeが 使えると書いてありますが、なんでですかね?
>>593 >>> import re
>>> re.compile(u"[あ-ん]")
<_sre.SRE_Pattern object at 0x01060008>
>>> _.match(u"け")
<_sre.SRE_Match object at 0x00FA8B10>
何が違うんだろう?
IDLEとかでやっててu""リテラルが壊れてるんじゃ?
>>594 >>595 情報ありがとうございます
たぶん、もしかすると、おそらく、きっと IDLEが関係しているかもしれない。
もうちょっと調べてみます。
>>596 あぁ、なんだ。IDLE使ってるのか。
IDLE使うと u"" リテラルは使えない。 IPython も一緒。
u"" 使いたかったらコマンドライン使うしかない。
>>597 ありがとうございます。一つ勉強になりました。
IDLEの利便性が何一つ考えられない
600 :
デフォルトの名無しさん :2011/03/01(火) 14:57:31.43
まだ書けない?
601 :
デフォルトの名無しさん :2011/03/01(火) 15:04:00.84
書けた!祝規制解除!
>>403 亀レスだが今日同じコーディングをしたので報告する。
blobstore_handlers.BlobstoreUploadHandler の self.get_uploads で取得した
blob_info.filename は確かに"=?ISO-2022-JP?B?.." だし、長いファイル名だと
ぶち切れている。
しかし、blobstore.BlobInfo.get(blob_info.key()) して、しっかり取得すると
デコード済みなファイル名を完璧に取得できる。
さらにダウンロードファイル名を決めようと self.response.headers['Content-Disposition']
に日本語を指定すると指定したヘッダが無視される。
半角なら問題ない。これはバグGAEのバグなのかな。
ISO-2022-JPにすれば FireFox等ではOKだが、IEはこのフォーマットに対応していない。
悩ましいなぁ。
>>601 タグだらけのHTMLでISO-2022-JPとか、どこのマゾだよ。
あれ、エンコードされたバイナリに半角記号混ざりまくりなんだぞ。
603 :
デフォルトの名無しさん :2011/03/01(火) 15:41:55.70
なるほど、分からん
プログラム組める人が羨ましい。勉強してるけどなかなか先に進まない。早く思い通りに出来るようになりたいのに。
606 :
デフォルトの名無しさん :2011/03/02(水) 13:51:02.79
PythonみたいなLL言語なら全体を勉強する必要ない わからない所をその都度調べれば組み込みでもライブラリでも一緒
>>605 クラスとモジュールのいろはさえ分かれば
Pythonはプログラムすぐ書き始められるよ。
作りたいものありきで、下手でもいいから
さっさとプログラムを作り始めることをおすすめ。
ありがとうございます!やる気が出てきました!
610 :
デフォルトの名無しさん :2011/03/02(水) 16:11:04.86
Model.delete をオーバライドして関連するエンティティを削除していたのだけれども、 db.delete(entity) や、db.delete(entities) だと呼ばれない事に気付いた。 当たり前だけどちょっとハマった。
tweepyモジュールでmentionで送ってきた相手のアカウント名を知る方法はないでしょうか? このスレで聞いていいものか分からないんですが
自己解決しました。
class Aのdefで定義した関数の中の変数を class Bで使いたい場合はどうすればいいんでしょうか? class Aで最後に代入した値を引っ張ってきたいんです
>>613 です。
たとえば
class A
def post(self):
y =2 z =3
x = y + z
このxを
class B
def post(self):
print x # x=5
このようにして使いたいんです。
pass
class A: def post(self): y =2 z =3 A.x = y + z class B: def post(self): print A.x=5 こうすればできるが、こんな書き方をしないと駄目な プログラムは、設計がおかしいと思う。
>>613 普通はB側でAのインスタンスを持つか、
アクセスするときに一時的に引数でもらうかするんじゃないかしら。
Aのメソッド内で使用している変数を外で使いたいということだけど、
メソッド内で使用している変数というのが一時変数なら
Aのメソッドの呼び出しが終わった時点で消えてしまうので、
Aのクラスもしくはインスタンスに、属性として付ける形になると思います。
で、そのBからアクセスしたい変数が
クラス変数なのかインスタンス変数なのかは
その変数の使われ方によるでしょう。
>>614 変数xは、A.post()の**ローカル変数**なので、よほど小細工を施さない限り、外からアクセスできるわけがない。
できたらローカル変数の意義がなくなってしまう。
違う方法を考えるべき。
おはようございます。 "西十条南四十一丁目"→"西十条南41丁目" このように変換したいです。 丁目は全国最大で3文字が上限。 自分だと 一から九十九までの辞書をゴリゴリ手書きで作成[["一","1"]....["九十九","99"]] ループ長い文字列から順に正規表現で丁目の前で文字列のマッチング マッチしたら変換 こんな風に書くと思います。 手書きでゴリゴリリストを書かなくていい方法 ループで正規表現しなくていい方法 など、効率的なよい方法を教えてください
1から9までで良くないか
それより「西10条」にならない方法を考えなきゃ。
>>620 地名の最後に漢数字が来る場合を想定して
山一一丁目みたいなケースだけでも排除しようと思いまして。
これでも山一十丁目は山10丁目に変換されてしまうので完全ではないですけど。
漢数字が地名に直接入り込んでるのはよくある話だからなあ。 八日市とか廿日市とか。 まあ、619は丁目も含めてひっかけるつもりみたいだけど。
>>621 それは丁目とマッチングして丁目の前3文字までを対象としてマッチングすればいいかと。
ひょっとしてそんな正規表現の書き方ありませんか?
>>623 あ!リストに最初から丁目を含めておいて正規表現かけた方がより高速ですね!そうか!
tr=string.maketrans("九十九丁目", "99丁目"..."一丁目", "1丁目") s.translate(tr) これですかね?これなら正規表現しなくてすむ?
>>626 maketransを完全に誤解してました。むー
やってみた。 import re kanlist = {u'一':1, u'二':2, u'三':3, u'四':4, u'五':5, u'六':6, u'七':7, u'八':8, u'九':9} def kton(s, c, mult): if s: return kanlist[c]*mult if c else mult else: return 0 def ntos(n): return unicode(n) def henkan(s): return re.sub(u'(([二三四五六七八九]?)百)?(([二三四五六七八九]?)十)?([一二三四五六七八九])?(丁目)', lambda m: ntos( kton(m.group(1), m.group(2), 100) + kton(m.group(3), m.group(4), 10) + kton(m.group(5), m.group(5), 1)) + m.group(6), s)
>>628 うわっすげえ
初心者にとっては助かったとかいうレベルじゃなくソース見てちょっと鳥肌が立ちました。
さっそく組み込んでテストしてみます!
ありがとうございました!
うはw なにげに100の位まで作ってあるw
頭いいなあ。どうやったらそうなれるの?
あー、結果の数字を全角にするのを忘れてた。 まあそのへんは適当に。
>>616 >>617 >>618 ありがとうございます。
別の方法ですか・・・。
classAでフォームから入力されたデータをいじって、
そのデータを取り出したいんですが、その場合は同じクラスでやるしか
ないんですかね。
>>616 のやり方でやってみたんですが、
AttributeError: type object '◯◯' has no attribute '××'
となってしまいました。
>>628 20を超えると正確に置換できないようですのう。
628のコードをよりPythonicにしたらどうなるんでしょうね。
>>635 >20を超えると正確に置換できないようですのう。
どういうこと?
>>636 adlist = [
u'銀座四丁目',
u'銀座十四丁目',
u'銀座十四丁目',
u'銀座ニ十丁目',
u'銀座ニ十四丁目',
]
for line in adlist:
print henkan(line)
>>>
銀座4丁目
銀座14丁目
銀座14丁目
銀座ニ10丁目
銀座ニ14丁目
>>>
www
>>632 テストで正常に動きました。全角への変換は別のモジュールでやってみます。ありがとうございました。
>>638 www
サニタイズを間違えてサニタリーって大声で言う人がいて困っています
>>632 テストの結果もともと全角アラビア数字が入ってるデータに遭遇したらおかしなことになりました。
旭台1丁目→旭台10丁目
マッチングせず0が返ってきた場合の対応ですかね?
じっくり考えてみます。
python version 2.6.5 os ubuntu linux class HogeHoge: def __init__(self, name): self.name = name temp = [] for x in ("市川海老蔵", "島田紳助", "仙谷由人", "小沢一郎", "鳩山由紀夫", "みのもんた", "押尾学", "亀田興毅", "亀田史郎", "亀井静香"): temp.append(hogehoge(x)) この作成した"temp"リストの各HogeHogeクラスのインスタンスの"name"要素に 例えば"亀"を持つインスタンスを抽出する場合の定番のやり方を教えてくださいよろしくお願いします。 それとみなさん字下げはどうやってるのですか?上記は全角スペースを使ってます。
>>644 filter(lambda e: '亀' in e.name, temp)
[e for e in temp if e in e.name]
日本語はUnicode文字列(u'亀井'とか)じゃないとそのうちバグるかもしれない
字下げは全角スペースでも実体参照( )でも好きな方で
>>646 は2chに書き込む際の話ね
ソースコード中の字下げは半角スペース*4がお約束
648 :
644 :2011/03/04(金) 21:04:15.06
>>644-647 こんなに早い回答ありがとうございます
>
>>646 は2chに書き込む際の話ね
すみません、2chに書き込むときと書き忘れていました
早速試してみます
Cygwinでnumpyとscipyを使う方法教えてください
いまどきcygwin使ってるひとって
651 :
628 :2011/03/05(土) 02:27:38.26
>>643 あー、そこはちょっと気になってた。とりあえず数字を文字列に直すところで
0 を空文字列にすれば大丈夫のはず。
せっかくだから全角に直すのを
>>626 の translate を使ってやってみた。
fulltable = {ord('0'):u'0',ord('1'):u'1',ord('2'):u'2',ord('3'):u'3',
'''''''''''' ord('4'):u'4',ord('5'):u'5',ord('6'):u'6',ord('7'):u'7',
'''''''''''' ord('8'):u'8', ord('9'):u'9'}
def ntos(n):
''''return unicode(n).translate(fulltable) if n != 0 else ''
あとは同じでいいはず。
translate って使いにくい…… こんなもの?
652 :
628 :2011/03/05(土) 02:28:47.11
>>651 ぎゃ、手作業で変換したら apos になってる!
fulltable = {ord('0'):u'0',ord('1'):u'1',ord('2'):u'2',ord('3'):u'3',
ord('4'):u'4',ord('5'):u'5',ord('6'):u'6',ord('7'):u'7',
ord('8'):u'8', ord('9'):u'9'}
def ntos(n):
return unicode(n).translate(fulltable) if n != 0 else ''
九十九九十九丁目
九十九十丁目
次元が違いすぎてついていけないでござる
そういうのはどこがわからないか聞けば誰かが教えてくれるよ 全部わかりませんだと入門書嫁か帰れって言われるけど
>>652 ありがとうございます。全角半角変換は他でも使ってたのでzenhan.pyを借りてきてつかってました。
http://straitmouth.jp/blog/setomits/139 ntos()の変更はコードみてわかりましたけど
if n:
return unicode(n).translate(fulltable)
else:
return ''
こんな書き方になる初心者には相変わらず神ですね。お陰さまで完全な結果を得られました。
なさねがさねありがとうございました。
単なる三項演算子じゃね
3.xだと str(n).translate(str.maketrans('0123456789', '0123456789')) でいいのかな多分 2.xだとstring.maketrans()はあるが、unicodeには使えんようだからな unicode(n).translate(dict(zip(map(ord, '0123456789'), u'0123456789'))) とかか まーいずれにせよtrに比べると使いにくいわな
python.orgの 下載ってなんですか? 中国人の頁でしたか
ダウンロードだっけ
>>661 バージョン番号が天安門事件の日付とかぶってるせいで、中国人が
great fire wall に阻まれてダウンロードできなくなってるから、
その対策。
664 :
デフォルトの名無しさん :2011/03/05(土) 20:20:48.31
簡単な作業をスクリプトに書いたんですが 起動するまで他の言語で作ったスクリプトよりも時間かかりますね これ起動を早くする裏技みたいなのってありませんか? windows pytthon3.2です
ハードウェアを速いものに交換する (CPU, HDD, RAM, etc...) ソフトウェアを速いものに交換する (OS, Driver) PCを投げ捨てる (Throw away a PC)
>>664 1回目はコンパイルしてるから。
2回目以降は普通に早いはずだけど?
特にWindowsなら。
>>664 どんなスクリプトを書いて、どれくらい時間がかかってるのか出さないと、
何もアドバイスできないぞ。
thumbnailとimageはblob型のフィールドで、num1,num2はint、それ以外はstrです。 cursor.execute("INSERT INTO image(num1, num2, filename, ext, thumbnail, image) VALUES(?, ?, ?, ?, ?, ?);" , (num1, num2, _name, _ext, _thumb, _image)) こんな感じでDBに入れたいのですが、not all arguments converted during string formatting というエラーが出てしまいます。 これは入れる値はすべてstrでないといけないのでしょうか?intを入れたいのですが。。 わかる方よかったらお願いします。
670 :
デフォルトの名無しさん :2011/03/05(土) 21:50:32.12
IEのフォームのinputに文字列をペーストしたいのですがjavascriptかなにかで禁止されててできないページがあります 具体的にはパスワードの変更とかでパスワード生成ソフトを利用して作った文字列を入力するのはキツイ&間違って入力したら大変なのでpythonでキーボードを入力させたいのですが pythonでそういう事はできますでしょうか?
じゃあx64は規制か
>>670 JavaScriptを無効にするか、onPasteをいじる
>>668 使ってる DB は何?SQLite?
print repr(num1, num2, _name, _ext, _thumb, _image)
して結果を張って。
少し前に脆弱性が見つかったやつじゃないか
>>673 ありがとうございます。MySQLです。長すぎるので貼付けは出来ませんが、
num1, num2は 1L, 1L となってて、strのところはunicodeの文字列、画像のところは凄く長いです。
>>676 DBに画像を放り込むならフィールドの型を
BLOBにしておかないといけないけど、
そういう設定をちゃんとやってるのかしら。
>>676 blobでつくってます。num1, num2のところを変数ではなく最初から代入された状態(埋め込んだ)にしたらいきました。
? にはintが入らないということでしょうか?
>>679 ? じゃなくて %d や %s を使えば良いと思うよ。
681 :
デフォルトの名無しさん :2011/03/05(土) 23:47:29.65
674 672 javascript切るとボタンが聞かなくなるので出来ないです(onclick使っていると思われます) あまりjavascriptのほうはいじりたくないです(サーバー側でクラックしてると思われるので) lastpassじゃないのですがkeepassは利用してます パスワード生成ソフトと入力ソフトはセキュリティ的に分けたいのです 無理そうなので諦めます
COM経由でブラウザを操作すればできるけど それだと言語はpythonがベストな選択肢じゃない。 自分ならGreasemonkeyでHTMLを書き換えるだけだがIEは知らん。
PythonでUAを外から操作するんじゃなくて、 Pythonで直接ウェブサーバーにアクセスして POST/GETかけることを考えたほうがいいと思うよ。
他のアプリケーションをpythonからコントロールをしたいのですが どうやったらいいのでしょうか? 具体的にはmpc-hcをほぼすべて完璧にコントロールしたいのです。 参考になるリンクだけでもお願いします。
mpc-hcって何?それが分かれば回答できるかもしれないが
正直に言うと、エロ動画が増えすぎてサムネイル管理したいのですが WhiteBrowserじゃサムネイルが作られない動画が多くて mpc-hcにさせようと思ったんです。 ところがサムネイルにはショートカットキーもなければ 紹介されたAPIにもサムネイルはないみたいだし・・・・・
>>688 ffmpegが扱える形式なら、ffmpegつかって以下のようなコマンドラインで
サムネイル作れるよ
ffmpeg -an -vframes 1 -s 幅x高さ -ss 位置(HH:MM:SS) -i 入力ファイル 出力.jpg
後は、AviSynthでもサムネイル作れる
ffmpegほど手軽じゃないが、DirectShowSource()使えば、DirectShowのフィルタで
再生できるようになってる形式は全部対応できる
>>689 前に使ったことある。安定してていいツールだよね。
692 :
690 :2011/03/06(日) 15:01:16.59
リロードしてなかったスマソ
694 :
デフォルトの名無しさん :2011/03/06(日) 16:24:02.91
すいませんPythonをWindowsにインストールしてみましたが今市Pythonで何が作れるのかわかりません プロジェクト管理みたいなのを作りたいのですがガンチャートみたいなやつってPythonだけじゃ作れませんよね?
>>694 GUIアプリとして作るのかコマンドラインアプリとして作るのか
ウェブアプリとして作るのかで全然変わってくるわけだが。
最後のだとTracであるんじゃないかい?
すっげーです。ffmpg かんたんに作ることができました。 これで心置きなくお猿さんになることができます。 ありがとうございました。
Unicode文字列から日本語だけ抽出したいんだけど良い方法ありますか
>>> import unicodedata >>> [unicodedata.name(i) for i in u'aあアア亜11一'] ['LATIN SMALL LETTER A', 'HIRAGANA LETTER A', 'KATAKANA LETTER A', 'HALFWIDTH KATAKANA LETTER A', 'CJK UNIFIED IDEOGRAPH-4E9C', 'DIGIT ONE', 'FULLWIDTH DIGIT ONE', 'CJK UNIFIED IDEOGRAPH-4E00']
>>698 こんなモジュールがあったんですね。
後はunicode名によって場合分けしたら良いかな
CJK統合漢字、互換漢字には日本で使われてない文字も含まれてるから 面倒だろうな
文字から日本語かどうか判断しようというのがそもそも良くない。 WATASHI ENGLISH WAKARIMASEN これは何語だ?
Googleとかどうやって判定してるんだろうな。 lang属性があるサイトばっかりじゃないだろうに。
>>702 文字の出現頻度の統計とか、サーバーがどこにあるかとか。
Googleだってページ全体が何語か判定しているだけで、ページの中から
日本語を抜き取るとかまではしていないしな。
一時はC++の勉強を考えていたのですが C++より簡単だという噂とPortable版の存在を知ってPythonに興味を持ちました まずはバージョン3.1を導入すればよろしいのでしょうか?
2.x の方がいいよ
全部間違ってる C++は初学者には適さない(Visual Studioの勉強ならC#でいい) その分学習用に設計されたPythonは勉強しやすいはず だからといってPythonが簡単とは言えない、 大概がCやJavaなどの経験があった上での簡単なので信用ならん Portable版でやる意味がよく分からんが 3.xはまだまだ発展途上なので2.xを使うべきだしPortable Pythonは3.0.1までしかないはず
>>704 それでいいと思うよ。
今から勉強するなら、Python3.0以降(3.1も含む)の方が、
一貫性があっていいかもしれないね。
実務だと周辺ライブラリの対応が必要になるので
2.6対応が避けられなくなっちゃうけど。
GAEが対応するまで、私はPython 2.6.6を続けるよ
>>706 C++が初学者に適さない、という所以外は首肯しがたいな。
Pythonは学習用に向いているけど学習用に設計されたわけではない。
(Guido自身がそう言ってる)
Pythonは言語仕様を簡潔に保つことを常に心がけられているから、
RubyやPerlよりも学習は楽と言っていいと思う。
3.xはもうだいぶ枯れてきてるよ。
3.2では言語仕様面での追加はなくて、
ユーティリティーライブラリの強化が中心だし。
初学者へのレスなんだから少しは行間を読め 学習(の)用(途)に(も)設計された 3.x(のコミュニティ)はまだまだ発展途上なので(ドキュメント・ライブラリ数が圧倒的に少ない)
だいたいあってる
> 3.xはもうだいぶ枯れてきてるよ。 > 3.2では言語仕様面での追加はなくて、 > ユーティリティーライブラリの強化が中心だし。 これはPEP3003によって設けられた「モラトリアム」のために、 意図的に言語仕様を変えなかったからだろう つまり変化が無いのはあたりまえで、それを枯れてるの根拠にするのは なんか違うんじゃないか
俺は初心者だけど3.1からでもすんなり学習できたよ print("")って書くのとモジュールの名前が違うってのだけ知ってれば後はggrば答えが見つかるし別に困らなかった
version 2.6.5 import sys import zipfile ziparc = zipfile.ZipFile(sys.argv[1], "r") for load_file in ziparc.namelist(): zipfile = ziparc.read(load_file, "r") text = open(zipfile, "r").read() print text zipファイル内のテキストファイルを読み出そうとしています 一応読み出せはするのですが"IOError: [Errno 36] File name too long"と怒られるのですが 正しいやり方を教えてください、お願いします
text = open(zipfile, "r").read()がいらない for load_file in ziparc.namelist(): text = ziparc.read(load_file, "r") print text
ライブラリって何? とりあえずpythonをインストーラでインストールして使ってるだけだよ
ミスった for load_file in ziparc.namelist(): text = ziparc.read(load_file) print text
無責任に3.xを薦めるとライブラリすら知らない 頭の悪い人が使っちゃうからやめてよね
2.x厨 vs 3.x厨
725 :
デフォルトの名無しさん :2011/03/07(月) 15:49:10.74
Pythonでツールチップを出す場合はどのライブラリを使えばよいでしょうか?
>>725 ツールチップっていうのはOSにもGUIツールキットにも依存するから、
どのライブラリとかそういう次元じゃないよ。
少なくともQt系ならできるはず。
>>718 ,720
こんなアホな質問に丁寧に回答ありがとう
エラー無しで通りました
ここに居る人ってjavascriptも当たり前のように使いこなしている気がするんですがどうですか?
729 :
デフォルトの名無しさん :2011/03/07(月) 20:05:29.62
C,C++,Java,C#,VB,VB.net,CSS,HTML,XHTML,HTML5,JavaScript,jQuery,prototype, Lua,Ruby,Python,Perl,ActionScript2.0,ActionScript3.0,Basic,HSP,PHP,Objective-C 業務でやって来たのはこのくらいか プログラミング暦30年
業務でHSP?
731 :
デフォルトの名無しさん :2011/03/07(月) 20:47:25.59
>>729 凄いw
やはりpythonだけしか知らないという人は日本では少ないのかもしれないですね。
733 :
716 :2011/03/07(月) 21:11:09.66
version 2.6.5
"苗字:名前:性別"が行ごとに区切り文字":"で区切られ並んでいるファイルがありそれを取り込む際に
text = open("text.txt", "r").read()
for lines in text.splitlines():
for cnt, txt in enumerate(lines.split(":")):
if cnt == 0:
temp_last_name = txt
elif cnt == 1:
temp_first_name = txt
elif cnt == 2:
temp_first_name = txt
personal_data.append(temp_last_name, temp_first_name, temp_sex)
上記のように一々if~elif文を使う以外に適切な分割方法ありましたらお教えください、おねがいします
>>722 "バイト列にして返します"とあったのでファイルとして開く必要があると誤解してました、ありがとうございます
with open('text.txt') as f: for line in f personal_data.append(line.split(':'))
736 :
716 :2011/03/07(月) 21:33:24.42
おしり
ライブラリやフレームワーク含めるのは有りなのか?
どこの誤爆
いいじゃん、みんなの勉強してる言語教えてよ。
言語が出来たからってライブラリとフレームワークが使えるわけでもないし
標準関数の使い方や定石コードは知っておくべき
いつのまにか fopen が fopen_s になってたりするんですねわかります
ライブラリとモジュールの違いを教えてくれ。。
749 :
デフォルトの名無しさん :2011/03/09(水) 11:43:36.29
PHPしかできないクズだけどさ Pythonって何に特化してるのか教えてください
>>749 むしろPHPがサーバーサイドに特化している。
何に特化しているとかはないが、他のスクリプト言語に比べると数値計算とかアルゴリズムの記述がやりやすいかな
アルゴリズムの本とかにある仮想言語に似てるよね
Pythonは何にも特化していない汎用言語。 データ解析にもWebアプリにもGUIアプリにもサーバーにもスクリプティングにも使える。
ライブラリとモジュールの違いを教えてくれ〜
755 :
デフォルトの名無しさん :2011/03/09(水) 14:04:47.57
ライブラリはlibrary モジュールはmodule
外部関数用にランタイム化されたものを取り込んで使うのが、ライブラリ。 Pythonのスクリプトにより定義されたものを、取り込んで使うのがモジュール。
勉強用にPythonスタートブックという本の購入を検討しています。 この本はPython3が対象なのでしょうか?
Python勉強してるんですが、複雑な式(論理式?)等が出てくると、途端に難解になります。力を付けたいのですがどの様な知識が必要なのでしょうか?助言お願いします。
日本語を理解する能力
置き換えれば簡単になるんだけどな a == b and c != d or not (e is f and g is not h) and i not in j -> A and B or not (C and D) and E -> S or not T and U -> X or Y
ベン図でも書けば
ありがとうございます。出直して来ます。
ド・モルガンの法則くらいは知ってた方が良い
>>759 というか、デバッグしたり解析したりする場面を除いて、
具体的なクラスやメソッドの中身を理解する必要は通常ないはずだよ。
モジュールやクラスや関数のインターフェイスや、
その使い方を知りたい、というケースがほとんど。
したがって、コード中の複雑なロジックを頑張って理解しようとして乙だが、
実務で大事なのはそこじゃないかもね、ってこと。
__builtin__.__dict__[funcname] = func とかして、特定の関数を初めから使えるようにして、 pythonのモジュールをプラグインとして書かせてimportするのってアリなんですか? できるかできないかではなく、その、仕組みとして。
>>766 from the_module import the_keyword
の構文で全く同じことができるから、
そんなトリッキーなことを考える必要はない。
>>768 それ書くとしたら、プラグイン側ですよね?
かなり数があるので、呼び出しもとでまとめて関数定義しておいて、プラグイン側は好きなの適当に呼び出す方が、書きやすいかなぁと。
いや、まぁそれでも
from modulename import *
一行書かせればいいんですが。
javaのinterfaceみたいなの想定してる?
>>770 あ、まさにそんな感じです。
boost.pythonから呼び出そうと思ってまして。
ユーザスクリプトに見せたい名前を辞書fooに突っ込んでおいて exec userscript in foo とかでもいいんじゃないのかな
あの〜、ここは超初心者が見ていてもよろしいのでしょうか?
>>772 どなるほ
一度実行するだけで、スクリプト内の関数にアクセスする必要がなければ、それがシンプルですね。
それとも、実行すると、辞書って更新されます?
>>> foo = {} >>> exec 'def add(x,y): return x + y' in foo >>> foo とかやってみるとわかりますん
PyScripter使ってるんだけど、 import sqlite3 con = sqlite3.c としたときに、インテリセンスで候補がでてこないんだけど俺だけ? 空白なんだが。
インテリセンスってMSのマウスかと思ったわ 入力補完のことだろうけどやめてよね
>>775 foo['add'](1,2)
ができますた。
とてもよく理解できました。
さすが関数型言語。
>>778 Pythonはマルチパラダイム言語だが、
関数型言語なんて呼んでるのは初めて見たな。
foo['add'] = lambda x, y: x + y とどう違うの?
関数型言語(に影響されたオブジェクト指向言語)
python3.2が動く無料サーバってないですか? GAEって2.6ですよね?
3.2じゃないといけない理由はなにかあるのか
3.2から勉強始めたためなのです
>>780 evalやexecは「任意の」文字列を実行時にコンパイルして実行することができるのが
いちばんの違い
exec statement in foo
では、fooをexecの「環境」になるので、読み書き両用
つまり、statementから参照できる識別子を与えることもできるし
statementが生成した識別子を格納することもできる
よくしらんけどWeb系なら3.2はやめたほうがいいんじゃないの GAEが2系ってだけじゃなく、Django他、3系未対応のフレームワークだらけだったと 思うけど
787 :
778 :2011/03/10(木) 11:25:57.63
exec userScr in locals(), dic とかすれば、モジュールのオブジェクトをプラグインに公開しつつ、プラグイン毎に定義したオブジェクトも後から使えるので、便利ですね〜… ようやくシンボルテーブルの使い方がわかり始めました。 理解できれば納得な点が多いけど、いかんせんC系言語に慣れてると、なかなか難しい…
GAEは2.5.xだよ 基本的にライブラリが2.5、良くて2.7までしか対応してないから ライブラリのラッパーをしたライブラリで3.xなんて論外。
>>787 個人的にC++→Pythonはそんなに入りにくいとは思わなかった
C++はメジャーな言語の中でも一番複雑なものの一つだし
マルチパラダイムでジェネリック重視、ダックタイピングを多用するのも似てる
動的言語を使ったことがないならそれに慣れればいいだけで
少なくともC++よりはずっとシンプルで楽ですよ
Cやってたけど全く苦労しなかったな もしかしてスクリプト言語触ったことないとか
何で3.2移行が進まないんですか?
主要なライブラリが対応したら本気出す
793 :
778 :2011/03/10(木) 13:37:32.13
>>789-790 javaScript, cmd, powershellぐらいしか。
いや、わかり始めればなんてことはなく、スムーズ何ですけどね。
shell言語はどれも綺麗とも素直とも言い難いからあんま参考にならないと思う Pythonは名前空間がわかれば大丈夫
何故ライブラリ作者は3.2に移行しないの? ただ面倒くさいだけ?それとも3.2って魅力内の?
ライブラリ作者「俺が使ってないから対応しない」 有料でもクローズドでもないのが大半なんだから自分でどうにかすべきだと思うよ
>>796 ガンガン移行作業中だよ。3.2がリリースされて、いままで移行してなかった
たくさんのライブラリが移行を始めてる。
pyqtなんてゴミはいらんから wxを3.xに対応させて欲しい
>>800 PyQtのどこがゴミなんだろう・・・
wxは、 wxWidgets 3.0 待ちじゃないかな?タイミング的に wx2系を
Python 3 対応させても、すぐに wx3 対応作業が発生しちゃうから。
Qtは糞
QtはPythonでの利用価値がない WxはC++での利用価値がない
1行目は同意出来る部分はあるが 2行目はそうでもない wx を C++ で使ってるけど結構快適だよ もちろん Qt4 を C++ で使ったこともあるよ
>>773 ここPython超初心者スレだけど、プログラミング超初心者スレじゃないんだよ
>>803 なぜ?
TortoiseHGのGUIもBazaarのGUIもwxじゃなくてQtで作られてるけど。
GPL感染者がきたぞー
>>801 PyQtはライセンスがGPLだからだろ。
PySideはライセンスがLGPLだから俺はPyQtよりPySideの方が好きだ
すみません。 ループの中でエラーを検出したら飛ばして次の列に進むってどうやって書けば・・・ for e in list try: do.something(e) except: pass
どのようなエラーなのかわからないとなんとも 例外とエラーは違うんだけど for e in list: &&if has_something_error: &&&&continue とか
メタモルフォーゼしてしまった
あ、すみません。例外です。 continue! これで戻れますか?
>>812 continueはイテレータを次に進めて
ループの始めからやり直すわけだが。
戻るのとはちょっと違うよね。
説明がわかりにくくてすみません。 for e in list try: do.something(e) except: continue こう書いてdo.something(e)で例外が発生した場合 イテレータを次に勧めて処理を続行できますか?
その場合、continueでもpassでもかわらない list = ('1.4142', '1.7320', '2.2362', '2,7182', '3.1415',) for e in list: try: print float(e) except ValueError: continue for e in list: try: print float(e) except ValueError: pass
超初心者は Python から入門するべきではないと?
超初心者はHTML→CSS→JavaScript→PHPの順番で学習すると良い
趣味でやるなら好きにやればいいんじゃない?
C->C++->Python->Lisp
>>815 うーむ・・・ ループの先頭に復帰させるにはどうしたらいいのでしょう
>>776 同じく。
PyScripterはpydの中までは拾ってくれないみたいね
NetBeansならいけるけどJavaのGUIアプリはもっさりなんだよなぁ
個人的にはC言語から入るのがいいと思うけどねぇ。 LISPは好きなように拡張できる自由度は魅力だけど自由すぎる。 他の言語は、C言語やってから好きなの選べばいいと思う。
>>820 お前の言っているループの先頭ってどこだ?
>>814 出来るよ
815が言ってるのは
ループスコープの最後でcontinueしても
その後に実行される文が無いからpassしてるのと同じだよってこと
825 :
575 :2011/03/11(金) 06:39:11.24
>>582 > python 実行時に -u オプションつけるか、環境変数 PYTHONUNBUFFERED を設定するとかでどうよ
環境変数設定してみたけど、
M-x pdbは相変らず何も表示されなかったです。
pdb起動するのに -uオプションってどうやってつけるのかよく分らなかったので試せませんでした。
簡単で、分かりやすく、強力な言語だと聞いてpythonから始めたのに、、。
Who told you that? You may not talk with terrorist.
問題: 次のコードを実行した場合、XXXは出力されるか。 はいかいいえで答えろ。 try: int('hoge') print('XXX') except ValueError: pass 良くない回答例: 「pass」 「答えろだと?てめェが答えろよ!」
>>825 それそもそも pdb ちゃんと起動出来てる?
M-x pdb の後に聞かれるコマンドは python -m pdb hoge.py みたいにやってる?
tryの前でint()が再定義されているかもしれないじゃないか
自分のパソコンはwindowsなんですが 他の環境で動くかどうか確かめる方法なんて あるんでしょうか?
おめえこの状況でよく質問なんてできるよなks
833 :
831 :2011/03/11(金) 17:27:07.94
すいません、書き直します 自分のパソコンはwindowsなんですが 作ったプログラムが 他のOSで動くかどうか確かめる方法なんて あるんでしょうか?
VMWareやDual Bootを利用して確認する あるいは特定環境のユーザーに報告してもらう。 基本的には環境依存のライブラリや組み込み関数を避ければ大丈夫
ある。 次の方どうぞ。
836 :
831 :2011/03/11(金) 17:51:01.16
ありがとうございます 今まで自分の環境のみでなんとか動くものを、と 考えて作っていたのですが 他のOSで動く事を考えるには ・#-*- coding: utf-8 -*-は使ってはいけない ・Ansiで保存 ・cp932やmbcsは使わずunicodeで扱う でいいんでしょうか?
>>836 >#-*- coding: utf-8 -*-は
は使っていいよ。
838 :
831 :2011/03/11(金) 18:00:23.43
あ、そうなんですか? 以前、外国の人に ファイル_must_に書かれるファイル名がコード化されるUTF-8であるということである、それはシステム符号化に依存することができない。 て言われたんで#-*- coding: utf-8 -*-は使っちゃいけないかと思ってました
>>838 ファイルの中がUTF-8であることと
ファイル名がUTF-8であることは全く違うんだが。
書いたPythonプログラムを再配布するときは、
スクリプトのファイル名に日本語を使ったらダメ。
>>840 > M8.8の地震のエネルギーは、6000人以上が犠牲になった阪神大震災(M7.3)の約180倍に当たる。
今回は数万人死んだのかな
843 :
デフォルトの名無しさん :2011/03/12(土) 07:45:54.71
Windows7 64bitでpygtkを使いたいのですが使えている人いますか? どうも僕の環境ではうまく動作してくれません。 環境 Windows: 7 Home Premium 64bit python: 2.6.6(32bit) gtk+: 2.12.9-win32-2 pygtk: 2.220.0-1.win32py2.6 pycairo: 1.8.10.win32py2.6 pyobject: 2.26.0-1.win32py2.6 Pythonを32bit版に選んだ理由は、64bit版をインストールしているときに pygtk、pycairo、pyobjectをインストールしようとすると、 「Python version 2.6 required, which was not found in the registry.」 というエラーがでたためです。 またpygtkなどには64bit版のパッケージは見つかりませんでした。 32bit版のPythonをインストールすると、pygtkなどはうまくインストール出来たのですが、 今度は、コンソール上で「>>> import gtk」でエンターすると、 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python26\lib\site-packages\gtk-2.0\gtk\__init__.py", line 30, in <module> import gobject as _gobject File "C:\Python26\lib\site-packages\gtk-2.0\gobject\__init__.py", line 26, in <module> from glib import spawn_async, idle_add, timeout_add, timeout_add_seconds, \ File "C:\Python26\lib\site-packages\gtk-2.0\glib\__init__.py", line 22, in <module> from glib._glib import * ImportError: DLL load failed: 指定されたプロシージャが見つかりません。 というエラーが発生します。 どうにかしてwin7の64bitでpygtkを使う方法はないでしょうか?
あるクラスのデストラクタで一時ファイルの削除を行っているのですが、 ファイルが削除されないことが多々あります。 デストラクタはオブジェクトが不要になった際に確実に実行されるという認識なのですが、 この認識は誤りなのでしょうか?
>>844 循環参照の一部になっているオブジェクトのデストラクタは呼ばれません。
一般的に、 __del__ を使ってリソース解放するのは悪いアイデアです。
コンテキストマネージャを使いましょう。
>>843 GTK+系ライブラリをバラバラに入れるのは
非常におすすめできない。
一旦Python本体及び周辺ライブラリを全てアンインストールして、
Python本体を入れなおした後、
Python側からeasy_installでインストールすることをおすすめ。
Active Pythonならpypmという手もある。
all-in-one installerがあるじゃん
руgtkはいらんなあ
weak_ptr的なものは無いのかというのは、Cに毒されすぎ? こういう場合、どう組めばいいのだ?
>>851 weakref はあるよ。
こういう場合って、どういう場合?
>>841 ありがとうございます
ちょっと文字列とUTF−8とかcp932の事が理解できて無いみたい
なので
もうちょっと調べてみます。
>>843 です。報告遅くなりました
>>846 × gtk+: 2.12.9-win32-2
○ gtk+ runtime: 2.12.9-win32-2
記述漏れです
ちゃんと入っていました
>>847 確かにバラバラに入れるもんじゃないですね
easy_installを試す前に
公式にあるall-in-one installerを試したらうまく言ったので
このままこれでいってみようと思います
>>848 all-in-one installerを試したらうまくいきました。
ありがとうございました
py2exeでexeファイルを作ろうとしたところうまくいきません。 py2exeをダウンロードし、ファイルも2つ用意しました。 test.pyとsetup.pyの2つです。 プログラム内容はサンプルコードのようなものなので間違ってはいないと思います。 Python Shellのコマンドラインで、 python setup.py py2exe と入力したところ、 SyntaxError: invalid syntax とエラーがでて、入力したコマンドのsetupのところが赤くなっています。 構文エラーということはコマンドが何か違うのでしょうか? Python(command line)のほうでもやってみたのですが同じような結果です。 Pythonのバージョンは2.5です。 分かる方いましたらお願いします。
とりあえず、そのsetup.pyをcatしろ
>>856 すいません、catとはなんでしょうか?
ググッてもよくわからなかったのですが
じゃあ、わかるまでググれ
猫かわいい
pythonで for(3回ループ) {case 1回目:処理A 2回目:処理B 3回目:処理C } としたいのですがどうすれば良いでしょうか?
try: 処理A 処理B 処理C except: pass for i in range(3): if i==0: 処理A elif i==1: 処理B elif i==2: 処理C for i in range(1,4): if i==1: 処理A elif i==2: 処理B elif i==3: 処理C
ありがとうございました
for p in [処理A,処理B,処理C]: p()
ありがとうございました
import tkinter と from tkinter import * の違いってなんですか?
モジュールのインポートか モジュールの名前空間を外してモジュール内の全てをインポートか
ありがとうございます 名前空間がわからないので出直してきます
import tkinter の場合 root = tkinter.Tk() とモジュールを明示的に指定して書けるのに対して from tkinter import * の場合 root = Tk() とだけ書けば良いので「手抜き」コードになってしまう ただしグローバルの名前空間を破壊するので 元々 Tk() という関数があったら上書きされる そもそも * で import してしまうと 何が上書きでつぶされるか判らないので 何をやってるか判ってないと危険 名前空間判ってないときは from hoge import * はやめて from hoge import fuga とすれば fuga() で済むので安全というかマシ
ありがとうございます。
hogehoge.__class__.__name__でクラス名で判定して処理しているのですが こんな使用は一般的に許容されるでしょうか?
>>870 そういうコーディングは不可能ではないが、
一般的にRubyやPythonのような動的言語は
ダックタイピングを好むので、型ではなく振る舞いによる実装を行う。
それから、instanceofを使うといい。
isinstanceだた
873 :
870 :2011/03/15(火) 01:02:18.22
python(2.6.2)のcursesで日本語UTF-8を表示するにはどうすればいいんでしょうか? 以下のコードでaddstrの出力が文字化けしてしまいます printの出力は正常なので端末の問題ではないと思うのですが #!/usr/bin/python # -*- coding: utf-8 -*- import curses s = "テスト" def main(scr): print s scr.addstr(s) scr.refresh() curses.wrapper(main)
s = u"テスト"
>>875 それだけだと以下のエラーになりました
File "test.py", line 7, in main
scr.addstr(s)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
scr.addstr(s.encode("utf-8"))
にするとエラーはなくなりましたが
結果は同じで文字化けしました
>>876 locale.setlocale(locale.LC_ALL,"")
>>877 import localeしてそれを書いとくことで文字化けしなくなりました
ありがとうございます
879 :
デフォルトの名無しさん :2011/03/15(火) 18:41:07.78
いえいえ
本当のことを教えてください
pythonはじめました
Python引退します さようなら
We're grateful for your leaving, thank you farewell.
タプルとかリストとかややこしくてわけわからん
タプルなんて定数以外に使わんからいらんよ
それならちょっと知っておくくらいでいいのかね リストのほうしっかり勉強しときます、さんくす
タプルは値の組み合わせを定数として扱いたい時に使う。 同じグループが変動していくならリストでいい。
具体的には、 1) 辞書のキーに使う 2) 関数から複数の戻り値を返したい時に使う 3) スワップを x, y = y, x のようにできる。フィボナッチなら x, y = y, x+y というのが分り易いタプルの出番。 使っていけば、そのうちタプルを使うべき場面が判るようになってくる。
Cの構造体に相当するものが無い(無かった)からな
構造体なら空クラスにインスタンス変数でいいと思うの
構造体みたいなバイトガチガチなものなんて、 Pythonにはいらないよ。 どうしてもやりたいならCythonで記述すればいいし。
構造体としてのクラスとタプルの利点を合わせ持った namedtuple というものもある。
version 2.6.5 class test1: def __init__(self, num): self.num = num class test2: def __init__(self, lst): self.lists = lst temp = [] lists = [] for x in range(10): temp.append(test1(x)) lists.append(test2(temp)) temp[:] = [] for y in range(5): temp.append(test1(y)) lists.append(test2(temp)) for clstst1 in lists: for test1lst in clstst1.lists: print str(test1lst.num) 最後の部分のループで、それぞれ10&5個の整数を持つリストが表示されることを期待したのですが これを実行すると、test2クラスの2つのインスタンスのリストが同じものを参照しているようです 一時的にリストを作っている"temp"を、それぞれの代入ごとに別々の変数で作ると期待する動作となります ということは変数"temp"の参照先をクラスtest2のコンストラクタ?に渡しているようなのですが 値渡しあるいはひとつの変数を使いまわして同様の動作を得るにはどうするべきでしょうか それともコードを見直すべきでしょうか?
>>893 test2の__init__()の中身を
self.lists = lst[:]
とでも書き換えればいいよ
>>> temp = range(10) >>> a = temp >>> temp[:] = [] >>> a [] >>> temp = range(10) >>> a = temp >>> temp = [] >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>893 894だけじゃ意味が分からんだろうから……。
変数に入れたリストについて、変数はリストの値じゃなくて参照を保持してる。
だからリストが入った変数(この場合lst)を別の変数に代入しても、
リストは全体で1つしかない。
894はセレクタという文法で、この場合はリストのコピーが作られる。
>>884 RDBを知ってるんなら、RDBの表を考えると分かりやすい
表の行は、相異なる属性/型の組になってる
ID、姓、名、性別、...
みたいな
いっぱんにこういう有限の「組」を表現する概念がタプルで
関係データベースや関数型言語で使われる
逆に、ある表の列は、同じ型のシークエンスになってる
そういうものを表すのに一般に使われるのがリスト
静的型の世界ではその区別ははっきりと明確だけど
Pythonの場合は動的型言語だから、この種の区別はないね
単にミュータビリティの差でしかない
でも、リストである必要がない場所では常にタプルを使ったほうがいいよ
そのほうが効率がいいし
変更可能なインスタンスを共有することによるトラブルに悩まされずに済む
namedtupleは曲がりなりにも標準ライブラリの一員で 色々なところで多用されてるけど その実装は文字列によるクラスの実行時生成+exec()という 真っ黒でド汚い手段による「メタプログラミング」
899 :
デフォルトの名無しさん :2011/03/16(水) 18:04:19.45
>>> ['abc', 123, '456']
['abc', 123, '456']
型が違っててもリストにすることは可能だから
>>897 の説明は不適切
理解力ないやつには何言っても無駄
namedtupleの実装はないと思うわ 標準ライブラリって中身見ると吹くこと多すぎ
>>902 fnmatch.fnmatch()なんかも「正規表現へ変換してre.match()を呼ぶ」という
やっつけ仕事で、しかも「メタキャラクタをエスケープすることはできません」とか
コメントにしれっと書いてあったわ……。
>>894 ,896
動作を確認しました、セレクタについて調べてみます。ありがとうございました。
>>895 動作しました、ありがとうございます。
これは"temp"という同名の変数を再定義?したという理解でよいのでしょうか?
>>904 セレクタじゃなくてスライスだよ。
b がリストで、 a = b[:] とすると、 a は b と同一じゃなくて、
(浅い) コピーになる。
>>895 は変数を再定義したというよりは、新しい空のリストオブジェクトを
temp に代入した、と考えたほうがいい。
Python の変数は、値(オブジェクト)を格納するのではなく、値への参照を
格納していると考えたほうがいい。
>>905 丁寧に解答いただきありがとうございます。
>>906 チュートリアルはわからないときにつまむ程度でした…ご指摘の章を通読してみます。ありがとうございます。
>>907 それ学習の仕方が間違ってるよ。
チュートリアルってのは頭から尻尾まで一通り通読して、
できれば手を動かして実際にコードを動かしてみるものだ。
わからないときに見るのは「リファレンスマニュアル」。
>>908 ただ、Pythonのチュートリアルは詳しすぎる部分もあるからな。
特にクラス周り、これ本当にチュートリアルに書く内容か?って感じ
文字列がどのような文字コードであるか確認する方法ってありますか?
そりゃあるよw
>>910 「推測」はできるけど、プログラム的に「確認」するのは無理じゃないかな
エンコーディングが不明なバイト列の文字エンコーディングを推測するのに
よく使われるのは、Pythonだとたぶんこれ
http://chardet.feedparser.org/docs/ でもこれは、すごく遅いので、日本語だけでいいならgaucheのコードあたりを
Cythonでも使って移植したほうがいいんじゃないかという気がする
chardetはちなみにこんな風に使います
うちの環境では、この例でdetectに優に数秒はかかる
from contextlib import closing
import urllib2
from cStringIO import StringIO
from zipfile import ZipFile
import chardet
url = '
http://www.aozora.gr.jp/cards/000148/files/794_ruby_4237.zip '
with closing(ZipFile(StringIO(urllib2.urlopen(url).read()), 'r')) as zf:
data = zf.read(zf.namelist()[0])
print 'detecting char encoding...'
print chardet.detect(data)
>>910 いや、いい質問だ。
未知のバイト列(文字列)が何の文字コードか判定するのは非常に難しい。
ウェブブラウザやテキストエディタでは
それぞれ専用のプログラムが書かれている。
Unixではnkfで自動判定したりできるけど、結構ミスが多いようだ。
Pythonでなら何のライブラリでできるだろうね。
PyPIのchardetは古いので公式ページから取ってきてね
ローカルに落とせるなら、あらかじめ iconv で変換 utf-8で読めばええんとちゃうの? クロールする対象を、無差別にピックするケースに持ち込むより ある程度絞ったほうが精度・効率は良くなるような気が…
for co in ['utf-8', 'cp932', 'euc', 'ascii']: try: encode=str.decode(co) except: continue else: encode=u'不明'
文字コード判別は誤爆前提で考えた方がいいよ
組み込み関数dir()のdirって何の略ですか DIYやDRYならわかるのですが
directory
>>920 dirって言ってもdirectoryじゃないしなーとか思ってたけど
辞書で引いたら納得しました
どうもありがとう
パスワード生成プログラムを書いてみたのですがもっと良い書き方ありませんか? import random import string print('パスワードの長さ:', end = "") width = input() for i in range(int(width)): print(random.choice([ random.randint(0, 9), random.choice(string.ascii_lowercase), random.choice(string.ascii_uppercase)]), end = '')
>>922 string.digits を使って一貫性を持たせるぐらいかな
偏りを持たせているのは狙いでしょ?
random.choise(random.choice(string.digits), random.choice(string.ascii_letters)) でいいんじゃないのかな random.choice(string.digits + string.ascii_letters) と書くともっと短いけど、重みが変わってしまう 全体としては def genpass(width): return ''.join(random.choice(〜) for _ in range(width)) とかそんな感じ でも、厳しいとこだと数字、アルファべット大文字、小文字どれも入ってないと いけなかったりすると思うんで、もっと作り方工夫したほうがいいような気がする
925 :
924 :2011/03/20(日) 19:50:44.26
ごめん一行目random.choice()の中の[]がぬけてた
>>932 string.digitsのほうが綺麗ですね
ありがとうございます
>>924 確かに大文字小文字一緒にして数字と文字の確率を1/2にした方がいいですね
ありがとうございます
厳しいとこは・・・最初に数字、小文字、大文字を1つずつ出した後このプログラムでどうでしょうか?
だめですかね?w
927 :
924 :2011/03/20(日) 20:14:14.35
ああ、1行目でも重みは変わるんだな 馬鹿だ……
def genpass(size=8): nnum = random.randint(1,size - 2) nlow = random.randint(1,size - nnum - 1) nupp = size - nnum - nlow placement = list('n' * nnum + 'l' * nlow + 'u' * nupp) random.shuffle(placement) gen = dict(n=lambda: random.choice(string.digits), l=lambda: random.choice(string.ascii_lowercase), u=lambda: random.choice(string.ascii_uppercase)) return ''.join(gen[x]() for x in placement) どれも1文字は使うようにしてみたら、なんかすごい汚くなった
あれ・・lettersを使うと結構偏りが・・・
choice()の対象の要素数によってある程度乱数に寄りが出るとか?
(datetime型 , int型, str型) のようなタプルをリストに入れています。 これをdatetime型の降順で並べ替えにはどんな書き方になりますか?
>>931 ネストされたオブジェクトは、それぞれが比較されます。
例えば、
L1 = [1, ('a', 3)]
L2 = [1, ('a', 2)]
L1 < L2, L1 == L2, L1 > L2
=>(False, False, True)
この場合は先頭のオブジェクトから順に、
1と1を比較=>同じ=>'a'と'a'を比較=>同じ=>3と2を比較=>3の方が大きい
のような流れになります。
(datetime型, int型, str型)のようなシーケンスの場合、比較の順番は
datetime型=>int型=>str型となるので、
単純にlis.sort() あるいは sorted(lis)で大丈夫です。
更に言えば、datetimeの中では、
year=>month=>day=>hour=>minute=>second=>microsecondの順で比較されます。
同じ理屈でdatetimeもどきも簡単に作れます。
すまん、矢印が半角だった..orz
934 :
821 :2011/03/21(月) 16:42:59.62
>>776 ツール>オプション>IDEオプション>Special packagesに追加したらいけた
python2.xでUTF8にエンコードした文字を出力する方法は text = u"あいう" print text.decode("utf_8") ってやると思うんですが、これをpython3.xで書くとどうなりますか?
>>935 sys.stdoutにテキストを出力する際のエンコーディングをUTF-8に設定して
テキストを出力する場合は、
どこかで
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
のようにしておいて、あとは
print('あいう')
のようにするだけ
その例なら↑で十分だけど
本当にバイト列を出力したい場合には、sys.stdoutのかわりにsys.stdout.bufferを使う
ただしprint()関数はいずれにせよstrにフォーマットしてTextIOWrapperに
出力する関数なので、バイトI/Oの目的には使えないので
sys.stdout.buffer.write()を使うとよいです
この例だと、
sys.stdout.buffer.write('あいう'.encode('utf-8') + '\n' and None
でおおむね同じ結果になるでしょう
ごめん最後の行、色々ぬけてた sys.stdout.buffer.write('あいう'.encode('utf-8') + b'\n') and None
>>932 いい事言うなあお前。
みんなが頭じゃわかっててもなかなか実践できない事を口に出して言えるなんざ大変な自信だよ。
それで出来てなかったらあのインチキ占いのバアさんと一緒だぞお前。
そんなに当たり前の事を言いたかったら尼さんにでもなってから説教したらどうだ。
>>936 まさかここまでの詳細な解説付きのレスを頂けるとは、ありがとうございます。
>>931 datetimeオブジェクト同士は大小比較が可能なので、他の要素まで比較する必要があるならともかく
そうでなければdatetimeだけ比較すればいいんじゃないか?
lis.sort(key = lambda x: x[0], reversed = True)
日本の危機的状況に、よくpythonなんかやってられるな ニュースが気になってプログラミングできねえ
pythonやりたくても出来ない人のぶんまでやれ!
943 :
デフォルトの名無しさん :2011/03/25(金) 17:27:26.86
楽天のHPから一部分だけを抽出するプログラムを作ろうとしてるんだけど
エンコードの関係がよく分からなくて出力出来ない
ソース
# coding: utf-8
import urllib2
import lxml.html
url = "
http://ranking.rakuten.co.jp/ "
user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
req = urllib2.Request(url, None, {'User-Agent':user_agent})
res = urllib2.urlopen(req)
html = lxml.html.fromstring(res.read())
for elm in html.cssselect("#rnk_update"):
print elm.text_content()
エラーはこれ。
c:\Python27>python test.py
Traceback (most recent call last):
File "test.py", line 15, in <module>
print elm.text_content()
UnicodeEncodeError: 'cp932' codec can't encode character u'\xb7' in position 1:
illegal multibyte sequence
要はUnicodeな\xb7がcp932じゃ書き出せないよ。って言ってるんだろうけど、elm.text_content().encode('utf-8')でもダメだし分からない。
因みに同じプログラムでYahoo Japanなら行ける。Yahooはutf-8で楽天がeuc-jpだからだと思うんだけど、教えてください。
>>943 回避法だけ先に言うと、
print elm.text_content().encode(sys.stdout.encoding, 'xmlcharrefreplace')
とするといい
それはパースまではちゃんとできていて、単にコンソールへの印字に失敗してるだけ
lxmlは内部的にデータをunicodeの形で持っているので
elm.text_content()が返すのはunicodeの文字列
printはsys.stdout.encoding(その環境ではcp932)を使ってバイト列にエンコードして
出力しようとしているが、cp932に変換できない文字が含まれているので
エラーになっている
要注意なのは、仮にcharsetがShift_JISなソースであってもそれは起こりえるってこと
lxmlはたとえば のようなエンティティ参照をパース後にUnicode文字に
変換するので、そういうものがソースに含まれていれば、cp932には
変換できないことになる
946 :
デフォルトの名無しさん :2011/03/25(金) 19:21:08.56
>>945 >lxmlは内部的にデータをunicodeの形で持っているので
エラーは回避できました。stdoutのencodingに合わせるんですね。
でも数値文字参照にしかならないんでしょうか?
例えばさっきのソースで
out_f = open('test.dat', 'w')
html = lxml.html.fromstring(res.read())
for elm in html.cssselect("#rnk_update"):
out_f.write(elm.text_content().encode(sys.stdout.encoding, 'xmlcharrefreplace'))
out_f.close()
と変更しても当然数値文字参照になるだけで普通の文字として表われませんが、この辺りはどう考えればいいんでしょうか。
>>945 いろいろおかしい
>>> sys.stdout.encoding
'cp932'
>>> u'\xb7\xf6'.encode(sys.stdout.encoding, 'xmlcharrefreplace')
'·ö'
>>> print '\xb7\xf6'.decode('euc-jp')
喧
>>943 lxml.htmlが文字コードを認識していないみたいなのであらかじめdecodeして
Unicodeで渡すとうまくいくと思う
マグニチュードを計算するにはどうすれば良いですか?
>>947 encodeの出力はこれ
'·ö'
今日からpython始めましたが文字コード複雑ですね 既に心が折れそうです array = ["文字"] print array #=> ['\xe6\x96\x87\xe5\xad\x97'] こうなってしまうのですが、配列内に格納されたstr型の日本語をそのまま日本語で表示できないのでしょうか? print array[0] #=> ["文字] こちらは普通に表示されるので不思議に感じています
リストを表示させて文字がコードになるのは当たり前 どうしてもってなら "['%s']" % "', '".join(L)
cgiだけどここでいいのかな? python -m CGIHTTPServer でサーバを立てて import cgi cgi.test() でhtmlフォーム(method=text)の内容を確認したいんだけど フォームに日本語を入れると応答が無いのはなぜ? ちなみに半角だけなら動くんだ
>>952 サーバー側がエラー吐いてるんじゃないの。
コンソールかエラーログかを見ればわかるでしょ。
指定したディレクトリ直下のサブディレクトリだけを取得する for root, dirs, files in os.walk(foo_path): for _dir in dirs: print os.path.join(root, _dir) break こんな方法しか思いつかない俺に正しいやり方おしえてください
直下だけ?なら filter(os.path.isdir, os.listdir(foo_path)) でいいんじゃないか
>>956 filter(lambda e: os.path.isdir(os.path.join(foo_path, e)), os.listdir(foo_path))
こう書き直すと一応でるのですがこの理解でよろしいでしょうか?
>>957 ああごめん、カレントで試してた
それでいいんじゃないのかな
959 :
575 :2011/03/26(土) 23:49:05.95
pythonでGUIやるなら、おすすめはなに? Tkinter以外で
任意の文字コードの文字列をつくりたいときは u'文字列'.encode('任意の文字コード名') ってすればいいですか?
いちばん手っ取り早いのは wxPython
Pythonカプセル化しょぼすぎだろ
そう思ったらJavaでもC#でもつかっとき
どうせ手を入れたくなるし キモイ方法で無理矢理アクセスするよりマシだわ
965 :
デフォルトの名無しさん :2011/03/27(日) 20:09:48.24
余震怖い
init内で宣言した(protectedな感じの用途の)インスタンス変数にドキュメントを残したい そしてpydocで拾いたいんだけどどうやればいいの?ドキュメント読んでもわからない propertyがデフォでpubicであるとは、つまりオブジェクトのメンバが外部インターフェイス として公開されることを当然視した結果であり、したがってドキュメント可能かと思ったんだけど、 それは間違い?むしろメソッドだけが外部インターフェイスであって、メンバ変数などは 現実的にはアクセスし放題だけど、思想的には設計上外部から見えなくても問題ないように して絶対的に隠蔽しつくせってことなのかな?あるいは両者以外の考え方?
処理の途中に it = generator() for x in it: ____yield x があるんだけど、効率的に処理する方法ってない? (ジェネレータの内容をそのままyieldするみたいな) ↑だとyieldされたものがxに入ってさらにyieldするって感じで 冗長な感じがするんだ
>>966 属性には docstring が無い。普通は class の docstring に書く。
epydoc とか pydoc 意外のドキュメントツールを使う場合は、 #: とか
特殊なコメントを書ける。
>>967 今はそうするしかない。
Python 3.3 で実装されるかもしれない機能の筆頭になってる。
yield from x って書くようになる予定。
969 :
967 :2011/03/28(月) 01:24:38.53
リスト内に日本語が入ってるとprintした時にエンコードされて表示されちゃう件ですが、python3ではエンコードせずにそのまま表示してくれるそうです このprintの挙動だけpython2系で使えませんか?
>>970 文字列の概念自体が違ってるから、そのままでは無理なんじゃね?
1 2 3 を [1,2,3] という形にするにはどうしたらいいですか?
1 2 3 の意味をkwsk
縦に並んだ 1 2 3 が文字列に '1\n2\n3\n' という形で入ってるとしたら s = '1\n\2\n3\n' map(int, s.rstrip().split('\n'))
s.rstrip().split('\n') の部分は s.splitlines() でいけるよ。
Rubyではファイルの拡張子が簡単に取り出せるけど Python3.2で同じ事できないんですね やっぱりPythonは敷地が高い
1 2 3 のテレパシーを分かってくれてありがとうございます
>>975 ああそうだった。どうもです
>>976 >>> os.path.splitext('a/b/c/d.e.f')
('a/b/c/d.e', '.f')
Ruby の EOS みたいな機能はpython ではどうやって呼び出せますか?
EOSっていうかヒアドキュメントのことだったら ちょっと違うけどこれで >>> print '''1 ... 2 ... 3'''.splitlines() ['1', '2', '3']
これで解決しそうです ありがとうございます
C言語の「Hello, world.」で躓いてしまったのですが、 Python から勉強をはじめるのは厳しいでしょうか?
/* C言語 */ #include <stdio.h> int main(void) { printf("hello, world!\n"); return 0; } # Python2 print "hello, world!" 私があなたに勧める言語はPython なぜなら私もあなたもCで挫折した人生の敗北者だからです
HQ9+ H
985 :
966 :2011/03/28(月) 20:46:06.12
>>968 やっぱないのか、ありがとう
コメントもりもり書くわ
(format t "hello,world!~%")
class HQ9pParser(object): def __init__(self): self.accum = 0 def _H(self): print 'Hello, World!' def _Q(self): print self.src def _9(self): print '<dummy: 99 bottles of beer lyrics goes here>' def _plus(self): self.accum += 1 def parse(self, src): self.src = src for ch in self.src: if ch == '+': self._plus() else: exec('self._%s()' % ch) parser = HQ9pParser() parser.parse('HHQ+HQ++9') print parser.accum よし、これで漏れも言語実装者だ ちょっとコンパイラスレでぶいぶい言わせてくる
>>982 . .... ..: : :: :: ::: :::::: ::::::::::: * 。+ ゚ + ・
∧ ∧. _::::。・._、_ ゚ ・
/:彡ミ゛ヽ;)(m,_)‐-(<_,` )-、 * ←Pythonを勉強している人
/ :::/:: ヽ、ヽ、 ::iー-、 .i ゚ +
/ :::/;;: ヽ ヽ ::l ゝ ,n _i l
 ̄ ̄ ̄(_,ノ  ̄ ̄ ̄ヽ、_ノ ̄ ̄E_ )__ノ ̄
↑Cで挫折した人
次スレそろそろおながいします LLスレもレベル不足のせいか立てられず…
991 :
天ぷらのみ :2011/03/29(火) 14:04:54.18
次すれタイ「くだすれPython(超初心者用) その11」
うめ
うめ
うめ
うめ
Pythonおもろいなー
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。