Pythonのお勉強 Part66

■ このスレッドは過去ログ倉庫に格納されています
2021/11/12(金) 07:48:11.11ID:vp8lzav70
!extend:default:vvvvv:1000:1024
!extend:default:vvvvv:1000:1024
↑スレ立てる毎に減るので、減ってたら3つに補充すること。

・当スレにRubyのソースコード類を書くことを禁ず
・Ruby等、Pythonではないプログラミング言語での回答類・質問を書くのも禁止
・「Ruby では」「Rubyでは」「Rails」正規表現→「^クソチョンw$」をNGワード登録推奨
・エラーを解決したいときは、かならず
 エラー文(勝手に省略orスクショうp等の横着禁止)と
 おま環(Pythonのバージョン番号+OS名とバージョン+IDE名)を書け。

★Pythonのソースコードを5ちゃんに直貼はインデントが崩壊するので、
  ↓等のコードうp用サイトに貼ってきてくだしあ。(スクリーンショットをうpる「横着」禁止)
ttps://techiedelight.com/compiler/  Run Code機能あり。
ttp://ideone.com/      デフォ設定がCなので、Pythonするには言語種選択ボタン押下がピコ手間かも。
ttp://codepad.org/      ほぼ直感的に使える。Run codeボタンあり。
ttp://pastebin.com/     まずまずシンプル。
ttp://dpaste.com/      とてもシンプル。消えるまでの日数は十分長ーく指定のこと。

◇Pythonオフィシャルサイト http://www.python.org/
◇まとめwiki ttp://python.rdy.jp/

●関連スレ● 自称初心者は↓へ
【まず1嫁】くだすれPython(超初心者用) その55
https://mevius.5ch.net/test/read.cgi/tech/1633070807/

〇前スレ〇
Pythonのお勉強 Part65
https://mevius.5ch.net/test/read.cgi/tech/1621749112/

次スレの建立は>>985が挑戦する。(980通過して24h後も落ちなくなった)
VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured
2021/12/06(月) 23:02:13.62ID:KAUrNTmh0
streamlinkはpythonで書かれてるのに、
pythonからの使い方が判らないので、subprocessでpython呼び出してる
2021/12/06(月) 23:06:57.52ID:+xtv5Wsa0
Pythonでやるからややこしい
1,2はfind
3,4,5はxargs + sh(cd, mkdir)
でできる内容

Pythonでやるのがお題ならごめん
2021/12/06(月) 23:16:45.17ID:fIaDMlsG0
>>331
バッチでってことですか?
FFMPEGがワイルドカード対応してなくて無理でした
333デフォルトの名無しさん (ワッチョイ f2da-m+op)
垢版 |
2021/12/06(月) 23:24:01.09ID:uKiaXwwm0
シェルの方が早そうだね
334デフォルトの名無しさん (ワッチョイ 0333-Z6Z9)
垢版 |
2021/12/06(月) 23:29:51.84ID:rLSBlzT30
>>329
>1.ファイルの入ったフォルダをコマンドライン引数1に設定する
>2.フォルダ内から特定の拡張子かつ一定以上のファイルサイズのものを抽出する
>5.フォルダは4の指定ディレクトリ内にファイル名で新規作成する
2と5の間はとりあえずスキップして、ここだけの実装は可能?
2021/12/06(月) 23:31:26.15ID:fIaDMlsG0
>>334
2の途中で詰まりました
抽出したファイルの扱い方がわからなく・・・
2021/12/06(月) 23:49:14.76ID:R0qeSVmL0
配列に入れればいいだけじゃね
2021/12/07(火) 00:14:41.57ID:ebSZa7bB0
>>332
バッチてことはWin環境なんかな
Pythonで解決した後でもいいからPowerShellもしらべてみて
習得にあるていど時間かかるけどやれることが広がるよ
あとワイルドカード展開するのはコマンドじゃなくて通常はシェルの仕事
2021/12/07(火) 00:34:04.97ID:P3Md4odo0
すみませんバッチファイルの本を買って勉強します
ありがとうございました
2021/12/07(火) 00:59:42.03ID:O2KWEQqW0
実際問題として、PS使うならPythonで書こうとするかなぁ
他のOSでも使うことができるし

