くだすれPython(超初心者用) その39
■ このスレッドは過去ログ倉庫に格納されています
このスレッドは、他のスレッドでは書き込めない超低レベル、 もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。 へび使いが優しくコメントを返しますが、お礼は Python の布教と初心者の救済をお願いします。 エラーを解決したいときはエラー表示や環境(バージョン/IDE or command line)を略さずに書き込んで下さい。 騙りが頻発しています。質問する方は一時的なトリップをつけることを検討して下さい。 次スレは >>985 辺りで 前スレ くだすれPython(超初心者用) その38 https://mevius.5ch.net/test/read.cgi/tech/1526522954/ 『日経ソフトウェア2018年7月号』 「新連載 金融データをPythonで分析してみよう」p.050- のとおりにやってみてここまではうまく行ったのですが、 ここで >>> ts.RateBid.diff().round(3).sort_values().dropna().unique() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3/dist-packages/pandas/core/generic.py", line 1843, in __getattr__ (type(self).__name__, name)) AttributeError: 'Series' object has no attribute 'sort_values' 「Seriesオブジェクトはsort_valuesなんてアトリビュートを持ってないよ」 というエラーをPython3.4.2が吐き出しました。(´・ω・`) ただそれだけ。書いてみたかっただけです。それじゃまた。 >>4 日経ソフトウエアって読む価値ありますか?(゚Д゚)? 環境整えてみたんですが いざなにを作ればいいんですか? 日経ソフトウエアは、読む価値なし 日経Linux、WEB+DB、Software Design などは良い Ubuntu 18、UTF-8環境、Python 3.6.5です。 PHP(こっちもUTF-8)から引数を受け取ってPyhonで処理するプログラムを作っています。まずPHP側で $arg = '日本語1 日本語2'; $cmd = 'python3 python.py "'.$arg.'"'; exec($cmd, $output); とやって、python.pyで import sys a = sys.argv[1] b = a.split(' ') #listhoge{'日本語1': 0, '日本語2': 1,.....} c = listhoge[a[0]] で「日本語1は0」という結果を得たいのですが、 c = listhoge[a[0]]のところで KeyError: '\udce6\udc97\udca5\udce6\udc9c\udcac\udce8\udcaa\udc9e1' となってしまいます。 c = listhoge['日本語1'] なら、cは期待通り0が代入されます。 print(a) #日本語1 日本語2 print(a[0]) print(a[1]) #日本語1 #日本語2 で、引数自体は受け取れているようなのですが、 if a[0] == '日本語1': print('OK') else: print('NG') の結果は「NG」です。 listhogeに正しく値を渡すには、どうしたらよいでしょうか。ご教示よろしくお願いします。 >>9 a[0]は日でa[1]は本 if b[0] == "日本語1": にすればいい >>10 すみません!コードを抽象化するときに書き間違えました。 a[0].a[1]のところは、正しくはb[0].b[1]です。 せっかく教えていただいたのにすみません。 b[0]を日本語1と評価されるようにするにはどうしたらよいでしょうか。 >>11 日本語1の1が全角とか? b[0]の出力をそのまま b[0]== の後にコピペしてもfalseになるの? >>12 コピペで試しているので、文字列は同一だと思います。 今、試しにコマンドラインでスクリプトに引数を渡すと、コンソール上では期待通りの動作をしました。 PHPからだと、print出力的には同一に見えるけど別なデータになっているということでしょうか >>13 PHPから受け取ったのがstrじゃなくてbyte型なのかな?type()で調べてみたら? >>14 type(b[0]) だと何も返ってこないのですが、 type(b[0] is str) だとTrueが返って来ます >>15 すみません。これでいかがでしょうか。 PHP 7.2 $cmd = 'python3 python.py "日本語1 日本語2"'; exec($cmd, $output); Python 3.6.5 # coding: utf-8 import sys listhoge = {"日本語1":0, "日本語2":1} a = sys.argv[1] b = a.split(' ') c = listhoge[b[0]] error.log Traceback (most recent call last): File "python.py", line 23, in <module> c = listhoge[b[0]] KeyError: '\udce6\udc97\udca5\udce6\udc9c\udcac\udce8\udcaa\udc9e1' >>17 文字コード不一致してね? LANG=xxx python3 python.py "日本語1 日本語2" とかで、ロケール設定して実行してみたら? >>18 動きました! ありがとうございます! system localeはLANG=ja_JP.UTF-8だったので、そこは疑ってませんでした。 また今日も天才に救われた人が居るな、解決おめでとう! プログラム初学者ですが、入門書を買って勉強しております。 複合代入演算子の項を見ていたら1点疑問があり、 who = '猫' text = '' text += '吾輩は' text += who text += 'である。' print(text) これ本では2行目の''が大事だと書かれているんですが、省略して who = '猫' text = '吾輩は' text += who text += 'である。' print(text) とするのはだめなのでしょうか? 初歩的な質問ですみません。 >>21 text += 'XXX' で形が揃うから見やすいとかコピペや順序入れ替えが楽って以外の意味はないと思う というか理由が書いてないならあまり良くない入門書だな 3.6以降ならf-stringを使って text = f'我輩は{who}である' のほうが良さげ https://atsuoishimoto.hatenablog.com/entry/2016/12/25/122220 >>22 ありがとうございました。URL参考になりました。 入門書はいろいろ調べてみたんですけどやはり周りに修学者がいないと選びにくいですね。 みんなのpythonって本はプログラム知識が殆ど無い入門者にお勧めできますか? 本屋で立ち読みしようと思ったんですけど無くて、アマゾンで調べたら評価はまちまちみたいで… この2冊は、既にプログラミングが出来る人向け。 数言語は知っていて、Ruby, Python を学ぶ人向け たのしいRuby 第5版、2016 みんなのPython 第4版、2017 以下の本は、プログラミング初心者でも読める。 スッキリわかる Java入門 第2版、2014 知らないけど、progate のサイトで勉強すれば? >>21 同じように動くという意味では問題無い。 著者としては空の変数を定義することで 変数の宣言と値の代入を分離したかったんじゃないかな? pythonでは変数を明示的に宣言だけすることはできないから、 >>24 合うか合わないかは人によるから kindleでお試し読んでみたら >>25 スッキリわかるjavaはやりました なのでその次に読む本として選んでみました。大丈夫そうですか? 簡単だと良いんですが 読む順番としては、先に「たのしいRuby」を3回読むと、 「みんなのPython」が楽に読める 「みんなのPython」を先に読むと、内容が薄くて、現実味が無いかも。 つまり、よくわからない たのしいの方が、正規表現とか、内容が濃い >>29 そうなんですね。みんなのpythonの方が表紙にでっかく絵が書いてあったり 堅苦しい内容じゃなさそうで入門向けで良いのかなって思ったんですが内容ないんですね… わかりました。たのしいruby買います。アドバイスありがとうございます >>30 そいつは有名なruby荒らしだぞ。 python勉強するのになんでruby本読む必要があるんだよ。よく考えろ 脈略のないrubyコードの貼り付け、ruby本の紹介は禁止ってテンプレに入れておいてくれ Ruby, Python, JavaScript というのは、単なる各言語の文法書。 プログラミングの本じゃない オブジェクト指向・クロージャ・スコープ・this などの概念を、学べるわけではない。 文法書を読んでも、プログラミングは出来ない 文法書を読むとプログラミングができると、ほとんどの奴は勘違いしているけど、 「みんなのPython」を読んでも文法がわかるだけで、プログラミングが出来るようにはならない 「たのしいRuby」「スッキリわかる Java入門」などを読んで、 自分でクラスを派生させたり、CSVファイルを読み書きしたり、 Sinatra をいじくりまわしたり悪戦苦闘しながら、プログラミングを学ぶ プログラミングを学ぶ部分は、Pythonじゃなくてもよい。 いじくりまわすのには、Rubyが最も簡単 プログラミングを学ぶには、各言語の「Effective 何々」という本を読む。 これは、プロの必須本。 文法書の次のレベルへ行かないと、プログラミング自体を学べない Rubyは衰退していくだけのオワコン言語だから手を出したら負け組だよ スクリプトのやり方教えて下さい 認識できないって出るんですけど… >>24 プログラミング未経験でオライリーの入門Pythonを買ってがんばってる 今のところついていけてるけど、 みんなのPythonはきっとイラストや絵が入ってて紙面もカラーなんだろうなって考えるとうらやましい こっちは絵もイラストも全くないです 早速躓いた >>26 変数 と 値の代入 ってとうちがうんですか? プログラミング自体を学ぶのにこれはどうですか? 初めてのプログラミング https://www.oreilly.co.jp/books/9784873114699/ PythonじゃなくてRubyで説明されてるみたいなんですけど 与えられた2つの数値から、最小公倍数・最大公約数を求めてみろ >>41 pythonなら「独学プログラマーーpython」がある。 スタートブックとかの方が分かりやすいんじゃないの? プログラム初心者なら subprocessについてなんですが、 #!/usr/bin/env python # -*- coding: UTF-8 -*- import sys import subprocess dl = subprocess.run(["radigo", "rec", "-a=JP13", "-id=QRR", "-s=20180827200000"], stdout=subprocess.PIPE) sys.stdout.buffer.write(dl.stdout) 上記のような場合、変数を引数の一部として渡すにはどうやるんですか? 以下だと{proglamId}という文字列として外部コマンドに送られてしまってダメでした。 area = 'JP13' ch = 'QRR' proglamId = '20180827200000' dl = subprocess.run(["radigo", "rec", "-a={area}", "-id={ch}", "-s={proglamId}"], stdout=subprocess.PIPE) sys.stdout.buffer.write(dl.stdout) >>46 >>> proglamId = '20180827200000' >>> f'-s={proglamId}' '-s=20180827200000' >>47 どうもありがとうございます。 2行目はfフォーマットって言うんですかね?それを使っていると思うんですが、46のsubprocessの中ではどう書くんでしょうか? >>48 出来ました。 パターン1 area = 'JP13' ch = 'QRR' proglamId = '20180827200000' dl = subprocess.run(["radigo", "rec", f'-a={area}', f'-id={ch}', f'-s={proglamId}'], stdout=subprocess.PIPE) パターン2 area = 'JP13' area = f'-a={area}' ch = 'QRR' ch = f'-id={ch}' proglamId = '20180827200000' proglamId = f'-s={proglamId}' dl = subprocess.run(["radigo", "rec", area, ch, proglamId], stdout=subprocess.PIPE) sys.stdout.buffer.write(dl.stdout) どっちがスマートな書き方ですか? muxx = subprocess.run(["muxer", f'-i input.aac?sbr', f'-o output.m4a', f'--optimize-pd', f'--file-format m4a'], stdout=subprocess.PIPE) sys.stdout.buffer.write(muxx.stdout) とやると、muxerコマンドからは Error: you specified invalid option: -i input.aac?sbr. と返ってきてしまいます。 muxx = subprocess.run(["muxer", "-i input.aac?sbr", "-o output.m4a", "--optimize-pd", "--file-format m4a"], stdout=subprocess.PIPE) sys.stdout.buffer.write(muxx.stdout) これでも上記と同じエラーになり、 muxx = subprocess.run([f'muxer -i input.aac?sbr -o output.m4a --optimize-pd --file-format m4a'], stdout=subprocess.PIPE) sys.stdout.buffer.write(muxx.stdout) これだとPythonがエラーになってしまいました。 Usageは muxer [global_options] -i input1 [-i input2 -i input3 ...] -o output です。 コンソールで以下のようにやると正常に動いてくれます。 $ muxer -i input.aac?sbr -o output.m4a --optimize-pd --file-format m4a 何がいけないんでしょうか? 端末で入力すると、シェルが、? の機能を動かすけど、 subprocess で、プロセスを直接起動すると、 シェルが介入しないから、? が展開されないとか? >>51 ?sbrの部分を省いてもエラーは改善しなかったです shell=true とかは? と muxer なんて知らないくせに適当に言ってみる ん? その前に stdout=subprocess.PIPE) sys.stdout.buffer.write(muxx.stdout) の部分って必要なの? >>50 もちろんrunの第一引数が悪い "-i"と"input.aac"を分けろ >>50 上2つは "-i input.aac?sbr" がオプションとして認識されてそう。'-i', f'input.aac?sbr' とかで分けてくれ 3つ目は shell=True で動く(/bin/sh -c 'muxer ....' と展開される) シェルインジェクションとかあるので、お作法として shell=True はあまり使わないほうがいいかな 詳しくはマニュアル参照 >>49 書き方は好みだからなんとも言えんなー俺ならこんな感じで書く arg = 'hoge' cmd = f'bash tst_cmd.sh {arg}' resp = subprocess.run(cmd.split(), stdout=subprocess.PIPE) スペース入りファイル名とか使うなら、パーサー作って食わすかな import csv def CMD_PARSER(cmd): ....return list(csv.reader([cmd], delimiter=' ', quotechar='"'))[0] arg = 'hoge foo' cmd = f'bash tst_cmd.sh "{arg}"' resp = subprocess.run(CMD_PARSER(cmd), stdout=subprocess.PIPE) 空白が混じってると > 一般に、引数のシーケンスを渡す方が望ましいです。なぜなら、モジュールが必要な引数のエスケープやクオート > (例えばファイル名中のスペースを許すこと) の面倒を見ることができるためです によってエスケープされるので意図通りにシステムコールに渡らないわけだな みなさんどうもありがとうございます >>55 >>56 >>57 「-i ファイル名」の形式で書かないといけないので「-i」と「ファイル名」で分けて書くという頭が全くなかったです。 muxx = subprocess.run(["muxer", "-i", "input.aac?sbr", "-o", "output.m4a", "--optimize-pd", "--file-format", "m4a"], stdout=subprocess.PIPE) と分けて書くとうまくいきました。 >>53 >>56 shell=trueについて調べてみます >>54 この書き方だとsubprocess.callとsubprocess.check_callとsubprocess.check_outputの3つがまとめて出来るらしいのでこれで書きました find関数で line.find('a')だと部分一致で返してくれるんですが c=input() aと入力して line.find(c)とすると完全一致でしか返してくれないんですがどうすればいいですか xmlの属性を指定する場合、以下のどっちも同じ答えを返してくれるんですが、どっちで書くのがいいんでしょうか? パターン1 duration1 = int(root.attrib["dur"]) print(duration1) パターン2 duration2 = int(root.get("dur")) print(duration2) BeautifulSoup前提で喋ってます? もしそうなら、属性が存在する限りどちらでもよい getは属性が存在しないときNoneを返すが、attribはそうではない まあ試してみ >>64 どうもありがとうございます xml.etree.ElementTreeです たしかに存在しない場合の挙動は違ってました すいません日付の計算で疑問なんですが、 aaa_date_str = '2018-08-29 20:00:00' bbb_date_str = '2018-08-29 19:00:00' aaa_date = datetime.datetime.strptime(aaa_date_str, '%Y-%m-%d %H:%M:%S') bbb_date = datetime.datetime.strptime(bbb_date_str, '%Y-%m-%d %H:%M:%S') として、 date_diff = aaa_date - bbb_date print(date_diff.days) --> 0 になりますが、逆にすると、 date_diff = bbb_date - aaa_date print(date_diff.days) --> -1 になります。 差異が1日に満たなければゼロになるのかと思いきや 計算結果が負だとゼロにならずに-1になるのがなんか疑問です。 それとも記述に問題あるでしょうか。 >>66 3.0-3.1=-0.1だろう?0じゃないだろう? そういうこった int()とかと一緒か [0.5]=0 [-0.5]=-1 >>67 すいません、分からず… 逆に、3.1 - 3.0 = 0.1 はdaysだと0になるんです。 >>68 int()だと、正も負も小数点以下切り捨てではないですか? >>69 68が言ってるようにたぶん四捨五入なんだず おっと 1時間でも -1ってでるのか じゃあ 時間は切り捨てじゃなくて四捨五入でもなくて切り上げになってんだ おっと おれのうしろで おれのいもうとが 「そのマイナス1はエラー値であって 数値じゃない diff.daysはぬるぽしない」 といっている それから なぜ print(date_diff)してみないんだ ともいっている おれは aaa_date + date_diff をためしてみてから、 timedeltaについての説明を読みに行くことを最終的におすすぬする。 別マシンで書いたスクリプトを動かそうとしたら dateutilが無いと言われ実行出来ません。 スクリプトにはこう書きました。 from dateutil.relativedelta import relativedelta 動いたマシンのPythonのバージョンは3.6.4、 動かないマシンのPythonのバージョンは3.6.5です。 dateutilはどこで入手するんでしょうか? すみません pip で dateutilsを入れたら使えました。 python 3.6 windows10 import pyautogui pyautogui.rightClick(100,100) pyautogui.moveRel(10,10) と書くと右クリックのあとマウスが動いてくれない。 これはライブラリのバグ? Dropboxの共有リンクを取得したいです。 dropbox.Dropbox(トークン).sharing_create_shared_link を使うと、例えば PathLinkMetadata(url='https://db.tt/xxxxxxx', visibility=Visibility('public', None), path='/hoge/hage.jpg', expires=None) こういう1行が出力されます。 sharing_create_shared_link以外の関数で、 https://db.tt/xxxxxxx だけを出力する関数ってありますか? 続く sharing_create_shared_linkだと、以下のようになります。 import dropbox dbxTOKEN = 'DROPBOX_MY_ACCESS_TOKEN' dbxRemotePath = f'/aiueo/hage.jpg' dbx = dropbox.Dropbox(dbxTOKEN) dbx.users_get_current_account() # アップロード f = open(dbxLocalPath, 'rb') dbx.files_upload(f.read(),dbxRemotePath) f.close() # 共有リンクの取得 dbxLink = dbx.sharing_create_shared_link(dbxRemotePath,short_url=True) # Dropbox から共有リンクを取得 dbxLink = str(dbxLink)[17:-1] # 整形 「PathLinkMetadata(」と「)」を除外 dbxLink = dbxLink.split(',') # リストに変換 dbxLink = dbxLink[0] # リストの1番目 (url) dbxLink = str(dbxLink)[5:-1] # 整形 print(dbxLink) https://db.tt/xxxxxxx # プリントされたurl つづく 文字列を分割してその中の一部を取り出す方法ですが、 PathLinkMetadata(url='https://db.tt/xxxxxxx', visibility=Visibility('public', None), path='/hoge/hage.jpg', expires=None) こういう1行があったとして、 url='https://db.tt/xxxxxxx', visibility=Visibility('public', None), path='/hoge/hage.jpg', expires=None こんなふうに分割したいです。 split(',')でやるとpublic', Noneここのコンマでも反応してしまいます。 今回はurlの取得が目的なので今の所実害は無いんですが、もっと簡単にdorpboxの共有リンクを取得したり確実な文字列の分割方法を知りたいです。 >>82 ずいぶん遠回りしてるけど、 a=dropbox.Dropbox(トークン).sharing_create_shared_link として、 a.url を参照すれば良いのでは? 他についても a.path とかで参照できるはず すいません、ハマって困っています。 utf-8のテキストファイル(内容は'1'という文字のみ)を、python3の以下のスクリプトで 読み込んで、整数に変換しようとすると、以下のエラーが出て困っています。 Traceback (most recent call last): File "collect_progress.py", line 75, in <module> num = int(str) ValueError: invalid literal for int() with base 10: '\ufeff1' ユニコードの文字列は整数変換できないのでしょうか。 fr = open("sample.txt") str = fr.readline() num = int(str) echo 1 | ruby -e 'STDIN.each { |line| puts(line.to_i + 1) }' Ruby なら、シェルから、1-liner で、2 と出力される Python でも同じように、1-liner でやってみれば? >>84 open("sample.txt", encoding="utf-8-sig") > いくつかの領域では、UTF-8 でエンコードされたファイルの先頭に "BOM" を利用する習慣があります; 中略 > もし、そのようなファイルを読む場合には、この印を自動的にスキップするために 'utf-8-sig' コーデックを利用してください。 https://docs.python.org/ja/3/howto/unicode.html#reading-and-writing-unicode-data プログラムでは、BOMなしUTF-8 (UTF-8N)を使った方が無難 その代わり、Windows のExplorer ではテキスト検索できなくなるから、 Windows10・WSL・Ubuntu から、grep してる >>83 どうもありがとうございます! .urlなどで簡単に取り出せました。 これはdropboxのライブラリの機能でしょうか? >>85 , 86, 87, 88 ありがとうございます。 BOMが原因でした。 恥ずかしいことに、BOMというのは全く知りませんでした。 助かりました。 >>89 まあそうだと思う。 自分はDropboxライブラリを使ったことはないけど、>>80 を見ると戻り値としてPathLinkMetadataオブジェクトが返ってきていて、属性としてurlとかpathとかがある事がわかった(これはpython的に考えればわかる) 使うメソッドとかについてはドキュメント読むと今回みたいなことはすぐ分かるだろうし、勉強にもなるよ >>91 .sharing_create_shared_linkはドキュメントの中で見つけた関数なんですが、英語分からないから試行錯誤していました ありがとうございます Python初心者(プログラミング初心者)です。 スクレイピングをしようとしていたら躓いてしまったので質問をさせてください。 requestsで変数htmlに入れたサイトのhtmlをファイルに保存したいのですが良く分かりませんでした。 file.writeみたいなのも書いてみてるんですがエラー吐かれたりします。誰か例として作ってくれませんか? requests.getで変数htmlに取得したサイトhtmlをc:/user/hoge/Documents/hymlfile.htmlに追記モードで保存したいです。 無能でごめんなさい助けてください。 File.open(file_path, 'a') { |io| io.write text } Ruby では、File.open の引数に、 ファイルパスと、ファイルを開く際の、mode を渡す a なら追記書き込み 「python file write」で検索! import requests r = requests.get("https://www.python.org" ;) f = open("c:/user/hoge/Documents/hymlfile.html", "a") f.write(r.text) >>95 てゃんks 無事解決しました本当にありがとう やっと眠れtる f.write(r.text) UnicodeEncodeError: 'cp932' codec can't encode character '\U0001f5a5' in position 12657: illegal multibyte sequence スクレイピングしたサイトに絵文字があると(?)このエラーが起こるようです。 エンコーディングの関係だと思うんですけど対処法分かる方いますか? UnicodeEncodeErrorで調べたら解説しているところが少し見つかったんですが僕には何が言いたいのかさっぱりでした。。。。 f.openの時にencoding='utf-8'渡したら解決しました!! うれしい!!!ありがとう cp932 はやめて、BOMなしUTF-8(UTF-8N)で書き込めば? それか、エンコード変換できない文字は、 エラーにせずに、? に置き換えるとか ElementTree、lxml、BeautifulSoupってそれぞれどう違うの? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる