くだすれPython(超初心者用) その39

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/08/24(金) 07:50:35.97ID:VD4/++xS
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
へび使いが優しくコメントを返しますが、お礼は Python の布教と初心者の救済をお願いします。

エラーを解決したいときはエラー表示や環境(バージョン/IDE or command line)を略さずに書き込んで下さい。
騙りが頻発しています。質問する方は一時的なトリップをつけることを検討して下さい。
次スレは >>985 辺りで

前スレ
くだすれPython(超初心者用) その38
https://mevius.5ch.net/test/read.cgi/tech/1526522954/
2デフォルトの名無しさん
垢版 |
2018/08/24(金) 07:50:54.90ID:VD4/++xS
◆関連リンク Python の Home Page
http://www.python.org/

◆長いコードはこういうところにはってください
http://ideone.com/
http://codepad.org/
http://pastebin.com/
http://dpaste.com/
https://try.jupyter.org/

◆まとめwiki
http://python.rdy.jp/
3デフォルトの名無しさん
垢版 |
2018/08/24(金) 11:55:16.20ID:ZVlysGry
ストロー廃止
2018/08/24(金) 16:34:04.92ID:RSpOEB9t
『日経ソフトウェア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が吐き出しました。(´・ω・`)
ただそれだけ。書いてみたかっただけです。それじゃまた。
2018/08/24(金) 16:59:48.14ID:O0T9h+Ku
>>4
日経ソフトウエアって読む価値ありますか?(゚Д゚)?
6デフォルトの名無しさん
垢版 |
2018/08/24(金) 22:42:39.09ID:J2z8mB41
環境整えてみたんですが
いざなにを作ればいいんですか?
2018/08/24(金) 22:55:45.28ID:A0MvxlLt
自分探しの旅みてーな疑問だな
2018/08/25(土) 04:28:11.12ID:gxBSyOuw
日経ソフトウエアは、読む価値なし

日経Linux、WEB+DB、Software Design などは良い
2018/08/25(土) 10:02:26.96ID:H9tlLYtz
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に正しく値を渡すには、どうしたらよいでしょうか。ご教示よろしくお願いします。
2018/08/25(土) 10:17:20.53ID:5go0Mg15
>>9
a[0]は日でa[1]は本
if b[0] == "日本語1":
にすればいい
2018/08/25(土) 10:38:37.45ID:H9tlLYtz
>>10
すみません!コードを抽象化するときに書き間違えました。
a[0].a[1]のところは、正しくはb[0].b[1]です。
せっかく教えていただいたのにすみません。
b[0]を日本語1と評価されるようにするにはどうしたらよいでしょうか。
2018/08/25(土) 10:53:10.81ID:5go0Mg15
>>11
日本語1の1が全角とか?

b[0]の出力をそのまま
b[0]== の後にコピペしてもfalseになるの?
2018/08/25(土) 11:10:46.62ID:H9tlLYtz
>>12
コピペで試しているので、文字列は同一だと思います。
今、試しにコマンドラインでスクリプトに引数を渡すと、コンソール上では期待通りの動作をしました。
PHPからだと、print出力的には同一に見えるけど別なデータになっているということでしょうか
2018/08/25(土) 11:31:58.85ID:5go0Mg15
>>13
PHPから受け取ったのがstrじゃなくてbyte型なのかな?type()で調べてみたら?
2018/08/25(土) 11:46:56.88ID:kfh++Yrt
必要なとこだけコピペで貼ってくれ
2018/08/25(土) 11:50:43.54ID:H9tlLYtz
>>14
type(b[0])
だと何も返ってこないのですが、
type(b[0] is str)
だとTrueが返って来ます
2018/08/25(土) 13:02:46.63ID:H9tlLYtz
>>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'
2018/08/25(土) 14:30:45.41ID:kfh++Yrt
>>17
文字コード不一致してね?

LANG=xxx python3 python.py "日本語1 日本語2"
とかで、ロケール設定して実行してみたら?
2018/08/25(土) 14:50:58.87ID:H9tlLYtz
>>18
動きました! ありがとうございます!
system localeはLANG=ja_JP.UTF-8だったので、そこは疑ってませんでした。
2018/08/25(土) 18:14:21.70ID:P/kKO950
また今日も天才に救われた人が居るな、解決おめでとう!
2018/08/26(日) 01:55:23.42ID:TJFxEnkY
プログラム初学者ですが、入門書を買って勉強しております。
複合代入演算子の項を見ていたら1点疑問があり、

who = '猫'
text = ''
text += '吾輩は'
text += who
text += 'である。'
print(text)

これ本では2行目の''が大事だと書かれているんですが、省略して


who = '猫'
text = '吾輩は'
text += who
text += 'である。'
print(text)

とするのはだめなのでしょうか?
初歩的な質問ですみません。
22デフォルトの名無しさん
垢版 |
2018/08/26(日) 02:11:05.36ID:xGLfO5+N
>>21
text += 'XXX'
で形が揃うから見やすいとかコピペや順序入れ替えが楽って以外の意味はないと思う
というか理由が書いてないならあまり良くない入門書だな

3.6以降ならf-stringを使って
text = f'我輩は{who}である'
のほうが良さげ
https://atsuoishimoto.hatenablog.com/entry/2016/12/25/122220
2018/08/26(日) 02:24:57.28ID:TJFxEnkY
>>22
ありがとうございました。URL参考になりました。
入門書はいろいろ調べてみたんですけどやはり周りに修学者がいないと選びにくいですね。
2018/08/26(日) 04:17:09.95ID:L324XJEs
みんなのpythonって本はプログラム知識が殆ど無い入門者にお勧めできますか?
本屋で立ち読みしようと思ったんですけど無くて、アマゾンで調べたら評価はまちまちみたいで…
2018/08/26(日) 07:36:47.56ID:w0D5YFHr
この2冊は、既にプログラミングが出来る人向け。
数言語は知っていて、Ruby, Python を学ぶ人向け

たのしいRuby 第5版、2016
みんなのPython 第4版、2017

以下の本は、プログラミング初心者でも読める。
スッキリわかる Java入門 第2版、2014

知らないけど、progate のサイトで勉強すれば?
2018/08/26(日) 07:44:31.55ID:KclbjBGL
>>21
同じように動くという意味では問題無い。


著者としては空の変数を定義することで
変数の宣言と値の代入を分離したかったんじゃないかな?
pythonでは変数を明示的に宣言だけすることはできないから、
2018/08/26(日) 07:49:32.68ID:KclbjBGL
>>24
合うか合わないかは人によるから
kindleでお試し読んでみたら
2018/08/26(日) 07:58:14.06ID:L324XJEs
>>25
スッキリわかるjavaはやりました
なのでその次に読む本として選んでみました。大丈夫そうですか?
簡単だと良いんですが
2925
垢版 |
2018/08/26(日) 09:57:49.56ID:w0D5YFHr
読む順番としては、先に「たのしいRuby」を3回読むと、
「みんなのPython」が楽に読める

「みんなのPython」を先に読むと、内容が薄くて、現実味が無いかも。
つまり、よくわからない

たのしいの方が、正規表現とか、内容が濃い
2018/08/26(日) 10:32:43.51ID:L324XJEs
>>29
そうなんですね。みんなのpythonの方が表紙にでっかく絵が書いてあったり
堅苦しい内容じゃなさそうで入門向けで良いのかなって思ったんですが内容ないんですね…
わかりました。たのしいruby買います。アドバイスありがとうございます
2018/08/26(日) 12:18:03.60ID:Y1vMA8RK
>>30
そいつは有名なruby荒らしだぞ。
python勉強するのになんでruby本読む必要があるんだよ。よく考えろ
2018/08/26(日) 17:39:56.34ID:O9adGcKd
もうrubyをNGしてもいいぐらい
2018/08/26(日) 18:15:35.15ID:wR7TFJf0
ガイジに優しくしよう
2018/08/26(日) 19:59:11.67ID:7VGl0ROF
脈略のないrubyコードの貼り付け、ruby本の紹介は禁止ってテンプレに入れておいてくれ
3525
垢版 |
2018/08/26(日) 23:41:34.26ID:w0D5YFHr
Ruby, Python, JavaScript というのは、単なる各言語の文法書。
プログラミングの本じゃない

オブジェクト指向・クロージャ・スコープ・this などの概念を、学べるわけではない。
文法書を読んでも、プログラミングは出来ない

文法書を読むとプログラミングができると、ほとんどの奴は勘違いしているけど、
「みんなのPython」を読んでも文法がわかるだけで、プログラミングが出来るようにはならない

「たのしいRuby」「スッキリわかる Java入門」などを読んで、
自分でクラスを派生させたり、CSVファイルを読み書きしたり、
Sinatra をいじくりまわしたり悪戦苦闘しながら、プログラミングを学ぶ

プログラミングを学ぶ部分は、Pythonじゃなくてもよい。
いじくりまわすのには、Rubyが最も簡単

プログラミングを学ぶには、各言語の「Effective 何々」という本を読む。
これは、プロの必須本。
文法書の次のレベルへ行かないと、プログラミング自体を学べない
2018/08/27(月) 00:26:43.00ID:lvpUeXXJ
Rubyは衰退していくだけのオワコン言語だから手を出したら負け組だよ
2018/08/27(月) 00:53:03.94ID:HhBAi2Wr
Rubyみたいなオワコン言語の話は余所でやれ
2018/08/27(月) 02:33:22.67ID:+WOcodwf
スクリプトのやり方教えて下さい
認識できないって出るんですけど…
2018/08/27(月) 03:15:17.22ID:yTR9Y+Mn
>>24
プログラミング未経験でオライリーの入門Pythonを買ってがんばってる
今のところついていけてるけど、
みんなのPythonはきっとイラストや絵が入ってて紙面もカラーなんだろうなって考えるとうらやましい
こっちは絵もイラストも全くないです
2018/08/27(月) 03:17:20.38ID:yTR9Y+Mn
早速躓いた

>>26
変数

値の代入
ってとうちがうんですか?
2018/08/27(月) 03:21:04.08ID:yTR9Y+Mn
プログラミング自体を学ぶのにこれはどうですか?

初めてのプログラミング
https://www.oreilly.co.jp/books/9784873114699/

PythonじゃなくてRubyで説明されてるみたいなんですけど
2018/08/27(月) 06:12:09.02ID:ba8BcfX3
与えられた2つの数値から、最小公倍数・最大公約数を求めてみろ
43デフォルトの名無しさん
垢版 |
2018/08/27(月) 07:06:23.18ID:A3+vkFVR
>>41
pythonなら「独学プログラマーーpython」がある。
2018/08/27(月) 07:25:20.50ID:fqwvA6xk
スタートブックとかの方が分かりやすいんじゃないの?
プログラム初心者なら
45デフォルトの名無しさん
垢版 |
2018/08/27(月) 12:18:58.34ID:Q4eMB8Ps
>>42
互除法
2018/08/27(月) 21:06:47.86ID:KW/ftoFq
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)
47デフォルトの名無しさん
垢版 |
2018/08/27(月) 21:26:41.39ID:6eK9kwOU
>>46

>>> proglamId = '20180827200000'
>>> f'-s={proglamId}'
'-s=20180827200000'
2018/08/27(月) 21:33:33.15ID:KW/ftoFq
>>47
どうもありがとうございます。
2行目はfフォーマットって言うんですかね?それを使っていると思うんですが、46のsubprocessの中ではどう書くんでしょうか?
2018/08/27(月) 21:56:03.71ID:KW/ftoFq
>>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)

どっちがスマートな書き方ですか?
2018/08/27(月) 23:29:37.66ID:KW/ftoFq
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
何がいけないんでしょうか?
2018/08/28(火) 00:20:33.07ID:TEJeUOom
端末で入力すると、シェルが、? の機能を動かすけど、

subprocess で、プロセスを直接起動すると、
シェルが介入しないから、? が展開されないとか?
2018/08/28(火) 00:26:18.50ID:wjmNvrcp
>>51
?sbrの部分を省いてもエラーは改善しなかったです
2018/08/28(火) 05:00:41.28ID:PEha72vP
shell=true
とかは? と muxer なんて知らないくせに適当に言ってみる
2018/08/28(火) 05:07:01.91ID:PEha72vP
ん?
その前に
stdout=subprocess.PIPE)
sys.stdout.buffer.write(muxx.stdout)
の部分って必要なの?
2018/08/28(火) 08:35:42.53ID:M3D05fOs
>>50
もちろんrunの第一引数が悪い
"-i"と"input.aac"を分けろ
2018/08/28(火) 08:36:39.19ID:skYXWt6l
>>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)
■ このスレッドは過去ログ倉庫に格納されています