とりあえずバッチとwshは使いたくない
2021/12/07(火) 01:31:43.51ID:q8J3SSC40
find -execかfind xargsが鉄板だと思うけど
外部コマンドのstdout/stderr出力をPython側でキャプチャする必要なければそんなにややこしくもない

for path in Path(search_dir).glob(pattern):
__if path.stat().st_size > 1000:
____dir_path = Path(output_dir).joinpath(path.stem)
____dir_path.mkdir()
____new_path = dir_path.joinpath(path.name)
____os.system(f'echo "{path}, {dir_path}" > "{new_path}"')

(同じファイル名があった場合の対処はしてない)
2021/12/07(火) 01:36:39.28ID:MjkMHobt0
winでもwsl2で >331が書いてる手順でヤレる
powershellも覚えれば便利なんだろうけど…
2021/12/07(火) 06:51:56.92ID:BLeYwod+0
>>329
2.は os.listdirすればリストで返してくれる
この辺見てみた?
https://note.nkmk.me/python-os-path-getsize/
2021/12/07(火) 07:18:25.74ID:Jl0mhXXA0
使うのがffmpegの場合、他にも考えるべきことが大量にあるので、
一括ではうまく行かないんだよな

何が来ても自分好みのファイルに変換する万能スクリプトを一つ書いて、
それに処理するファイル一覧を食わせる方式に落ち着いた
2021/12/07(火) 08:57:52.26ID:BFhf39Z30
awk,sedが必要になったらシェルスクリプトを諦めて全部Pythonで書くかな。
あれらを今から学習する気力が湧かない。
2021/12/07(火) 09:05:21.33ID:Jl0mhXXA0
PSはPSでしかできないパワフルなことがあるので、
その部分だけPSでやるのがいい
windowsの底の部分を簡単にいじれるのはPSだけ
2021/12/07(火) 10:45:42.99ID:F2U4yKHS0
質問するならコード貼ってほしいな
このスレのテンプレにpaste用サイトが書いてある
2021/12/07(火) 11:08:12.05ID:A/pvwvVNr
PSはlinuxでもosxでも動くし、あれだけで出来ること結構あるから知ってると便利だよな
2021/12/07(火) 11:49:17.79ID:G7aiaFNj0
ガチでヌーブなんですけどrequestsとbeautifulsoupでスクレイピングやってます
waitかけないとバンされるよと言われましたがどうすればいいですか?
requests.get()でtimeoutは今書きましたがforで同じサイトの似たようなページに何度もアクセスするのでサーバーへの負荷はすごいと思います
これに対してどうすればいいですか?
2021/12/07(火) 12:01:37.39ID:Jl0mhXXA0
適度にsleepする
2021/12/07(火) 12:17:07.83ID:yRaAbrIt0
手動でブラウザ操作したときまんまsleepしたらいいだけ
サーバ構築する側はボットなんか勘定にいれてコスト設計してないんだから
2021/12/07(火) 12:22:57.09ID:P3Md4odo0
>>342
for curDir, dirs, files in os.walk(sys.argv[1]):
for file in files:
if file.endswith("〇〇"):
os.path.getsize(ts)
print(os.path.join(file))

これでファイルは取得できるのですがそのファイルを参照する方法がわからず・・・
2021/12/07(火) 12:24:12.30ID:P3Md4odo0
こうでした

for curDir, dirs, files in os.walk(sys.argv[1]):
for file in files:
if file.endswith(".〇〇"):
print(os.path.join(file))
2021/12/07(火) 13:08:03.12ID:F2U4yKHS0
並列数1なら大したことないけどね
応答時間200ミリ秒なら、毎秒最大5リクエストだし
354デフォルトの名無しさん (オッペケ Sr5f-zXcE)
垢版 |
2021/12/07(火) 13:09:23.97ID:A/pvwvVNr
参照って何をしたいのか知らないけど、ファイル名取得出来てるんだからオープンするのも他のコマンドの引数に与えるのも可能では
2021/12/07(火) 13:32:14.96ID:lMfMxSoR0
>>352
Ruby では、glob に拡張子も指定できる

# 絶対パスのディレクトリ名の後ろに、*.txt を付ける。
# . で始まる、隠し directory, file を除く
glob_pattern = "C:/Users/Owner/Documents/**/*.txt"

separator = "-" * 30 + "\n"

Dir.glob( glob_pattern )
.select { |full_path| File.file?( full_path ) } # ファイルのみ
.each do |full_path|
puts "#{ separator }#{ full_path }\n#{ separator }" + File.read( full_path )
end
2021/12/07(火) 14:32:51.33ID:Jl0mhXXA0
できないglobなんか無いだろ

from pathlib import Path
p = Path("c:/path")
for filename in p.glob("*.mp4"):
print(filename)
2021/12/07(火) 15:09:33.84ID:NCVMykAH0
つかglobを何だと思ってんだガイジは
2021/12/07(火) 15:23:50.74ID:F2U4yKHS0
スレタイ読めない人がいるな
2021/12/07(火) 21:21:55.14ID:3sCD52Waa
オワコンのruby薦められても困る
2021/12/07(火) 21:40:58.38ID:Jl0mhXXA0
rubyとperlとVBとobjective-Cの人は、脱出するのが早いほど幸せになれる
2021/12/07(火) 21:43:22.87ID:P3Md4odo0
すんげえ苦労したけどなんとか形になりました
バッチなのですれ違いすみません
もっと勉強して最適化していきます
わかってしまえばすごくシンプル

set Tool="Tool"
set template="template"

for %%f in (%1\*.〇〇) do (
mkdir "%2\%%~nf"
%Tool% -i %%f -o "%2\%%~nf\%%~nf.dgi" -a -e
del "%2\%%~nf\%%~nf.log
)
2021/12/07(火) 22:06:22.51ID:zHaA7V/Y0
ワロタw
363デフォルトの名無しさん (ワッチョイ 0333-Z6Z9)
垢版 |
2021/12/07(火) 22:58:20.49ID:I8679kEJ0
嘘だろ
364デフォルトの名無しさん (ワッチョイ 6eda-9WRP)
垢版 |
2021/12/07(火) 23:00:21.81ID:oV2OkogX0
クソワロタ
2021/12/07(火) 23:12:35.70ID:7GhYBix30
templateって何?
2021/12/07(火) 23:44:21.65ID:F2U4yKHS0
ポテンシャルを感じる
2021/12/08(水) 01:37:02.26
from datetime import datetime, timedelta
import pytz
dt=datetime.now(pytz.timezone("Asia/Tokyo"))
print(dt)
print(dt.today())# timezone変更 不適用
print(dt.time())# timezone変更 適用
dt_utc=dt.astimezone(pytz.timezone("UTC"))
print(dt_utc)
print(dt_utc.today())#
print(dt_utc.time())#

#2021-12-08 01:34:40.591170+09:00
#2021-12-07 16:34:40.592894
#01:34:40.591170

#2021-12-07 16:34:40.591170+00:00
#2021-12-07 16:34:40.598068
#16:34:40.591170


.today()てtimezone変更引き継いで?くれないんですね・・
2021/12/08(水) 02:08:39.64ID:uCheTDCk0
Pythonで組みなおしています
デフォルト関数も多そうだし条件分岐とかが簡単そうですが
外部ツール起動に対するオプション調査中です
ファイル名を取得してその名前でディレクトリを作成するところまではできました

import sys
import os
import subprocess

for i in os.listdir(sys.argv[1]):
file, ext = os.path.splitext(i)
os.mkdir(sys.argv[2]+file)
2021/12/08(水) 07:20:30.37ID:OmzTkGs60
>>367
参考になるかも
https://qiita.com/shota243/items/91660ece72b5e84c3adb
2021/12/08(水) 13:19:52.67ID:uCheTDCk0
外部ツールに抽出ファイルをかけるのが難しいですね

%Tool% -i %%f -o "%2\%%~nf\%%~nf.〇〇〇" -a -e
この処理をPythonでどうやるのか?
subprocess.runあたりを使うっぽいのですがその後の書き方や処理方法が不透明
ターミナルにパイプして処理する?とかになるなら結局バッチかパワーシェルで
統一した方が早いのでしょうか
2021/12/08(水) 13:33:21.38ID:5HATgl/c0
標準出力を取得して、とかやるとそれ用のことを書かないといけないけど、
実行させるだけなら超シンプル

subprocessから取得したデータをパイプでffmpegに渡して、
とかやらせてちゃんと動くとちょっと嬉しい
2021/12/08(水) 13:43:19.97ID:lsXABI8+d
ニコ生のえっちなやつ録画したいニキおつ
2021/12/08(水) 15:21:18.60ID:M4uEosNe0
>>370
バッチで用が済むなら終わりでいいのでは
汚いスクリプトなんてプログラミングの勉強にならないし
2021/12/08(水) 16:12:58.05ID:5HATgl/c0
m = re.search('pattern', str)
if m:
  item = m.group(1)

みたいには書けるけど、ifの中にmの取得を一緒に書けない?
そうでないと、if elif elseで書けない
2021/12/08(水) 16:16:26.00ID:Z7ccVyDn0
昔のpythonでは書けなかったんですが
python3.8からassignment expression := ができるようになりました
2021/12/08(水) 16:22:47.75ID:5HATgl/c0
おおー、できるのか
でもうちのは3.7だからできないわ
会社のは3.6だからもっとできない

変な互換性のなさを作り込むよりは、3.6でもやれる方法を考えよう
2021/12/08(水) 16:31:06.57ID:cmZgcxZR0
>>370
各変数を別途取得して、subprocess.runで起動するアプリの引数として与えるだけ
自分で引数をオプションとして与えたいなら、argparseを使う
2021/12/08(水) 16:31:50.71ID:lsXABI8+d
item = data.get(1)
if item:
id(item)

#3.8
if item:= data.get(1):
id(item)
2021/12/08(水) 16:51:20.77ID:e5XneN8e0
pythonの野郎宗旨替えしやがったのか
2021/12/08(水) 17:00:08.30ID:cmZgcxZR0
>>374
スコープの話なら、関数こさえてreturnで拾うという手もあるけど、めんどくさいね
2021/12/08(水) 17:02:23.43ID:5HATgl/c0
無駄な処理は増えるけど
m1 = re.〜
m2 = re.〜
としておいてから、
if m1:
elif m2:
なら書ける

代入が評価もできる仕組みは、書き間違えてバグるからというよりは、
単純に読みにくくなる
2021/12/08(水) 17:12:25.01ID:+2BbFlMUa
Pythonのifのスコープは脳に優しくないな
2021/12/08(水) 17:22:50.60ID:aaXV5Kk80
プライベートだと思っていた彼女のホールがグローバルだった
2021/12/08(水) 19:30:48.14ID:5HATgl/c0
入力行をsplitして取り込む
arg1, arg2, arg3 = line.split('\t')
みたいな感じ

でも、入力がちゃんとしてなくて数が多くても少なくてもエラーになる
そこはよしなにやって欲しい
足りない部分はNoneで埋めて、余った分は捨てていい

というええかげんなことをしようと思ったら、ええかげん関数を作るしかないのかな
2021/12/08(水) 19:35:03.01ID:lsXABI8+d
hash = {'ぐれ':1, 'ぷ':2}

matched = m.group(1)

if not hash.get(matched):
print('i want to write else case')
elif hash[matched]== 1:
print('do 1 case')


???
2021/12/08(水) 21:14:52.99ID:/jR8/f4s0
>>384
arg1, arg2, arg3, *_ = line.split('¥t') + [None, None]
2021/12/08(水) 23:31:45.91ID:5HATgl/c0
+ でいいんだな
388デフォルトの名無しさん (ワッチョイ a601-CYhY)
垢版 |
2021/12/09(木) 02:15:13.68ID:WjLFVkiy0
すみません、質問なのですが、
newline= ってpython3じゃないと使えないのですか?
2021/12/09(木) 02:26:38.04ID:y+vTbIG00
調べてから質問してる?
390デフォルトの名無しさん (ワッチョイ a601-CYhY)
垢版 |
2021/12/09(木) 02:29:06.32ID:WjLFVkiy0
してる
2021/12/09(木) 05:36:26.42
"newline= を使う"ってなに?
文字列の中に改行コードは使えるか
って意味じゃないよね
それだとそっこーぐぐったら出てくるし。
なんかのライブラリやらフレームワーク的な話なのだろうか
2021/12/09(木) 05:39:43.24
あるいはクロスプラットフォームでのCRLFかLFかみたいな話かな
2021/12/09(木) 06:51:10.51ID:7v43kIFS0
openのオプションでしょ
2021/12/09(木) 08:02:22.78ID:I94H5Ioy
>>388
python3.8.1
https://techiedelight.com/compiler/?MQK2

python2.7.17
https://techiedelight.com/compiler/?lKam
2021/12/09(木) 08:48:12.08ID:zIpIn5ri0
beautifulsoupでattributeerror: nonetype nas no attribute stringが発生するんだけどnoneになることが想定される場合は一々いっこっこifでかこってやらないとだめなの?
2021/12/09(木) 08:56:56.15ID:zIpIn5ri0
ifっていうかtryか
2021/12/09(木) 08:59:10.31ID:7v43kIFS0
最大限何でも見つかるようにしとくから、緩めるのはユーザ側でやってね
という姿勢は間違ってないんだけどな
元から緩かったら厳しくしようがない
2021/12/09(木) 09:52:10.18ID:q+Lg0FmZ0
自分の管理できないデータを拾おうとする場合は
例外処理は必須だと思う
399デフォルトの名無しさん (ワッチョイ a601-CYhY)
垢版 |
2021/12/09(木) 10:42:48.76ID:WjLFVkiy0
>>394
ありがとうございます!!!
2021/12/09(木) 11:32:41.22ID:LJEXrIakM
>>395
ifかor

Pythonにはsafe navigation operatorがないからスクレイピングコードは煩雑になりがち
https://en.wikipedia.org/wiki/Safe_navigation_operator

要素がなければ空文字のようなデフォルト値を返す汎用的関数を自分で用意すると少し読みやすくなる
2021/12/09(木) 11:51:24.51ID:q+Lg0FmZ0
JSONなんかだと、get()で拾えばまぁ困らんな
2021/12/09(木) 11:58:39.98ID:LJEXrIakM
BeautifulSoupじゃなくてScrapyなら少しマシ
公式ドキュメントの質は段違い
2021/12/09(木) 12:37:45.04ID:LJEXrIakM
>>401
指定した要素がない状況を考慮する必要があれば階層ごとに自分でハンドリングが必要だからgetだけじゃダメなんだよね

safe navigation operatorがあればlodashのgetやrubyのdigのようなのが簡単に作れる

近いところでglomがあるけど処理を分割したり、つなげたりできないから使い勝手が悪い
2021/12/09(木) 14:43:48.67ID:kmW2UpC80
bsのドキュメントってなんであんな書き方なんかな
2021/12/09(木) 17:31:55.59ID:7v43kIFS0
クラスAを入力にしてクラスBに出力する時
a.process(b)
よりも
b.process(a)
の方が直感的だろうか
2021/12/09(木) 17:33:06.64ID:hfvG1WdLd
インスタンス作り直す
2021/12/09(木) 17:43:20.61ID:eEWQKJ8w0
>>405
processというメソッド名で二択ならまだ後者だけど直感的でない
どっちを主体にしたいかを決めてそれにあったメソッド名をつけるのが正解
2021/12/09(木) 17:47:49.86ID:y+vTbIG00
bの状態を変化させるなら後者かな
2021/12/09(木) 17:49:17.07ID:7v43kIFS0
名前をちゃんと付けると、データの抽出と設定を同時にやる訳だから
b.extract_data_and_write(a)
と書いたとしても、
from b to a なのか from a to bなのかは判らない
2021/12/09(木) 18:19:58.56ID:hfvG1WdLd
責任の所在はAにあるから
aの所有するメソッドがbを操作する、という書き方がいい
つまり前者
2021/12/09(木) 19:29:46.08ID:y36UsJ/D0
pythonって直感的ってより
少ない記述で書ける小型プログラムってイメージ
2021/12/09(木) 19:32:50.08ID:vdjQHUNbD
pythonって直感的ってより
コーディング規約みたいなのをなるべく減らすよう設計されてるイメージ
2021/12/09(木) 19:34:27.22ID:kmW2UpC80
イメージで語るな
2021/12/09(木) 20:11:20.59ID:lReNouCA0
すいませーん、入門したばかりなので低次元な質問ですけど教えてください。
DataFrameで行番号100以上のdf["hoge"]の値を全てNoneに置き換え、
って、どうやるんでしょう?
whereを使って列の値をキーにして置き換えみたいな記事はあちこちにあるんですけど、
うまく見つけられなくて…。
2021/12/09(木) 20:20:57.64ID:lReNouCA0
一応、出来たみたいです…。

df_subset = df2.query("index > 100")
df2.loc[df_subset.index, "hoge"] = None

2ステップになっちゃいました…。
もっと楽なやり方ってあるんでしょうかね?
416デフォルトの名無しさん (ワッチョイ 0a10-QDcv)
垢版 |
2021/12/09(木) 21:01:27.61ID:/XpwR6ak0
df.iloc[df.index>100,”hoge”]=None
417デフォルトの名無しさん (ワッチョイ 0a10-QDcv)
垢版 |
2021/12/09(木) 21:01:57.63ID:/XpwR6ak0
間違えた
df.loc[df.index>100,”hoge”]=None
2021/12/09(木) 21:09:37.78ID:7v43kIFS0
プロパティなんだよな
適当にネットのコードをコピーして改造して動いて、
後からよく見てなんだこれてなる
419デフォルトの名無しさん (ブーイモ MMcf-+02Y)
垢版 |
2021/12/10(金) 01:50:16.79ID:1XQlciewM
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

あー、ホンッとに思い出すなあ(笑)
キチガイの嘘つきの低レベルFランの、
朝鮮ゴキブリBot君は、
チョン独特の「なにもできないけど俺のほうがジャップより偉い!」的な
ことはよーくわかったよ。
ホントなにもできない朝鮮ゴキブリBot君!

クソチョンw
クソチョンはウンコを食べる糞食人種w
朝鮮人はゲリ便をじゅるじゅると
うまそうに食うw
2021/12/10(金) 08:35:11.18ID:DV16xl6X0
>>416-417

有難うございます、いけました。

DataFrame操作、便利なのはわかってるんですが、記述方法がこれまでやってきた他の言語にはなかった感じでちょと戸惑ってます。
2021/12/10(金) 08:58:00.11ID:5w3ky6J90
インデックス操作はスライス使う方がオレは好きだな
df.loc[100:,”hoge”]=None
2021/12/10(金) 09:27:24.28ID:LdVcQX3X0
上の方に要らない行があるからそれを削る、みたいな時には使うけど、
インデックスを数字で指定することがそもそもレア
2021/12/10(金) 12:18:46.95ID:DV16xl6X0
>>421

それでも行けるんですね。
424デフォルトの名無しさん (ブーイモ MMcf-+02Y)
垢版 |
2021/12/10(金) 14:44:01.80ID:dPm+RZp8M
クソチョンw
2021/12/10(金) 19:48:42.58ID:LdVcQX3X0
try - finally
はwithで置き換える
自作withはcontextlibで作る
2021/12/10(金) 21:51:15.63ID:jufFO9Qq0
javaでもない言語でtry自体を使いたくない
2021/12/10(金) 22:21:38.64ID:LdVcQX3X0
exceptが素早くタイプできない
2021/12/10(金) 22:33:35.69ID:CbPmL2LvM
javaって言えば今日は大騒ぎだったなw
影響範囲で言えば2年前のstruts2 RCE祭りより酷い

pythonのloggerは大した機能なくてハァ〜〜ってため息が出ることが何度かあったけど
今日だけはチープな実装でホントよかったと思ったわ
429デフォルトの名無しさん (ワッチョイ bfda-ULLt)
垢版 |
2021/12/11(土) 01:52:28.49ID:ZK42YBmJ0
>>428
穴ってレベルじゃねえよな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況