X



【まず1嫁】くだすれPython(超初心者用) その55
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
垢版 |
2021/10/01(金) 15:46:47.17ID:9qOHXj6D
当スレに★Python以外のプログラミング言語での回答類を書くべからず★
派生言語はそれぞれ専スレがある(この板にあるとは限らない)ので、そっち池。
「Ruby」「Rails」「某言語では」「クソチョンw」をNGワード登録推奨。荒らしは、完全スルー放置が一番きらいです。

このスレッドは「お勉強」スレのほうには書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を、勇気を持って書き込むスレッドです。
へび使いが優しくコメントを返しますので、お礼は Python の布教と初心者の救済をお願いします。

★エラーを解決したい場合★は、
  表示されたエラーの全文(勝手に省略やスクショうp等の横着クソ行為禁止)と、
  実行環境(Pythonのバージョン・OSとIDEの種類およびバージョン)をシッカリ書くこと。

Pythonの★ソースコードをそのまま5ちゃんに貼るとインデントが崩れてチヌ★
【【【複数の連続半角スペースはなにもなかったことにされる&タブは普通には入れられない】】】掲示板の仕様なので、
プログラム文は↓等の、いわゆるコードうp用サイトに貼ってこいください。
ttps://techiedelight.com/compiler/  Run Code機能あり。
ttp://ideone.com/      デフォ設定はC用のため、言語選択ボタン押下がピコ手間かも。
ttp://codepad.org/      ほぼ直感的に使える。Run codeボタンあり。
ttp://pastebin.com/     まずまずシンプル。
ttp://dpaste.com/      とてもシンプル。消えるまでの日数は十分長ーく指定のこと。

◇Python公式◇ http://www.python.org/
◇まとめwiki◇ ttp://python.rdy.jp/wiki.cgi

〇前スレ〇 【まず1嫁】くだすれPython(超初心者用) その54
https://mevius.5ch.net/test/read.cgi/tech/1623240344/

次スレたては >>985 あたりが挑戦する。
### END OF TEMPLATE ###
0003デフォルトの名無しさん
垢版 |
2021/10/01(金) 16:14:27.26ID:xAAYN8E1
最近 youtube 側のクローラー対策アルゴリズムが変わったらしく
前に描いてた python スクリプトがエラー吐くようになった
適当に wait 入れてアクセス頻度落とすとエラー出ない訳だが
遅くなるのでぎりぎり最適の wait にしたいんだが肝心な google 側のアルゴリズムが不明
納得行く速度が出るまでごちゃごちゃ試すと BAN されちゃうかな?
0007デフォルトの名無しさん
垢版 |
2021/10/01(金) 19:40:08.43ID:CQRkUSDD
うちもとあるサイト毎週引っこ抜いてたらいつもはない臨時メンテがあってその直後非同期だと接続エラーはくようになったな
非同期なくしたら大丈夫だったので今はおとなしく1倍速で落としてるけど。IPBANされなかっただけマシか
0008デフォルトの名無しさん
垢版 |
2021/10/01(金) 19:59:28.33ID:XZxvwPE1
pypy(パイパイ)って発音しにくいよね、特に社内だと( ^ω^)・・・
0010デフォルトの名無しさん
垢版 |
2021/10/02(土) 15:09:37.96ID:yFRwYWli
pypiのクローラーねぇ
0011デフォルトの名無しさん
垢版 |
2021/10/02(土) 23:18:51.11ID:zWqv5K6j
クソチョンw
0012デフォルトの名無しさん
垢版 |
2021/10/05(火) 14:54:46.13ID:eLBz+/wl
プライベートクラス変数にするメリットってどのようなときがあるのでしょうか・・
https://docs.python.org/ja/3/tutorial/classes.html#private-variables

>もし仮に MappingSubclass に __update 識別子を実装したとしても
これなら普通、Mappingクラスに実装しませんか?

それとは別にメリットとして、オブジェクトの中からしかアクセスしない変数
として使うなら、class外に書いた方がいいような?
0013デフォルトの名無しさん
垢版 |
2021/10/05(火) 15:14:02.22ID:I18ZMSNA
>>12
神がコーディングするならどうでもいいけど
クラス外に置くとドキュメンテーションの点で劣る
識別子の置き換えが発生しないと意図しない副作用の可能性を残してしまう
ひとつでもそういう箇所があると疑心暗鬼になり生産性も落ちる
0014デフォルトの名無しさん
垢版 |
2021/10/05(火) 15:48:22.95ID:+YzW1gaU
windows、python3.9.7で
fileにパス付きファイル名が与えられた時に、パス無しファイル名(拡張子無し)と拡張子を取得する場合
if "." in os.path.basename(file):
____ext_without_dot = os.path.basename(file).split(".")[-1]
____basenaname_without_ext = os.path.basename(file).removesuffix("." + ext_without_dot)
else:
____ext_without_dot = ""
____basenaname_without_ext = os.path.basename(file)
で問題ないでしょうか?
もっと綺麗な書き方あったら教えてください。
0015デフォルトの名無しさん
垢版 |
2021/10/05(火) 15:58:59.57ID:UD2fraRe
>>12
その例は、Mappingクラスが、MappingSubclassのupdateメソッドではなくMappingクラスのupdateメソッドを呼び出したい場合の実装例。

Mappingの__update変数の中にMappingのupdateメソッドを格納しておけば、updateメソッドをオーバーライドされてしまってたとしても常に元のupdateメソッドを参照することができる。

サブクラスが__update変数自体をオーバーライドしようとしても、内部的に識別子を変えてるから大丈夫ですよ、そんなことできませんよ、と言っている
0019デフォルトの名無しさん
垢版 |
2021/10/05(火) 16:32:23.12ID:UD2fraRe
>>18
splitextの戻り値の第2要素が空文字列だったら第1要素と第2要素をひっくり返せばよいのでは?
0022デフォルトの名無しさん
垢版 |
2021/10/05(火) 16:58:23.72ID:yytwxBBE
>>14
from pathlib import Path

p = Path('.')

for file in p.iterdir():
ext = ''.join(file.suffixes)
without_ext = file.name.rstrip(ext)
0023デフォルトの名無しさん
垢版 |
2021/10/05(火) 16:59:34.11ID:UD2fraRe
import re
basename = ...
if m := re.match(r'(.*)\.([^.]+)$', basename):
. basename_without_ext = m.group(1)
. ext_without_dot = m.group(2)
めんどいからもう_
0025デフォルトの名無しさん
垢版 |
2021/10/05(火) 17:36:31.51ID:+YzW1gaU
>>23
理解できない…ムズイ
検証もやりかた分からないです
何をやってるか理解出来たら後でコメントします
0028デフォルトの名無しさん
垢版 |
2021/10/05(火) 18:10:11.85ID:+YzW1gaU
>>26
拡張子がある場合正常に動きました
拡張子がない場合はうまくいきませんでした
拡張子がない場合を別処理すると14で書いた処理より長くなる・・・
正規表現勉強してみます
0029デフォルトの名無しさん
垢版 |
2021/10/05(火) 18:29:46.70ID:+YzW1gaU
>>27
二重拡張子は各アプリ毎に取り決めが違うので個別に考えるしかないかと
"abc.net.txt" とかを二重拡張子扱いしたらまずいですし
0030デフォルトの名無しさん
垢版 |
2021/10/05(火) 19:15:38.22ID:db3O09Qx
Python 3.10入れてみたけどIDLEのプロンプト表示が良くなってるね
最初違和感があったけど、これは見やすくて良いわ^^

新機能の構造的パターンマッチに注目ですな、これは使っていきたい
0031デフォルトの名無しさん
垢版 |
2021/10/05(火) 19:55:29.85ID:CsDVkN/q
当方でも、パッケージ管理ソフトChocolateyにPython 3.10が来たようでPython 3.9から自動更新された
困ったことに、pywin32がまだPython 3.10に対応してない
0033デフォルトの名無しさん
垢版 |
2021/10/05(火) 20:47:41.95ID:UD2fraRe
>>28
import re
basename = ...
if m:=re.match(r'(.*)(\.([^.]+))|(.*)',basename):
. basename_without_ext = m.group(1) or m.group(4)
. ext_without_dot = m.group(3)
0034デフォルトの名無しさん
垢版 |
2021/10/05(火) 21:03:44.19ID:db3O09Qx
>>14
from pathlib import Path

p = Path('hoge.jpg').resolve().absolute()
ext_without_dot = p.suffix[1:]
basename_without_ext = p.stem
0035デフォルトの名無しさん
垢版 |
2021/10/05(火) 21:38:18.61ID:+YzW1gaU
>>33
少し書き換えましたが希望した動作をしています
勉強になりますた、感謝

import os, re
file = "C:\\test\\a"
#file = "C:\\test\\a.b"
#file = "C:\\test\\.b"
#file = "C:\\test\\..b"
basename = os.path.basename(file)
if m := re.match(r'(.*)(\.([^.]+))|(.*)', basename):
____basename_without_ext = m.group(1) or ""
____ext_without_dot = (m.group(2) or m.group(4)).removeprefix(".")
print("\""+basename_without_ext+"\"")
print("\""+ext_without_dot+"\"")
0036デフォルトの名無しさん
垢版 |
2021/10/05(火) 21:49:55.73ID:+YzW1gaU
>>34
"C:\\test\\.b"
の場合、うまくいきません
resolve() absolute() 等初めて見るものが多いので調べてみます
0037デフォルトの名無しさん
垢版 |
2021/10/05(火) 22:19:04.45ID:yMBvIvKg
3.8からのセイウチ構文は便利だと思うけど、見通し悪くなるしどうも好きになれない
先に変数にしたほうがわかりやすくないか?
if m := re.match(r'(.*)(\.([^.]+))|(.*)', basename):

m = re.match(r'(.*)(\.([^.]+))|(.*)', basename)
if m:
0038デフォルトの名無しさん
垢版 |
2021/10/05(火) 22:29:08.23ID:db3O09Qx
>>36
はい私の優勝w
p = Path(f).resolve().absolute()
stem = p.stem
ext = p.suffix[1:]
if stem.startswith('.') and not ext: #ファイル名が空の場合
stem, ext = ext, stem

basename_without_ext = stem
ext_without_dot = ext
0039デフォルトの名無しさん
垢版 |
2021/10/05(火) 22:36:52.31ID:JbR3YU6O
おまいらマジでポンコツだなω
0040デフォルトの名無しさん
垢版 |
2021/10/05(火) 22:46:47.72ID:+YzW1gaU
>>38
stem, ext = ext, stem[1:] ですね。
最初に覚えた書き方から少しずつpathlibに書き換えてるけどまだ慣れない
os.pathが頭にこびりついてる
0041デフォルトの名無しさん
垢版 |
2021/10/05(火) 23:11:06.33ID:UD2fraRe
>>36
basenameって書いてるのだからbasenameを渡して
0043デフォルトの名無しさん
垢版 |
2021/10/06(水) 00:13:14.92ID:uIHfQozZ
こうやってみたら動いてる
単純になった

import os
file = "C:\\test\\.b"
basename = os.path.basename(file)
basename_without_ext = os.path.splitext("!" + basename)[0][1:]
ext_without_dot = os.path.splitext("!" + basename)[1][1:]
0045デフォルトの名無しさん
垢版 |
2021/10/06(水) 00:28:36.53ID:sqxilgxU
Ruby ではパス区切りに、/ も使える

require 'fileutils'

Dir.glob( 'c:/users/owner/documents/あ/*' )
.select { |full_path| File.file?( full_path ) } # ファイルのみ
.each do |full_path|
file_name = File.basename( full_path ) # ファイル名
file_extname = File.extname( file_name ) # 拡張子

puts "#{ file_name } : #{ file_extname }"
end

出力
あ.txt : .txt
い.csv : .csv
0047デフォルトの名無しさん
垢版 |
2021/10/06(水) 00:53:55.80ID:63dnmtAL
>>46
今のWindowsはエクスプローラー上でドットファイルの作成が出来るようになってるし
WSLなんかでも困ることになるので、ちゃんとドットファイルとして扱ったほうがいいと思うよ
0048デフォルトの名無しさん
垢版 |
2021/10/06(水) 01:06:01.53ID:uIHfQozZ
>>47
不特定多数からファイル受け取るんです
エクスプローラー上でドットファイルの作成が出来るからなおさらドットファイルとしては扱えないんです
0049デフォルトの名無しさん
垢版 |
2021/10/06(水) 01:14:22.59ID:63dnmtAL
じゃあ、例えば以下のファイル名(パス)の場合、
どんな結果を期待しているの?

file = r'..txt'
file = r'test.txt'
file = r'test.tar.xz'
file = r'test'
file = r'.\test.txt'
file = r'c:\test.txt'
file = r'c:/test.txt'
file = r'C:\dir\.test'
file = r'C:\dir\.test.txt'
file = r'C:\dir\test'
005045
垢版 |
2021/10/06(水) 01:18:15.89ID:sqxilgxU
隠しファイルか?

Ruby のglob でも、. で始まる、directory, file を除くから、
こういうのを許すと、バグのもと

特殊ファイルを作らせたら、ダメ
0051デフォルトの名無しさん
垢版 |
2021/10/06(水) 01:22:00.09ID:uIHfQozZ
>>49
'.' txt'
'test' 'txt'
'test.tar' 'xz'
'test' ''
相対パスは扱わない、というか、basenameを処理
'test' 'txt'
basenameを処理
'' 'test'
'.test' 'txt'
'test' ''
0052デフォルトの名無しさん
垢版 |
2021/10/06(水) 01:27:53.38ID:uIHfQozZ
>>50
不特定多数にだめといってもしょうがないでしょう
受け取った後、問題ないファイル名にして、後続処理しますが
最初からドットファイル扱いすると処理抜けする
0055デフォルトの名無しさん
垢版 |
2021/10/06(水) 08:16:30.25ID:a6e48TNJ
確かにWindowsだと.testはファイル名じゃなく拡張子として扱うね、だからWindowsの場合だけそうすればいい

import os
from pathlib import Path
def hoge(f):
____p = Path(f).resolve().absolute()
____stem = p.stem
____ext = p.suffix[1:]
____if os.name=='nt' and stem.startswith('.') and not ext: # Windowsの場合
________stem, ext = ext, stem[1:]

____print(f'{p.name=}\n{stem=}\n{ext=}\n')
005631
垢版 |
2021/10/06(水) 09:26:58.81ID:lTl3I+RT
pywin32がPython3.10向けpipにない問題を自己解決したので一応報告

以下githubのpywin32レポジトリをクローンしてソースからビルドしてインストール
https://github.com/mhammond/pywin32

以下ビルドコマンドを実行
> python setup.py install --skip-verstamp
Visual Studio 2015 のビルドツールが必要なので、適宜Visual Studio Installer から 「MSVC v140 …」を追加インストール
レジストリ登録するらしく管理者権限も必要
0057デフォルトの名無しさん
垢版 |
2021/10/06(水) 10:49:29.50ID:N2DvDSnL
[{'data': 'data123’, 'test': [{'testname': 'test123', 'testvalue': 'value123'}], 'date': '20211006}, {'data': 'data789’, 'test': [{'testname': 'test789', 'testvalue': 'value789'}], 'date': '20211007}]

上のようなかんじのデータ構造のデータがありまして、
forか何かでループして切り出して下のような感じに分割してデータを扱いたいんですがどうやればできますか?

[{'data': 'data123’, 'test': [{'testname': 'test123', 'testvalue': 'value123'}], 'date': '20211006}]

[{'data': 'data789’, 'test': [{'testname': 'test789', 'testvalue': 'value789'}], 'date': '20211007}]
0058デフォルトの名無しさん
垢版 |
2021/10/06(水) 11:06:28.93ID:YjJCqwIe
アップする前にちゃんとデータ検証しとけよ。
ary=[{'dict':'test'},{'dict':'test2'}]
for itm in ary:
__print(itm)
0059デフォルトの名無しさん
垢版 |
2021/10/06(水) 11:17:52.70ID:N2DvDSnL
>>58
ありがとうございます
早速試したみましたがそれっぽいことができました
printした結果、前後の[ ]がなくなっていてリストではなくなっているようにみえるんですがこいつをリストにはできないですか?
0060デフォルトの名無しさん
垢版 |
2021/10/06(水) 11:23:52.33ID:YjJCqwIe
各要素には[ ]はもともと付いてないからな。
その程度がわからんようなら基本的な知識が不足しすぎ。

初めから各要素をリストにしとくか、[itm]にする。
つーか、なんで抽出してまた各々をリストにする必要があるんだよ。
0062デフォルトの名無しさん
垢版 |
2021/10/06(水) 11:47:56.89ID:IkoUshwC
うーん、よくわからんっす
知識不足ってのはそうですね、まだpythonさわって3日目ですw
web apiに引数としてデータ渡す際にリストで渡さないといけないのです

最初の分解する前の状態でも渡せないことはないんですが全部一度に渡すと具合悪いので分割して一つずつ渡したい感じです
0063デフォルトの名無しさん
垢版 |
2021/10/06(水) 11:48:29.59ID:IkoUshwC
あれipが変わってしまいました
0064デフォルトの名無しさん
垢版 |
2021/10/06(水) 12:10:25.68ID:IkoUshwC
リストで渡す=json文字列で渡す
って意味なのかな?
そうならjson文字列で渡したいのです
0065デフォルトの名無しさん
垢版 |
2021/10/06(水) 12:23:59.95ID:YjJCqwIe
>>62
>うーん、よくわからんっす
[itm]がわからんてこと? 書いてあるママだが。
リストで渡せるならわざわざjsonにする必要はない。
その理解度でweb apiを触ろうとするのが逆にすごいな。
0066デフォルトの名無しさん
垢版 |
2021/10/06(水) 12:28:38.78ID:IkoUshwC
for [itm] ってことですか?
エラーで返ってきますけど
0068デフォルトの名無しさん
垢版 |
2021/10/06(水) 12:40:42.74ID:IkoUshwC
なるほど!試してみますw
0069デフォルトの名無しさん
垢版 |
2021/10/06(水) 12:49:00.18ID:IkoUshwC
できました!
すげえっす
めっちゃサンキューな
0071デフォルトの名無しさん
垢版 |
2021/10/06(水) 21:08:11.15ID:cm9kobto
sqlalchemyでデータベースの検索やInsert処理をします。
挿入処理A、検索処理B、検索処理Cをそれぞれ並列処理したとき
session.close()するタイミングはどうやればいいのでしょうか
例えば
addしたいレコードが複数あるとき
#挿入処理A
for item in items:
_db.session.add(item)
_time.sleep(3)#あえてsleep
db.session.commit()
db.session.close()

この処理中に並列処理中の検索B、Cでの
(.commit()然り)db.session.close()がかぶる気がするのですが
0072デフォルトの名無しさん
垢版 |
2021/10/06(水) 21:26:27.63ID:xpgZiC6t
3.10来てるじゃねえか教えろよ


パターンマッチくらいか
あれば便利だけど取り立てて欲しい!って機能ではないなあ
0073デフォルトの名無しさん
垢版 |
2021/10/06(水) 21:31:05.16ID:xpgZiC6t
型の方はますますTypeScriptじみて来たな
もうTythonですよ
10年くらい前にTythonあったよね
007471
垢版 |
2021/10/07(木) 10:04:08.76ID:ZfelXN70
自己解決?しました
まだ確信は持てませんが結局commitとcloseの総数が適切なら
挿入処理Aのループ処理の途中で(他の並列処理B,Cが)commit、closeしようが
DB更新瞬間さえセキュアであれば関係ないっぽいですね
0075デフォルトの名無しさん
垢版 |
2021/10/07(木) 11:50:22.62ID:YxBBlGj0
elifだと構文上subjectを固定できずコードが曖昧になってたからmatchたすかる
パターンマッチできるところが増えてくといいなあ
0076デフォルトの名無しさん
垢版 |
2021/10/07(木) 13:09:40.31ID:vIJYcTdp
Windowsの拡張子の取得をテストして気づいたこと
現代では拡張子は"."を含めるらしい
DOSの時代は含めなかったのに・・・
作成済みのプログラムの修正するか悩む
0077デフォルトの名無しさん
垢版 |
2021/10/07(木) 15:39:01.76ID:UFWCdLE6
ドットディレクトリとかの影響かな?
0078デフォルトの名無しさん
垢版 |
2021/10/07(木) 16:16:39.36ID:vIJYcTdp
理由はよくわからないけど、LinuxやUNIX側の影響でしょうね
ドットディレクトリの、".abc"みたいなのは対応は簡単?なんですが
"abc."みたいなドットで終わるタイプのファイル名想定してませんでした
DOSではこんなファイル名付けられなかったもんで
0079デフォルトの名無しさん
垢版 |
2021/10/07(木) 19:30:33.12ID:vIJYcTdp
ドットで終わるファイル名
os.path.isfile(file) -> False
ドットで終わるディレクトリ名
os.path.isdir(file) -> False

ドットで終わるファイル名・ディレクトリ名
attribute = win32api.GetFileAttributes(file) -> 例外
0080デフォルトの名無しさん
垢版 |
2021/10/07(木) 19:43:13.97ID:vIJYcTdp
p_dir = pathlib.Path(dir)
p_files = list(p_dir.glob("**/*"))
1stのディレクトリを再帰読込しようとすると、下の階層のドットで終わるファイル名・ディレクトリ名で例外

1st --- 2nd1 -
_____|- 2nd2. -
_____|- 2nd.3

例外を発生させずドットで終わるファイル名・ディレクトリ名を読み飛ばすには、
自力で再帰読込するしかないのでしょうか?
0081デフォルトの名無しさん
垢版 |
2021/10/07(木) 20:07:13.59ID:vIJYcTdp
>>80
80 のコメント取り消します
さらに分析必要みたい
どうなっているのかまだ詳細不明
正常に動かないのは確か
0082デフォルトの名無しさん
垢版 |
2021/10/07(木) 20:30:18.08ID:vIJYcTdp
改めて質問します

p_dir = pathlib.Path(dir)
p_files = list(p_dir.glob("**/*"))
1stのディレクトリを再帰読込しようとすると、下の階層のドットで終わるディレクトリ名で例外

1st --- 2nd1
_____|- 2nd2. (ドットで終わるファイル)
_____|- 2nd3. (ドットで終わるディレクトリ) -> 例外 FileNotFoundError

例外を発生させずドットで終わるディレクトリ名を読み飛ばすには、
自力で再帰読込するしかないのでしょうか?

未検証のアイデアでも頂けたらうれしいです
0083デフォルトの名無しさん
垢版 |
2021/10/07(木) 21:02:20.97ID:xRnq/kAQ
やってみたらドットで終わるディレクトリ作れまへんがな
最後のドット消えてまうんやけど?
0084デフォルトの名無しさん
垢版 |
2021/10/07(木) 21:20:59.25ID:vIJYcTdp
>>83
エクスプローラーから作る方法は私も知りません
コマンドプロンプトで
copy "C:\test\a.txt" "\\?\C:\test\a."
md "\\?\C:\test\b."
みたいなかんじです
コマンドラインの知識が全くないかたは実験しないでください。
0085デフォルトの名無しさん
垢版 |
2021/10/07(木) 21:28:40.10ID:xRnq/kAQ
>>84
コマンドプロンプトでやってみたけど最後のドットが無いファイル/ディレクトリが作られるよ
OSはWindows10
0087デフォルトの名無しさん
垢版 |
2021/10/07(木) 21:44:37.02ID:vIJYcTdp
>>85
こちらもWindows10です
ずっとコマンドプロンプトでやっていてできてます
今PowerShellでやってみましたが、PowerShellでもできました
\\?\C つけ忘れていませんか?
フルパスで "" もつけてください
ほかに条件あるのだろうか
0088デフォルトの名無しさん
垢版 |
2021/10/07(木) 21:56:31.61ID:xRnq/kAQ
>>87
\\?\Cは付けてませんでした。
調べたら最後にドットがあるファイルは削除できないとかアクセスできないらしい
やだー こわいからやらなーいw
0090デフォルトの名無しさん
垢版 |
2021/10/07(木) 22:02:37.28ID:vIJYcTdp
>>86
これでいいですか?

p_dir = pathlib.Path(dir)
p_files = list(p_dir.glob("**/*"))

で例外が発生する場合、該当ファイルを読み飛ばして処理を行う方法はありますか?
自力で再帰読込はできればやりたくありません
0091デフォルトの名無しさん
垢版 |
2021/10/07(木) 22:28:17.75ID:xRnq/kAQ
最後がドッドのアクセスできないディレクトリに入ろうとして例外が出るのかな?
これは自力で再帰読込するしかないよ、再帰はそんな難しくないと思うよ! がんばって^^
0092デフォルトの名無しさん
垢版 |
2021/10/07(木) 23:35:06.59ID:vIJYcTdp
超レアケースなのでルートのディレクトリ毎エラー処理することにします
できればファイル単位でエラー処理したかったのですが
0093デフォルトの名無しさん
垢版 |
2021/10/07(木) 23:50:14.03ID:StWMkIYV
>>82
どうかな

import pathlib
p_dir = pathlib.Path(".")
p_glob = p_dir.glob("**/*")
p_files = []
while True:
    try:
        p = next(p_glob)
        p_files.append(p)
    except FileNotFoundError as e:
        import sys
        print(e, file=sys.stderr)
    except StopIteration:
        break
print(*p_files, sep="\n")
0095デフォルトの名無しさん
垢版 |
2021/10/08(金) 00:17:02.73ID:T4fYgd16
>>93
すごいです
完璧に動いてます
早くこのレベルのプログラムがしたい
本当にありがとうございました
0096デフォルトの名無しさん
垢版 |
2021/10/08(金) 00:41:36.79ID:x4lgXBGS
Path.glob()いいね
いままでos.walk()で自前でフィルタしてたけど今度つかってみる
0098デフォルトの名無しさん
垢版 |
2021/10/08(金) 09:08:14.69ID:Pr4xGBUG
globって見に行かない名前のファイルかディレクトリなかったっけ?
0099デフォルトの名無しさん
垢版 |
2021/10/08(金) 09:45:15.17ID:LO45Vby3
for i in range(100):
_if条件:
__time.sleep(3)など
__continue
_if条件:
__time.sleep(3)など
__continue

こういうとき、time.sleep(3)などが重複するのでまとめたいと思い
for i in range(100):
_if i!=0:
__time.sleep(3)など
としましたが
要は、continueするときには必ず実行する文がある
ということなので
continue後毎に処理するような節とかテクニックや慣習はあるのでしょうか
0101デフォルトの名無しさん
垢版 |
2021/10/08(金) 10:14:00.03ID:LO45Vby3
if条件の中にはif条件1とif条件2で違う処理も入っているので
continueするときに必ず行う処理はべつのとこに書いた方が見やすいかな
と思ったのです
つまり、continue文の宣言自体がそれ(continueするときに必ず行う処理)を示すような書き方があれば
と思ったのですがなさそうですね
ありがとうございました
0103デフォルトの名無しさん
垢版 |
2021/10/08(金) 10:44:16.94ID:LO45Vby3
for i in range(100):
_if i!=0:
__i=0以外で実行する関数1()

↑こういうのってあんまり使わないものなのでしょうか?
continue後時に必ず実行する関数、と違う点は
if i!=0:だと最期のcontinue後は実行されない、ので混乱するかなと。
(else節併用だと野暮になるし)

やはり重複しようが
if 条件1:
_関数A()
_関数1("")
_continue
if 条件2:
_関数B()
_関数1("")
_continue
みたいにした方がいいのかもしれませんね
0104デフォルトの名無しさん
垢版 |
2021/10/08(金) 10:54:49.70ID:dABXXppr
for i in range(100):
____if i != 0:
________if 条件1:
____________関数A()
________if 条件2:
____________関数B()
________関数1("")
________continue
010645
垢版 |
2021/10/08(金) 12:38:00.40ID:EgdGtVHT
>>50
に書いたけど、

Ruby のglob では、. で始まる、隠し directory/file を除く
0107デフォルトの名無しさん
垢版 |
2021/10/08(金) 14:27:43.17ID:hfI/PPIh
tkinterでrowconfigure([1, 2, 3], weight=1)とかすると
_GridIndexにlist[int]できねーよって怒られるんだけど実際はできる
どういう型指定したらいいんでしょうか
0108デフォルトの名無しさん
垢版 |
2021/10/08(金) 22:41:24.42ID:T4fYgd16
>>93
今日詳細にテストしました。今使っているコードです
p_dir = pathlib.Path(dir)
p_files = []
p_err_files = []
p_glob = p_dir.glob("**/*")
while True:
____try:
________p = next(p_glob)
________dot_chk = False
________for divided_path in str(p).replace("/", "\\").split("\\"):
____________if divided_path[-1] == ".":
________________dot_chk = True
________________break
________if not dot_chk:
____________p_files.append(p)
________else:
____________p_err_files.append(p)
____except FileNotFoundError as e:
________print(e, file=sys.stderr)
____except StopIteration:
________break
____for i in p_err_files:
________for j in p_err_files:
____________if str(i).startswith(str(j)):
________________if len(str(i)) > len(str(j)):
____________________p_err_files.remove(i)
print(*p_files, sep="\n")
print(*p_err_files, sep="\n")
0109デフォルトの名無しさん
垢版 |
2021/10/08(金) 22:49:21.67ID:T4fYgd16
ドットで終わるディレクトリがあっても例外が発生しない場合があるようです。
例外が発生しない場合、このコードで正常・異常分類できてます
例外が発生した場合、探索が打ち切られているような感じです。
解釈間違ってるかも
例外が発生した場合、全件エラーにした方がよさそうです。
0110デフォルトの名無しさん
垢版 |
2021/10/08(金) 23:04:50.88ID:T4fYgd16
例外が発生しない場合でも
ドットで終わるファイル・ディレクトリを検出したら全件エラーのほうが安全かな
0111デフォルトの名無しさん
垢版 |
2021/10/09(土) 08:06:03.22ID:3hwdJKmG
class Person():
_def __init__(self, name, age):
__self.name = name
__self.age = age
_def sample1(self):
__print(self.name,self.age,self.f)

class JapanesePerson(Person):
_def __init__(self,name,age,f=False):
__self.name = name
__self.age = age
__self.f=f

class JapanesePerson2(Person):
_def __init__(self,name,age,f=False):
__super().__init__(name,age)
__self.f=f

yamada = JapanesePerson("山田", 30)
yamada.sample1()
yamada2 = JapanesePerson2("山田2", 20,True)
yamada2.sample1()

JapanesePersonとsuper()つかったJapanesePerson2って同じ意味っすよね?
super()使って書くのって継承したPersonにname,ageがあるぞっていう意味合いのためなんでしょうか?
0112デフォルトの名無しさん
垢版 |
2021/10/09(土) 08:45:15.87ID:TxyuJC/9
>>111
>JapanesePersonとsuper()つかったJapanesePerson2って同じ意味っすよね?
違うよ、super()を使った方は基底クラスPersonの属性name,ageに値をセットするが
JapanesePersonの方は基底クラスの方にセットせずに重複したJapanesePersonの属性name,ageにセットしている
Personを継承している意味がナッシング
0113デフォルトの名無しさん
垢版 |
2021/10/09(土) 09:52:36.10ID:3hwdJKmG
>>112
そうなんですね
yamada.sample1() でself.name,self.ageが参照できてるので
なんのためにsuper().__init__でわざわざ値セットする必要があるんだろう??と気になったので。
def sample1(self):のselfってなんなんだ??みたいな
ありやした
0114デフォルトの名無しさん
垢版 |
2021/10/09(土) 11:41:14.80ID:TxyuJC/9
>>108
>________for divided_path in str(p).replace("/", "\\").split("\\"):
>____________if divided_path[-1] == ".":
これはfor divided_path in p.parts: # で分割できる、pathlibの機能を使おう
更にここは内包表記で一気に書けて
_________if any(part.endswith('.') for part in p.parts):
よってdot_chk変数が不要になる

>____except FileNotFoundError as e:
>________print(e, file=sys.stderr)
これエラー表示してるだけだから、p_err_files.append(p) しといた方が良くない?

>____for i in p_err_files:
>________for j in p_err_files:
>____________if str(i).startswith(str(j)):
>________________if len(str(i)) > len(str(j)):
>____________________p_err_files.remove(i)

こっちの方が早いかも、短いし
____for i in p_err_files:
________p_err_files = [j for j in p_err_files if not j.match(i.name+'/*')]
0115デフォルトの名無しさん
垢版 |
2021/10/09(土) 12:37:39.05ID:A9QtIjdU
>>114
アドバイスありがとうございます。
内包表記覚えたいと思ってるんですがなかなか身につかないです
glob.glob使っていてpathlib.globに書き直したのでpathlibの他の機能何も知らない状態です
勉強しなきゃいけないこと多いな

>>____except FileNotFoundError as e:
>>________print(e, file=sys.stderr)
>これエラー表示してるだけだから、p_err_files.append(p) しといた方が良くない?
動作確認に使ってるだけなんで、printじゃなくpassでいいかと思ってます。
この例外のメッセージから有用な情報は得られませんでした
例外が発生する以前に、pathlib.globに限らずファイル関連の関数・クラスの挙動があやしいです
pathlib.globは試した範囲では1番挙動がまともでした
0116デフォルトの名無しさん
垢版 |
2021/10/09(土) 13:10:11.80ID:A9QtIjdU
>>114
>________p_err_files = [j for j in p_err_files if not j.match(i.name+'/*')]
j.match(i.name+'/*')] の部分なんですが、pathlibは'/'で決め打ちして大丈夫なんですか?
pythonが'/'と'\\'をどう使い分けてるかよくわからないです。
取得したパスが'/'と'\\'混在してたりするし・・・
0118デフォルトの名無しさん
垢版 |
2021/10/09(土) 13:22:15.13ID:TxyuJC/9
>>116
どっち使ってもいいし混在してもいいみたいですよ

>>____except FileNotFoundError as e:
>>________print(e, file=sys.stderr)
これ有益な情報が得られないとあるけど、どのディレクトリかファイルで例外発生したかは分かったの?
分からなかったらpも表示させた方がいいんでない?
0119デフォルトの名無しさん
垢版 |
2021/10/09(土) 13:49:18.15ID:A9QtIjdU
>>118
例外発生したディレクトリの名前が信用できないんです
except FileNotFoundError as e: のところで分かるのは、発生したということだけです
恐らく発生したと思われるディレクトリ名は既にp_err_filesに入ってます
例外が発生したときのみ全件エラーにするなら何かフラグを立てたほうがいいと思います
今回はドットで終わるものを見つけたら、エラーログにp_err_filesを書き出して
全件処理しないのでこれで十分かと
その後、手作業でエラーログのすべてに対応すると思うので、例外発生個所の情報は使いません
0120デフォルトの名無しさん
垢版 |
2021/10/09(土) 14:29:12.42ID:TxyuJC/9
>>119
いやいや、例外が発生する箇所はp = next(p_glob)のところで
そこからexcept FileNotFoundError as e: にジャンプしてくるわけですから
p_err_filesには入りません(p_err_filesに入るのは例外が発生しない場合です)

で、おそらくpの変数に代入する前のnext(p_glob)で例外が発生するから
その場合except FileNotFoundError as e:でpを表示させた場合は例外が発生する前のpなわけで
そのpの次にアクセスするディレクトリかファイルで例外が発生するということですよ、きっと

あと/と\\なんですけど、これはファイルパスの区切り文字でLinuxとかが/でWindowsは\\です
Pythonではどっち指定してもいいんですが、これをstr()で文字列にすると文字が違うわけですから
同じパスでも違うパスと判定してしまうので注意です
if str(i).startswith(str(j)):は危険です
0121デフォルトの名無しさん
垢版 |
2021/10/09(土) 14:45:18.21ID:A9QtIjdU
>>120
詳しく書きますね
最初ドットで終わるディレクトリに入れなくて例外すると考えていました。
テストしているとそうではないと思うようになってきました。
例外が発生原因はドットで終わるディレクトリです
でも必ず例外が発生するわけではありません
pathlib.globが最後に探索する箇所がドットで終わるディレクトリの場合、例外は発生しません
この状態でドットで終わるディレクトリのうしろに問題のないディレクトリを追加します
そうすると、ドットで終わるディレクトリではやはり例外は発生しません
例外が発生するのは次の問題のないディレクトリです
このとき、間違ったファイル名で処理をしようとしてFileNotFoundErrorが発生していると思われます
例外で取得できるのは問題のないディレクトリにアクセスするときの間違ったファイル名です
0122デフォルトの名無しさん
垢版 |
2021/10/09(土) 15:09:43.07ID:TxyuJC/9
>>121
よく分かりました。それなら言われたとおり例外はpassするだけでいいですね

ところで
____for i in p_err_files:
________p_err_files = [j for j in p_err_files if not j.match(i.name+'/*')]
ですが、、
____for i in p_err_files:
________p_err_files = [j for j in p_err_files if not j.match(str(i/'*'))]
に訂正します

matchの中のstr(i/'*') は文字列にした場合区切り文字が\\になります
これをstr(i) + '/*'として/と\\を混在させてもmatchでは正常に動くようです
0123デフォルトの名無しさん
垢版 |
2021/10/09(土) 15:30:28.23ID:Ngy1mnu3
printと書かない以外でなんか出力するのある?
0124デフォルトの名無しさん
垢版 |
2021/10/09(土) 16:19:52.75ID:/xiMgjvY
sys.stdout.write()
0125デフォルトの名無しさん
垢版 |
2021/10/09(土) 16:24:43.13ID:dPZPc1xL
WindowsというかDOSの頃から内部は/でもパス区切りできて
バックスラッシュ要求するのはシェルや一部のアプリ
単体プログラムなら/で書いたほうがポータビリティある
0126デフォルトの名無しさん
垢版 |
2021/10/09(土) 18:09:17.61ID:JVX7Q22F
>>121
Path.globでイテレータを作成した後に追加・削除されたファイルやディレクトリは
イテレーションに含まれるか含まれないかは不定なので
それでも困らないような使い方じゃなければ使い方が悪い

>例外で取得できるのは問題のないディレクトリにアクセスするときの間違ったファイル名です
問題のないディレクトリなのに間違ったファイル名なのか・・・・
全部読んでないからかよくわからん
0127デフォルトの名無しさん
垢版 |
2021/10/09(土) 19:07:55.16ID:Ngy1mnu3
統合環境?総合環境?
おすすめの教えて
winでもマックでもリヌクスでもいいです
0128デフォルトの名無しさん
垢版 |
2021/10/09(土) 19:13:36.12ID:/xiMgjvY
eric4
0130デフォルトの名無しさん
垢版 |
2021/10/09(土) 21:23:39.35ID:aguDhBGS
>>127
Jupyter Notebook、Notebookの後継であるJupyterLab、
VSCode, Google Collaboratory

YouTube などで、よく紹介されているのは、Google Collaboratory

他には、WSL2, Linux, Docker

多言語のversion manager なら、asdf とか、
日本人が作った、バージョンマネージャーのanyenv とか

anyenvでは、19言語を統一された方法で、
nodenv, phpenv, pyenv, rbenv, goenv, jlenv などを使う。
Python ならpyenv、Julia ならjlenv

Python標準では、venv

多くの言語で、version manager の使い方を統一したいのなら、asdf, anyenv
0131デフォルトの名無しさん
垢版 |
2021/10/09(土) 23:27:09.55ID:cIVnj/jm
>>130
ありがとう
参考にしてそれぞれ入れてみて稼働確認?動作軽いのか?とかやってみます。
0132130
垢版 |
2021/10/10(日) 00:15:53.95ID:lB7MFpHR
プロ用では、anyenv から、Docker へ移行していくだろう
0133デフォルトの名無しさん
垢版 |
2021/10/10(日) 05:07:59.49ID:wTu2fZfo
tkinterにドラッグアンドドロップつける
tkinterDnD2というやつ

dnd_root.bind(<Drop>, callback)
callback(ev):
__files = dnd_root.splitlist(ev.data)

みたいに書きます
このevてdndEventクラスで
http://tkinterdnd.sourceforge.net/TkinterDnD.html#DnDEvent
にあるように、いくつかの属性にアクセスできるんだけど
この属性のそれぞれが何を意味してるのかっていうのは、どこに書いてあるんでしょうか
ドキュメント的なものを探してるんだけど、見当たらなくて
0135デフォルトの名無しさん
垢版 |
2021/10/10(日) 09:09:58.87ID:wTu2fZfo
>>134
おー助かりました
0136デフォルトの名無しさん
垢版 |
2021/10/10(日) 09:10:27.91ID:YLnhElYI
>>127
統合開発環境ね
パイチャームかVisualStudioかインテリj
0138デフォルトの名無しさん
垢版 |
2021/10/10(日) 12:39:25.44ID:H4xzBt6k
importで頭が混乱してきました
https://pastebin.com/tRafMmRt

sample0.pyのimport sample2で、sample2内のsample1がimportされると思ったのですが
結果、importはされませんでした
そう判断したのは、sample0→sample2でのsample1のimportで
printもされず、BASEのランダムも生成されなかったからです

これは、sample0.pyでsample1をすでにimportしているので
sample2内のsample1のimportは省略というか、
sample0でのsample1のimportを引き継いだ
みたいなことでいいのでしょうか・・?
0139デフォルトの名無しさん
垢版 |
2021/10/10(日) 13:16:40.64ID:kKlMir+m
>>138
そう
あちこちにあるimport sys他が都度走るのはいやだし

https://docs.python.org/ja/3/reference/import.html
他の動作も可能だけれどフレームワーク実装とか特殊なケースでなければ
モジュール側でうまく対応した方が良い。
0140デフォルトの名無しさん
垢版 |
2021/10/10(日) 13:24:05.94ID:H4xzBt6k
>>139
なるほど・・
どうもimportするたびに新規発行されるみたいなイメージが強くなってしまって・・
>あちこちにあるimport sys他が都度走る
たしかにそうですよね
ありがとうございました
0141デフォルトの名無しさん
垢版 |
2021/10/10(日) 14:08:59.72ID:PpP5FnLO
>>114
>>122

for x in range(500000):
p_err_files = p_err_files_org.copy()
for i in p_err_files:
for j in p_err_files:
if str(i).replace("/", "\\").startswith(str(j).replace("/", "\\")):
if len(str(i)) > len(str(j)):
p_err_files.remove(i)
7秒

for x in range(500000):
p_err_files = p_err_files_org.copy()
for i in p_err_files:
p_err_files = [j for j in p_err_files if not j.match(str(i/'*'))]
97秒

p_err_filesの内容によってどう変わるかわかりませんがかなり遅いです
綺麗な書き方だけにどうにかしたい
報告です。質問じゃないです
0142デフォルトの名無しさん
垢版 |
2021/10/10(日) 15:13:50.14ID:ykpYSE0z
>>141
ふむ、matchが遅いのだろうね、、じゃあ二人の良いところをドッキングしよう
for x in range(500000):
____p_err_files = p_err_files_org.copy()
____for i in p_err_files:
________i = str(i).replace("/", "\\") + '\\' #replaceのせいで見にくいからあえて別にしてみました
________p_err_files = [j for j in p_err_files if not str(j).replace("/", "\\").startswith(i)]
これは3秒いっちゃうんじゃない?

ところで/と\\って混在するの? pathlib.Pathをstr変換するとOSに合わせた区切り文字で文字列化しない?
replaceいらないんじゃない? いや、私も昔混在しててエラーになった経験があるんだけども
それって文字列化してから自分でスラッシュを足して混在させてたような気がしてきた
今適当にやってみても混在しないし・・さ
0143デフォルトの名無しさん
垢版 |
2021/10/10(日) 16:01:08.25ID:PpP5FnLO
>>142
4秒になりました、内包表記早い
最近も混在してエラーになりました。詳しく調べてないです
気になるときは.replace("/", "\\")つけてます
0144デフォルトの名無しさん
垢版 |
2021/10/10(日) 16:15:29.74ID:PpP5FnLO
混在するのいやだから自分でつなぐときos.path.join使ってます
今ソース確認したけど"/"使ってない
0145デフォルトの名無しさん
垢版 |
2021/10/10(日) 16:23:35.36ID:ykpYSE0z
>>143
ttps://docs.python.org/ja/3/library/pathlib.html#operators
パスオブジェクトの文字列表現はそのシステム自身の Raw ファイルシステムパス (ネイティブの形式、
例えば Windows では区切り文字がバックスラッシュ) になり、
文字列としてファイルパスを取るあらゆる関数に渡すことができます

ほらほら、仕様的にWindowsでstr変換すると\\になるよん

>>144
ふーん、ちなみにpathlib.Pathにもjoinpathがあるからそっちの方がいいかも
0146デフォルトの名無しさん
垢版 |
2021/10/10(日) 17:00:09.47ID:PpP5FnLO
取得したばかだから混在はないですね
最終形
for x in range(500000):
____p_err_files = p_err_files_org.copy()
____for i in p_err_files:
________p_err_files = [j for j in p_err_files if not str(j).startswith(str(i) + os.sep)]
0148デフォルトの名無しさん
垢版 |
2021/10/10(日) 20:43:45.45ID:PpP5FnLO
ありゃ、バグってたかも(最終形じゃないやつ)

新コード 14秒

for x in range(5000):
____p_err_files = [str(p) for p in p_err_files_org]
____for i_idx, i in enumerate(p_err_files[:-1]):
________for j in p_err_files[i_idx + 1:]:
____________if j.startswith(i + os.sep):
________________p_err_files.remove(j)
____p_err_files = [pathlib.Path(p) for p in p_err_files]

最終形って書いたコード 56秒

新コードがバグってないかよくテストしなければ
0149デフォルトの名無しさん
垢版 |
2021/10/10(日) 21:08:00.05ID:PpP5FnLO
最初のデータだと
新コード 14秒
最終形って書いたコード 4秒
件数が多いと新コードが早い
0150デフォルトの名無しさん
垢版 |
2021/10/10(日) 21:41:11.57ID:ykpYSE0z
for x in range(5000):
____p_err_files = p_err_files_org.copy()
____for i in p_err_files:
________if i.is_dir():
____________i = str(i) + os.sep
____________p_err_files = [j for j in p_err_files if not str(j).startswith(i)]

最速のコード・・できました、、これは2秒台かもしれん
最後がドットのディレクトリでis_dir()ができるのか知りませんが
0151デフォルトの名無しさん
垢版 |
2021/10/10(日) 22:14:56.87ID:PpP5FnLO
>>150
衝撃の結果 最初のデータ(件数の少ないやつ)
新コード 14秒
最終形って書いたコード 4秒
isdir 167秒
コードを見ると一見早そうに見えるんだけど
0152デフォルトの名無しさん
垢版 |
2021/10/10(日) 22:25:50.37ID:PpP5FnLO
件数の多いデータ loop回数減らしてます
新コード 2秒
最終形って書いたコード 11秒
isdir 60秒
0153デフォルトの名無しさん
垢版 |
2021/10/10(日) 22:53:16.01ID:fsOtTZsl
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

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

クソチョンw
0154デフォルトの名無しさん
垢版 |
2021/10/10(日) 23:14:16.55ID:kKlMir+m
is_dir()はos.stat(fstat)つかってそうだし遅いだろうね
事後処理多すぎるしos.walk()のが適当かも
0155デフォルトの名無しさん
垢版 |
2021/10/10(日) 23:25:00.22ID:ykpYSE0z
for x in range(5000):
____p_err_files = p_err_files_org.copy()
____for idx, i in enumerate(p_err_files[:-1], start=1):
________i = str(i) + os.sep #これは出した方が速いの?変わらない?
________p_err_files = [j for j in p_err_files[idx:] if not str(j).startswith(i)]
界王拳3倍だぁああああ
0156デフォルトの名無しさん
垢版 |
2021/10/10(日) 23:36:40.30ID:ykpYSE0z
やっぱ>>155は無し
このp_err_files[:-1]やp_err_files[idx:]ってダメな気がする
途中でp_err_filesの要素抜くからバグる気がするんだけど・・
新コードと最終形の結果同じなんだよね?
0157デフォルトの名無しさん
垢版 |
2021/10/10(日) 23:50:06.43ID:PpP5FnLO
>>155
最初のデータ(件数の少ないやつ)
新コード 14秒
155のやつ 2秒

件数の多いデータ 466件
新コード 28秒
155のやつ 32秒


件数の多いほうほぼ互角ですね

>________i = str(i) + os.sep #これは出した方が速いの?変わらない?
圧倒的に速いです
0159デフォルトの名無しさん
垢版 |
2021/10/10(日) 23:57:12.93ID:ykpYSE0z
for x in range(5000):
____p_err_files = p_err_files_org.copy()
____for i in p_err_files:
________if i in p_err_files:
____________i = str(i) + os.sep
____________p_err_files = [j for j in p_err_files if not str(j).startswith(i)]

はい、これ最後にするわw inで抜いた要素の場合は処理を飛ばすです
is_dir()みたいに遅いかも? お疲れっした!
0161デフォルトの名無しさん
垢版 |
2021/10/11(月) 07:20:20.01ID:nIh2l5lJ
出来ました、これが本当の最後! globで作られるリストでは先にディレクトリが並び、
後にそのディレクトリ内のファイルが並ぶことを利用して
消えるのは常にidxの後ろのファイルであることを考慮したものです

for x in range(5000):
____p_err_files = p_err_files_org.copy()
____for idx in range(len(p_err_files)):
________try:
____________i = str(p_err_files[idx]) + os.sep
________except IndexError:
____________break
________p_err_files = [j for j in p_err_files if not str(j).startswith(i)]
見てくださいこのカッコイイボディー、1秒台を叩き出すポテンシャルが伺えます
0162デフォルトの名無しさん
垢版 |
2021/10/11(月) 14:30:12.13ID:Z6IULiPa
最新コードです
メインループはリスト、サブループは集合
リストは長さでソート
集合で in を高速にし、内包表記で削除するデータを集め差集合を求める
件数が多い場合に焦点を当ててます

for x in range(5000):
____p_err_files = p_err_files_org.copy()
____p_err_list = sorted([str(p) for p in p_err_files], key = len)
____p_err_set = set(p_err_list)
____for i in p_err_list:
________if i in p_err_set:
____________i += os.sep
____________p_err_set -= {j for j in p_err_set if j.startswith(i)}
____p_err_files = [pathlib.Path(p) for p in p_err_set]

測定結果は後ほど
0163デフォルトの名無しさん
垢版 |
2021/10/11(月) 15:03:13.08ID:yoxInkMN
p_err_files_orgを含めてideoneあたりに貼ってくれんかな
0164デフォルトの名無しさん
垢版 |
2021/10/11(月) 15:04:52.03ID:Z6IULiPa
最初のデータ(件数の少ないやつ) 500,000ループ
最新コード 14秒
新コード 13秒
最終形って書いたコード 4秒
159 3秒
161 3秒

件数の多いデータ 466件 5,000ループ
最新コード 4秒
新コード 14秒
最終形って書いたコード 54秒
159 28秒
161 13秒

巨大ディレクトリテスト 122496件 1ループ
最新コード 223秒
新コード 277秒
最終形って書いたコード 測定不能ギブアップ
159 ギブアップ
161 ギブアップ
0166デフォルトの名無しさん
垢版 |
2021/10/11(月) 15:38:47.81ID:nIh2l5lJ
>>164
ブラボー、集合速い!

ちなみに最新コードのsetで順番が変わった結果は、これで戻せると思います
____p_err_files = sorted([pathlib.Path(p) for p in p_err_set] , key=p_err_files_org.index)
0168デフォルトの名無しさん
垢版 |
2021/10/12(火) 13:14:04.41ID:Y4+OaxqJ
uuid含む辞書 のリストの検索って
やっぱ内包表記が一番早いですか?
item = [d for d in db if d[id] == _id][0]
0169デフォルトの名無しさん
垢版 |
2021/10/12(火) 14:22:16.90ID:65IdcDyl
>>168
それだと遅延評価されずに全走査してから[0]を解決するから
リストが長いと不利
0171デフォルトの名無しさん
垢版 |
2021/10/12(火) 18:55:46.32ID:rbfrUXN4
線形探索に変わりはないから本質的には変わらない
規模と目的にもよるが事前にハッシュテーブルを作成するなりしたらいいんじゃない?
0172デフォルトの名無しさん
垢版 |
2021/10/12(火) 19:05:49.73ID:rbfrUXN4
>>170
最初の1つを取得したいなら素直にfor文で回して見つけ次第breakすればいいんじゃない?
0173デフォルトの名無しさん
垢版 |
2021/10/12(火) 19:27:30.01ID:db3N35kL
>>172
検索速度を速くするために内包表記、全走査せず見つけたら止まるようにジェネレータを使うので
item = next(filter(lambda d: d[id] == _id, db))
もしくは、
item = next(d for d in db if d[id] == _id)

>>171
ハッシュテーブル使うならこうですか?
item = eval(' | '.join([f'db[{i}]' for i in range(len(db))]))[id]
0174デフォルトの名無しさん
垢版 |
2021/10/12(火) 19:48:08.27ID:Y4+OaxqJ
謎のなりすましw
0175デフォルトの名無しさん
垢版 |
2021/10/12(火) 20:14:27.30ID:DOoMLgfj
tkinterとMVCを勉強中なんですが
view用のtkvarってmodel(db)に置くんですか?
view側が持つのですか?
0177デフォルトの名無しさん
垢版 |
2021/10/13(水) 00:27:53.69ID:zS1AsSBo
>>173
内包表記使わないと死ぬ病気なの?
いつ、何故内包表記が速くなるか勉強した方がいい
ネットに落ちているサンプルコードのように繰り返しappendする訳でもないのだから大して変わらん
0178デフォルトの名無しさん
垢版 |
2021/10/13(水) 04:42:48.68ID:+txmauo5
>>175

view
ウィジェットとtkvar(表示(view)に関わる)

model
変数(データ実体)

controller
view.widget.tkvar.set(mode.var)

おれの認識
0179デフォルトの名無しさん
垢版 |
2021/10/13(水) 08:21:06.00ID:5N5C/lUt
>>177
内包表記みるとファビョっちゃう病気なの?
内包表記が速くなるだけじゃないことを勉強した方がいい
ネットに落ちてるサンプルコードのように単純な処理のだから内包表記を使わない手はない
0181デフォルトの名無しさん
垢版 |
2021/10/13(水) 10:54:11.99ID:V99uCirA
[_ for _ in (1,2,3)]
0182デフォルトの名無しさん
垢版 |
2021/10/13(水) 12:56:21.92ID:xAxceSCu
どんなに複雑なコードでも内包表記で書こうとするような奴はPython向いてないとは思う
0184デフォルトの名無しさん
垢版 |
2021/10/13(水) 14:17:57.86ID:k/aGOBxZ
next filterは見た目いいけどそのままだと例外飛ぶからdefault指定すべき
あとid検索をしょっちゅうやるつもりなら171の言う通りidをキーに持つハッシュテーブルにしたほうがいい
0185デフォルトの名無しさん
垢版 |
2021/10/13(水) 15:04:27.22ID:i0OqJqsg
ネストする時は内包表記でもインデントしてね
0186デフォルトの名無しさん
垢版 |
2021/10/13(水) 15:48:08.21ID:5N5C/lUt
>>184
お、褒められたw default指定か、なるほど、、じゃあこう
item = next(filter(lambda d: d[id] == _id, db), None)

ハッシュテーブルって辞書のことですよね?
0187デフォルトの名無しさん
垢版 |
2021/10/14(木) 08:52:02.98ID:tO9afOB/
>>178
Viewは簡単に生き死にするから、変数(データ実体) をtkvarにしてModelに持たせる方がいいと思うよ。
形式変換などが必要なときは、Modelにそれ用のアクセサを付ければいい。
ControllerがModelとViewのインスタンスを持ち、ViewはControllerだけを参照する。
Modelは基本的にController、Viewの参照をどっちも持たない。
0188デフォルトの名無しさん
垢版 |
2021/10/14(木) 09:10:49.38ID:Exint/Io
作り方にもよるけど
tkinterをqtに変えようとか、移植に伴ってツールキットを交換することを考えると
modelをtkverのデータ置きにすると全面的な書き直しがいると思うつーか、そうなった

ので俺は最近modelには一般の変数とロジックだけ置く
viewには可能な限りtkinter固有の全部を置く。vcmdとかも
で全操作をcontrollerに書く。コイツが全部の発信源
よくviewがmodel見る三角形図あるけど、個人的にはviewの影響を限定的にしたい

https://i.imgur.com/a7HUCYH.png
0189デフォルトの名無しさん
垢版 |
2021/10/14(木) 09:42:03.64ID:tO9afOB/
確かに、tkinterのVarはデータバインディング(しかも双方向可能)の考え方そのものなので、
MVCに少しそぐわない(ViewModelっていうんだっけ?)。
どっちにしろ、データベースやネットワークサービスがデータソースになる場合は、Varは単なるバスみたいな使い方になるし。
0190デフォルトの名無しさん
垢版 |
2021/10/14(木) 11:40:53.17ID:wCUDNz+i
まあ移植性を捨てればtkvarはdbに置いて
bindingと最小限のイベントハンドラをcontrollerに置いて
あとはm-v間でやってくれぇ〜というのが一番書きやすいだろう

真面目にやるとcontroller薄くなりすぎるはずなのでc-vとmに分けるっていうのも良いと思う。わしはこれが好き
GUI(tk.Tk):
_super().__init__()
云々
GUI.mainloop()するやつ
0191デフォルトの名無しさん
垢版 |
2021/10/15(金) 16:12:08.85ID:Tty/f66M
PythonでLZ4を使うと、lz4.frame,lz4.block,lz4.streamっていうのがあるみたいなのですが
それぞれ何がどう違うのでしょうか
検索すると英語の情報が多いのですが、アホなので分かりません
0192デフォルトの名無しさん
垢版 |
2021/10/15(金) 16:25:20.62ID:yvxpjjvp
質問ですが、defaultdictに対して.getを使った場合、値が存在しない場合でもメモリを使ってしまうのですか?
0193デフォルトの名無しさん
垢版 |
2021/10/15(金) 18:54:50.40ID:TUcBd+bC
>>192
https://docs.python.org/ja/3/library/collections.html#collections.defaultdict.__missing__
> もし default_factory 属性が None でない場合、このメソッドは引数なしで呼び出され、与えらえた key に対応するデフォルト値を提供します。この値は、辞書内に key に対応して登録され、最後に返されます。

なんでデフォルト値の分消費する。(各種オーバーヘッドは未考慮)

>>> help(collections.defaultdict)
困ったらhelp
同じことが書かれてる
0195デフォルトの名無しさん
垢版 |
2021/10/16(土) 23:48:05.88ID:7DXC85u5
>>321
youtube-dl --skip-download --dateafter now-3days --get-title --get-id --get-description --get-duration -i "チャンネルURL"
0196デフォルトの名無しさん
垢版 |
2021/10/17(日) 14:11:08.72ID:7C23oe5i
Mike Python
0197デフォルトの名無しさん
垢版 |
2021/10/17(日) 17:37:19.17ID:kbVq19bl
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

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

クソチョンw
0198デフォルトの名無しさん
垢版 |
2021/10/17(日) 19:55:12.60ID:t5hHOLNv
Python3.9で、souted()とラムダ式を勉強しているところです
sorted()のkeyに指定するラムダで、戻り値にマイナスを付けるコードがあり、
これは何だろうと思って以下のリストを作成してsorted()にかけて出力してみました
(コメント行として書いている箇所が出力結果です)

li = [('a', 1), ('b', 200), ('c', 50), ('e', -3), ('h', -55000), ('d', 10)]

print(sorted(li, key=lambda x: x[0]))
# [('a', 1), ('b', 200), ('c', 50), ('d', 10), ('e', -3), ('h', -55000)]

print(sorted(li, key=lambda x: -x[0]))
# TypeError bad operand type for unary -: 'str'

print(sorted(li, key=lambda x: x[1]))
# [('h', -55000), ('e', -3), ('a', 1), ('d', 10), ('c', 50), ('b', 200)]

print(sorted(li, key=lambda x: -x[1]))
# [('b', 200), ('c', 50), ('d', 10), ('a', 1), ('e', -3), ('h', -55000)]

出力結果を見るに、マイナスを付けるとreverse=Trueを指定したときと
同じ結果が得られるということなのかなと思ったのですが
1つだけTypeErrorになってしまいました
これは何故なのでしょうか
0199デフォルトの名無しさん
垢版 |
2021/10/17(日) 20:06:53.96ID:hODn77KL
sorted関係ないしエラーメッセージがまんま理由

>>> -'a'

TypeError: bad operand type for unary -: 'str'
0200デフォルトの名無しさん
垢版 |
2021/10/17(日) 20:42:04.88ID:t5hHOLNv
>>199
ありがとうございます

戻り値が'a'というstr型なのに負の値にしようとして怒られてるってことでしょうか
key=lambda x: -x[N] という書き方は、reverseオプションの代替ではなく
戻り値に-1を掛けている…という認識であってますか?
(そのため結果として逆順にソートされたように見える)
0201デフォルトの名無しさん
垢版 |
2021/10/17(日) 20:47:32.06ID:NeddvKFI
-x[0] の演算順序は、どっち?
-x が先なのか、-(x[0]) のカッコ内が先なのか?

前者なら、xが文字列型で、
後者なら、x[0]が文字列型で、エラー
0202デフォルトの名無しさん
垢版 |
2021/10/17(日) 23:08:28.45ID:ChJOOsVw
>>198
・lambda x: 〜のxには('a', 1)とかが入る
・lambda x: 〜の返り値(〜の計算結果)でソートされる
・文字列型にマイナスを掛ける操作(符号反転)は定義されてないのでエラー
・符号反転がreverse=Trueと等価か?についてはそう考えていいけど数値でないと符号反転操作ができないので万能ではない
・符号反転が役立つのは文字列(例では第1要素)は辞書順でソートして数値(例では第2要素)は降順でソートするとか昇順降順降り混ぜたソートをしたいとき

Effective Pythonからの受け売りなので立ち読みとかできるなら読んでみるといい
0204デフォルトの名無しさん
垢版 |
2021/10/18(月) 13:59:02.18ID:bl1s8YLW
values = [2, 1, 0, 1, 2]
orders = []

values[i]が右より大きいならorders.append[i]
その条件を満たすまでi+nで見ていく.最大値len(values)

上記の例だと[0, 1, 4, 3, 2]
が得たいんだけど、どう書いたらいいですか?
なんか超低速か無限ループにはまってしまって…
0205デフォルトの名無しさん
垢版 |
2021/10/18(月) 14:01:45.68ID:bl1s8YLW
あ valuesはランダムな整数のランダムな長さの配列(1〜10くらい)です
0209デフォルトの名無しさん
垢版 |
2021/10/18(月) 15:32:14.49ID:r9t2S6+p
コピペばれると退学だから
それと判らないように質問してるんだろう
0210デフォルトの名無しさん
垢版 |
2021/10/18(月) 20:16:41.07ID:2nbXAeQ6
言わんとしていることはわかる
ランク付けだろ
rank =[i for i in range(len(values))]
でdrop駆使していけるはずだ
0212デフォルトの名無しさん
垢版 |
2021/10/19(火) 10:06:30.06ID:10EXZk67
def hoge(*,a,b):
_print(a,b)
m="a"
n="b"
eval( f"hoge({m}=10,{n}=20)" )

こういう引数必須で、動的に引数名を指定したい場合
evalを使うのが定石でしょうか?
0214デフォルトの名無しさん
垢版 |
2021/10/19(火) 10:41:06.36ID:LLvKMRJR
>>212
動的に引数名を指定しないのが定石
evalはユーザー入力でpythonの式を受け取りたい場合に使う

引数名だけを動的に指定したい理由は?
それ次第だけどeval以外の方法があると思うよ
0215デフォルトの名無しさん
垢版 |
2021/10/19(火) 11:38:40.18ID:DE2IVg3K
タプルのリストをlist.sort()するとき
同じ値なら元のインデックスが若い順に並びますか?

l = [('あ', 0), ('い', 1), ('う', 0)]
l.sort(key = lambda x:x[1])

必ず
[('あ', 0), ('う', 0), ('い', 1)]
ですか?

場合によって
[('う', 0), ('あ', 0), ('い', 1)]
になりうる?
0217デフォルトの名無しさん
垢版 |
2021/10/19(火) 11:47:54.98ID:10EXZk67
>>213,214
ありがとうございます
datetimeのtimedeltaを使いたいのですが
timedelta(seconds=3000)
な感じで、secondsの部分がminutesやdaysにしたいときがあるので
条件分岐していたのですが、他の方法があるのかなと思いまして
0219デフォルトの名無しさん
垢版 |
2021/10/19(火) 11:59:21.79ID:10EXZk67
自己解決?したかもです
daysやらminutesやらデフォルト値を0に設定して
timedelta(days=days・・・,seconds=seconds)
みたいに全部ぶっこめばいい気がしてきました
0220デフォルトの名無しさん
垢版 |
2021/10/19(火) 12:01:28.19ID:DE2IVg3K
>>216
おー勉強になりました
ありがとう
0221デフォルトの名無しさん
垢版 |
2021/10/19(火) 12:11:27.56ID:LLvKMRJR
>>219
timedelta()の引数は全部任意でデフォルト値0が設定されてるから自分で指定する必要はないよ
0222デフォルトの名無しさん
垢版 |
2021/10/19(火) 12:18:41.33ID:10EXZk67
>>221
def hoge(u,v):
_timedelta(ここ=v)

hoge("seconds",3000)みたいなとき
ここ、の部分をどうやって指定するのでしょうか?

if u=="days":
_timedelta(days=v)

みたいにしていたのですが
timedelta(days=days,,,,seconds=seconds)
でもいいのかなぁと
0229デフォルトの名無しさん
垢版 |
2021/10/19(火) 14:30:29.56ID:LLvKMRJR
>>222
それはdictionaryで渡して、アスタリスクx2でunpackingする

def hoge(kargs):
__return timedelta(**kargs)

delta = hoge({“seconds”: 3000})
0230デフォルトの名無しさん
垢版 |
2021/10/19(火) 19:13:22.75ID:p2X/wkWb
hoge(u="seconds",v=3000)という呼び出し方しかできないようにする。
def hoge(*, u, v):
...
>>229みたいなのは使う側に優しくないので、引数がわかり切っているときは使わない。
0231デフォルトの名無しさん
垢版 |
2021/10/20(水) 09:19:40.59ID:OEiI06HQ
>>212
setattr
0232デフォルトの名無しさん
垢版 |
2021/10/20(水) 19:49:22.13ID:EZ3+LSel
ネタがなくても月3万円を稼ぐブログなら誰でも作れる。後はやるかやらないかだけ

ブログで稼ごうと思ったら簡単だよ。
身の回りにあるものをとにかく写真に撮りまくれ!
そのカメラに撮った商品を使い込め!それも徹底的にな!
あとは、お前の感じた感想をそのままブログに書き込むんだ!
その紹介した商品にAmazonのアフィリエイトを忘れるなよ。
これをひたすら続ければ、月に数万円は余裕。

先程の書き込みにも書いてあったとおりなんですが、手順は簡単、次の3ステップです。
1身の回りにあるモノの写真をデジカメで撮りまくる
2写真に撮ったモノを徹底的に使い込む
3モノの使用感を自分の感じたままブログに書き殴る
0234デフォルトの名無しさん
垢版 |
2021/10/21(木) 06:53:33.05ID:udHqGeXx
スライスの使い方誤解してたわ

list = [10,20,30,40,50,60]

|10|20|30|40|50|60|
要するにサンドイッチのパンに要素が挟まってて
左のパンからスライス[0]位置、スライス[1]位置ということなのか

del list[2:4]
なら、|30|40|が除かれて|10|20|50|60|になるのか

なんかあんまり直感的じゃないな
del list[2:3]だと結局|30|しか取り除かない事になるからdel list[2]とかわらないよね?
0235デフォルトの名無しさん
垢版 |
2021/10/21(木) 08:45:58.03ID:POpI6QwK
>>202
大変遅くなりましてすみません
>>198です
丁寧に説明してくださりありがとうございます
とてもわかり易い

Effective Python についてググるだけでも掻い摘んだ説明が出てきて面白いです
0236デフォルトの名無しさん
垢版 |
2021/10/21(木) 08:47:32.47ID:rE4toNa0
どっちのやり方が良いかは場合によるんではっきり言えないけど、swiftやrubyを除けばメジャーな言語の多くがindexは0始まり、範囲は開始位置、終了位置+1で指定するんで、多くのプログラマにとってはpythonのやり方のほうが慣れ親しんでいるとは言えるかも

ちなみにswift、rubyは終了位置、終了位置+1のどちらの記法も使える
0237デフォルトの名無しさん
垢版 |
2021/10/21(木) 12:27:44.59ID:moBizkab
round(val, n)
みたいな簡単な書き方で、小数点○桁以下切り捨て、っていうのは無いのですかね?
浮動小数点の誤差については気にしないです
123.4567を小数点2桁で切り捨てなら、
123.45 (またはそれに限りなく近い数値)になってほしいです

math floorは桁指定できないですよね
探してもdecimalだとか10^nしてintしてから割るとかやることに対してちょっと大げさなものしか見つかりませんでした
0238デフォルトの名無しさん
垢版 |
2021/10/21(木) 12:46:20.72ID:/d/0VOpU
floor(x*10**n)/10**n
0239デフォルトの名無しさん
垢版 |
2021/10/21(木) 13:17:26.48ID:T2C3Q12E
さすがにそれは
0240デフォルトの名無しさん
垢版 |
2021/10/21(木) 16:14:53.89ID:8ILWSSPd
フリーランスエンジニア専門の案件一括検索サイト「フリーランススタート」、
掲載案件数15万件突破!さらにリモートワークの掲載案件数4,000件突破!

ITフリーランスの独立支援サービス『テックビズ』&定額制全国住み放題『ADDress』提携開始

ITフリーランスの独立支援サービス『テックビズ』とフリーランス向け報酬即日払いサービス『先払い』提携開始

新型コロナの影響で、常駐型フリーランスエンジニアのリモート対応が増加

フリーランスエンジニア必見!リモートワークや週3案件があるサービス5



高報酬案件を求めるフリーランスエンジニアのための案件マッチングプラットフォーム
「Pro Connect Enginner(プロコネクトエンジニア)」正式版、2021年2月28日リリース!
0241デフォルトの名無しさん
垢版 |
2021/10/21(木) 16:18:34.28ID:yuVpO81C
"1×2.txt"のように"×"が文字列に入ったファイル名を処理しようとしています。
files = sys.argv[1]
で受け取って
print(files)
すると、×がなくなって
12.txt
に化けています。避ける方法はありませんか?
0244デフォルトの名無しさん
垢版 |
2021/10/21(木) 16:27:35.45ID:s+STdMnX
filesのbyte列を出力してみろ
0245デフォルトの名無しさん
垢版 |
2021/10/21(木) 18:35:03.76ID:yuVpO81C
>244
やってみました。
print(files.encode())
b'12.txt'
どこで消えてるんだろう…全角の×なので、普通に通ると思っていたのですが…
0247デフォルトの名無しさん
垢版 |
2021/10/21(木) 18:54:37.47ID:yuVpO81C
OS: Win11Pro
シェル: PowerShell 7.1.5
Python: Python 3.10.0 (tags/v3.10.0:b494f59, Oct 4 2021, 19:00:18) [MSC v.1929 64 bit (AMD64)] on win32

VS Codeのworkspace.jsonに
"args" : ["1×2.txt"]

呼び出しは
files = sys.argv[1]
files = files.encode()
print(files)

です。>246さん、なにかわかりますでしょうか? お願いします。
0248デフォルトの名無しさん
垢版 |
2021/10/21(木) 19:04:23.86ID:YezGVy7K
>>240
サンキュー!こんなとこで宣伝するなんてろくでもないとこだろうからローカルプロキシにNGブチこんどくわ!
0249デフォルトの名無しさん
垢版 |
2021/10/21(木) 19:10:04.13ID:wgFCmdkg
エラー吐かずにスルーする目的でtryを使うのは
行儀としてどうですか?
やめたほうがいいのでしょうか

for:
_try:
__エラーが出ても次の処理を実行
_except Exception as e:
__print(e)
__pass
__continue

みたいな感じです
0251デフォルトの名無しさん
垢版 |
2021/10/21(木) 20:02:45.41ID:T2C3Q12E
>>249
ぜんぜんいいけど
Exceptionじゃなくて想定している例外にしないと
想定外の問題が発生してもすり抜けるのでダメ

実際に例外だしてそれを指定してあげる
たとえば配列の範囲外ならIndexErrorなど
0253デフォルトの名無しさん
垢版 |
2021/10/21(木) 21:35:10.28ID:iSzsEmw9
>>247
シェルのエンコーディングとフォント、ファイル名のエンコーディングを確認するといいんでないかな

UTF-8のファイルで文字列を受け取って、UTF-8のファイルに出力してみて
出力の中身をエディタで確認して問題ないか確認して切り分けしてみれば?
0254デフォルトの名無しさん
垢版 |
2021/10/21(木) 22:23:10.34ID:yuVpO81C
>253
1×2 とUTF-8で書いたtxtを openしてreadしたところ、×が表示されました。
シェルはUTF-8、jsonもUTF-8です。やはりvscodeがなにか悪さしてるのでしょうか?
0255デフォルトの名無しさん
垢版 |
2021/10/21(木) 22:28:15.67ID:EiXMJcNZ
>>249
スルーしていいエラーならいいよ
0256デフォルトの名無しさん
垢版 |
2021/10/22(金) 12:09:19.87ID:KhubwY06
>>241
そのファイルがある場所でlsしてみて
そして、その結果をそのままここに貼って
0257デフォルトの名無しさん
垢版 |
2021/10/22(金) 13:08:40.17ID:pSuh16SX
>256
-a--- 2021/10/21 22:08 8 1×2.txt
表示されます!
なんかvscodeのバグなのか仕様なのかのせいなんですかね…
0259デフォルトの名無しさん
垢版 |
2021/10/22(金) 14:11:33.51ID:X7QNDBcm
PySimpleGUIをつかってスクレイピング用のスクリプトをGUIにしてpyinstallerでexe化(コンソール無し設定)しました。exeで起動するとなにかしらのアクションですぐにコードが強制終了します。調べたところ、スクレイピングに使っているクロームドライバーの自動更新ライブラリがサブプロセスを開始しようとするときにコンソールを封じられているために落ちるってことらしいのですが回避方法がわからないです。知っている方がいたら教えてください。
0260デフォルトの名無しさん
垢版 |
2021/10/22(金) 15:26:37.44ID:NCC4eAK/
>>241 >>258
すまんこれvscodeじゃなくてpowershellのモジュールの方だった
https://social.technet.microsoft.com/Forums/ja-JP/862dda39-0c53-447c-b4bd-05e147a4f9e4/powershell
vscodeからの実行はコピペ+enterで実現してるようでPSReadLineのバグに引っかかる
ターミナル上でRemove-Module PSReadlineを実行した後は正常
当然シェルをbashやコマンドプロンプトに変更でも回避可能
0261デフォルトの名無しさん
垢版 |
2021/10/22(金) 16:28:01.92ID:pSuh16SX
>>260
すごい!!ありがとうございます!
無事、全角×が表示されました!!
これでdebug作業が進みます!
ありがとうございました!!
0262デフォルトの名無しさん
垢版 |
2021/10/22(金) 16:46:07.04ID:DsjZYzXm
>>259
AllocConsole
0263デフォルトの名無しさん
垢版 |
2021/10/22(金) 17:23:28.01ID:X7QNDBcm
>>262
ごめん。調べたけどそれだけじゃわからんかった。OSにGUI用のコンソールを用意してもらうってことなんかな。だとしても実装方法が皆目見当つかん。
0264デフォルトの名無しさん
垢版 |
2021/10/22(金) 20:02:41.52ID:5ieIGpLh
辞書のソート方法を探してたんだけど

https://techacademy.jp/magazine/19309

このページ見たら

dic = {"X": 80, "A": 200, "E": 5, "R": 20, "S": 40}
dic2 = sorted(dic.items())

で出来るって書いてあったがこれ、type(dic2)やったらlistになっとるやんけ
辞書のままソートする方法を普通書かないか?
0265デフォルトの名無しさん
垢版 |
2021/10/22(金) 20:08:47.66ID:5ieIGpLh
これ、元の辞書を並べ替える場合って

dic1.clear

dic2(実はリスト)を
dic1.update(dic2)
ってやるしかないの?
0266デフォルトの名無しさん
垢版 |
2021/10/22(金) 20:13:56.45ID:5ieIGpLh
ちょっと間違えてたから書き直した

dic = {"X": 80, "A": 200, "E": 5, "R": 20, "S": 40}
dic2 = sorted(dic.items())
dic.clear()
dic.update(dic2)

これで辞書のkeyでの並び替えが出来るっぽいんだけど、これ以外に方法ある?
0268デフォルトの名無しさん
垢版 |
2021/10/22(金) 21:15:58.94ID:QiF9wMqh
dictがOrderedDict相当になったとき
順序に依存するコードが増えたら嫌だなとおもったけど
処理コスト変わらんのに便利さを選ばないのも偏狭なんだろうな

>>266
dict(sorted(dic.items()))
0269デフォルトの名無しさん
垢版 |
2021/10/22(金) 21:47:08.80ID:5ieIGpLh
>>267
文字列の長さの数値をキーにして、同じ長さの文字列を値にする辞書を作ったから

dic1 = {5: 'apple',3: 'pen'}
みたいなやつ
>>268
ありがとう
0272デフォルトの名無しさん
垢版 |
2021/10/22(金) 22:59:32.08ID:8L7RGAQS
例えば以下のように、デスクトップにショートカットを作って、
コマンドプロンプトから、Ruby スクリプトを起動すると、
C:\Program Files/ みたいに、半角空白が入っているパスで、バグる

C:\Windows\System32\cmd@.exe /k "ruby C:/Users/Owner/Documents/a.rb"

(注意。書き込めないので間に、@を入れました)

これをショートカットからコマンドプロンプトを通さず、
直接、Ruby スクリプトを起動すると、正常に動く

C:\Ruby25-x64\bin\ruby.exe C:/Users/Owner/Documents/a.rb

とにかく、コマンドプロンプト・Power Shell と、
Linux 系の動的言語との通信には、
半角空白・日本語のファイルパスなど、文字列のバグが多い

VSCode は、WSL2 などLinux, Docker にも対応しているので、動的言語でもバグらない。
バグるのは、コマンドプロンプト・Power Shellの部分
0273デフォルトの名無しさん
垢版 |
2021/10/23(土) 01:41:10.93ID:L2XVMbSO
pilで複数の画像を1枚の背景に貼り付けたい
入力される画像の位置がランダムbbox(x1,y1,x2,y2)なんだけど
すべての座標を含む最小範囲の背景(0,0,x2,y2)ってどうやって計算したらいいのですか?
0274デフォルトの名無しさん
垢版 |
2021/10/23(土) 03:20:28.76ID:L2XVMbSO
あー
bgbbox = min(x1s),min(y1s),max(x2s),max(y2s)

ペースト時x系に-abs(min(x1s)), y系に-abs(min(y1s))
※pip 基点0,0なので

0275デフォルトの名無しさん
垢版 |
2021/10/23(土) 05:04:17.46ID:n7GT2TeK
>>270
超初心者相手にそういう意味の分からん反応止めてくれや

東大が公開してるPythonプログラミング入門の例題に
https://utokyo-ipp.github.io/3/3-1.html

辞書 dic1 と文字列 str1 が引数として与えられたとき、 以下のように dic1 を変更する関数 handle_collision を作成してください。 ただし、dic1 のキーは整数、キーに対応する値は文字列を要素とするリストとします。
dic1 に str1 の長さ n がキーとして登録されていない場合、str1 のみを要素とするリスト ls を作成し、 dic1 にキー n、n に対応する値 ls を登録します。
dic1 に str1 の長さ n がキーとして登録されている場合、そのキーに対応する値(リスト)に str1 を追加します。
以下のセルの ... のところを書き換えて handle_collision(dic1, str1) を作成してください。

def handle_collision(dic1, str1):
...

ってのがあって、その回答が
def handle_collision(dic1, str1):
if dic1.get(len(str1)) is None:
ls = [str1]
else:
ls = dic1[len(str1)]
ls.append(str1)
dic1[len(str1)] = ls
#handle_collision({3: ['ham', 'egg'], 6: ['coffee', 'brandy'], 9: ['port wine'], 15: ['curried chicken']}, 'tea')

だったんだよ
0276デフォルトの名無しさん
垢版 |
2021/10/23(土) 05:08:31.39ID:n7GT2TeK
で、このコード実行すると

dic1_orig = {3: ['ham', 'egg'], 6: ['coffee', 'brandy'], 9: ['port wine'], 15: ['curried chicken']}
handle_collision(dic1_orig, 'tea')

{3: ['ham', 'egg', 'tea'], 6: ['coffee', 'brandy'], 9: ['port wine'], 15: ['curried chicken']}

これになるんだけど、'tea'以外のやついれたらどうなるのかな、って試してみたら

handle_collision(dic1_orig, 'pp')
{3: ['ham', 'egg'], 6: ['coffee', 'brandy'], 9: ['port wine'], 15: ['curried chicken'], 2: ['pp']}
って 2のキーが最後尾に追加されてなんかモヤったからキーを順序どおりの並びにするにはどうすんのかな、って思ったわけ
0277デフォルトの名無しさん
垢版 |
2021/10/23(土) 07:39:54.83ID:uHOK1QLC
1. str1 の長さ n がキーとして登録されていない場合は、追加
2. str1 の長さ n がキーとして登録されている場合は、更新

存在しなければ追加・存在すれば更新は、データベースでも、よくある処理

そりゃ、2文字は登録されていないから、追加される。
2: ['pp']
0278277
垢版 |
2021/10/23(土) 07:45:14.89ID:uHOK1QLC
一般的には、辞書・集合には順序がない。
まれに、辞書・集合へ追加した順番を、記憶している言語もある

だから、順序よく並べたいなら、ソートする
0280デフォルトの名無しさん
垢版 |
2021/10/23(土) 11:51:35.15ID:qhVW7VS5
>>275
お、おう、すまんかった
表示する時にきれいに並べたいだけならpretty printで

from pprint import pprint
pprint(dic)

3.7以降の辞書は挿入順で並んでることが保証されてるんだけど
表示目的のためだけに新しい辞書を作成して挿入しなおして並び替えることは普通やらない

同じ並び替えを何度も繰り返し実行しないといけない場合なら無駄ではないんだけど
その場合は他のデータ構造を使ったほうがいい可能性が高いので
わざわさ並べ直した辞書が欲しい用途ってなんだろうと思って聞いてみた
0282デフォルトの名無しさん
垢版 |
2021/10/23(土) 12:32:34.22ID:n7GT2TeK
>>280
なるほど

いちいち関数の中で並び替えしてたら時間かかるとか実際に使う場面では必要ないとかそういう事なのかな
pprint()で出力すれば良いってのは参考になった
ありがとう
0286デフォルトの名無しさん
垢版 |
2021/10/23(土) 17:01:23.55ID:TEk5cWky
re.complie(パターン)
complie済みのパターンが複数ある場合
パターン同士を結合するのってどうやるのでしょうか?
0287デフォルトの名無しさん
垢版 |
2021/10/23(土) 18:18:18.96ID:skaucHgA
Djangoを始めました
view.pyの中にある変数の中身を確認したいですが方法が分かりません
デバッグ方法はちゃんと分かってませんが一応環境は作りました
見たいのはDjangoチュートリアルにもあるlatest_question_list = Question.objects.order_by('-pub_date')[:5]
の中身です

エディターはvscodeです
0288デフォルトの名無しさん
垢版 |
2021/10/23(土) 18:45:21.20ID:skaucHgA
>>287
すみませんこれ出来ました
ブレークポイントを次の行に作って見たい変数にカーソルホバーさせたら見れました
0289デフォルトの名無しさん
垢版 |
2021/10/23(土) 21:09:29.62ID:qhVW7VS5
>>286
.patternでパターン文字列に一度戻ってから
パターン同士を結合して再度コンパイル
直接結合するAPIは用意されてないと思う
0290デフォルトの名無しさん
垢版 |
2021/10/23(土) 21:54:12.92ID:uHOK1QLC
Ruby なら、Regexp.union でパターンを、OR で合成できる

p Regexp.union(/a/, "*") # => /(?-mix:a)|\*/

p Regexp.union(/a/, /b/, /c/) # => /(?-mix:a)|(?-mix:b)|(?-mix:c)/

arr = [/a/, /b/, /c/]
p Regexp.union(arr) # => /(?-mix:a)|(?-mix:b)|(?-mix:c)/
0291デフォルトの名無しさん
垢版 |
2021/10/23(土) 23:19:51.40ID:oBaQvszz
ルビキチってどこにでも涌くのな
0293デフォルトの名無しさん
垢版 |
2021/10/24(日) 12:57:50.65ID:nICPJrT1
>>289
ありがとうございますパターンが取れました

ptn1 = re.compile("\.gif$").pattern
ptn2 = re.compile("\.jpg$|\.png$",re.IGNORECASE).pattern

ptn2が
"\.jpg$|\.JPG$|\.png$|\.PNG$"
な感じだったらよかったんですけどね
re.compile(ptn1+"|"+ptn2,re.IGNORECASE)
だと
"\.gif$|\.GIF$|\.jpg$|\.JPG$|\.png$|\.PNG$"
と同等?になってしまうので
0294デフォルトの名無しさん
垢版 |
2021/10/24(日) 13:06:47.73ID:nICPJrT1
改めてぐぐってみると
そもそもフラグの記述はいろいろあるみたいですね >>293
(?フラグ:パターン)
これなら基本は文字列でもcompile済でもどちらでもいい気がしました

ptns = ["\.gif$","(?i:\.jpg$|\.png$)"]
ptn = re.compile("|".join(ptns))
0295デフォルトの名無しさん
垢版 |
2021/10/24(日) 14:04:30.70ID:9GD27ADQ
>>293
> ptn2が
> "\.jpg$|\.JPG$|\.png$|\.PNG$"
> な感じだったらよかったんですけどね
それだと .Jpg とかがヒットしなくなる
0296デフォルトの名無しさん
垢版 |
2021/10/24(日) 15:34:01.95ID:dQwbGYLm
Ruby で、漏れは自分で関数を作っている
拡張子を小文字に変換してから、それが配列内にあるかどうか

ただし、jxr はブラウザで表示できない

ary = %w(png jpg jpeg gif webp) # 画像の拡張子

extname = "JPeg"
extname.downcase! # 小文字へ変換する

p ary.include? extname # 含まれている?
#=> true
0298デフォルトの名無しさん
垢版 |
2021/10/24(日) 18:40:19.51ID:ugUepsfY
vscodeでdjangoやってます
views.pyでrenderの第2引数に指定したhtmlやreverseの第1引数のアプリ名:urlネームに書いてあるその場所にGo toしたいのですが方法ありますか?

djangoに限らずpath書いてないとgo to definitionできない感じですか?
0299デフォルトの名無しさん
垢版 |
2021/10/25(月) 17:14:48.98ID:MOhV5cOT
class hoge:
_items = []
_def each(self,callback=None):
__res=[]
___argcount=callback.__code__.co_argcount
__if _argcount==1:
___for item in self.items:
____res.append(callback(item))
__elif _argcount==2:
___for i,item in enumerate(self.items):
____res.append(callback(i,item))
__return res

h=hoge()
h.items = ["a","b","c"]
print( h.each(lambda item: "_"+str(item)) )
print( h.each(lambda i,item: str(i)+"_"+str(item)) )
#['_a', '_b', '_c']
#['0_a', '1_b', '2_c']

callbackでindexも取りたいので↑のように書いたのですが
こうするしかないのでしょうか?
今は引数は、(item)と(i,item)しかとりませんが
仮にcallback内でitemやindexとは別の何か引数を引き継ぎたくなったという場合
どう拡張していけばいいのかな、と思いました
0300デフォルトの名無しさん
垢版 |
2021/10/25(月) 18:13:43.66ID:YeRcjGgP
*argsとか**kwargsで可変長の引数を取るようにすればいい、とかそういう話か?
0301デフォルトの名無しさん
垢版 |
2021/10/25(月) 19:23:30.01ID:MOhV5cOT
>>300
すこし違います
*指定だとインスタンス側でcallbackを書くときに
常にcallback(*arg)とか、callback(**kwards)とかを書かなければならない気がします
>>299の例の場合
each対象はself.itemsなのでcallbackの中身を書くときの引数は
callback(ここでの引数名はitemsに入る値に関係する名前)
にしたいのです

299の例だと拡張されたのはインデックスのみなので、
インデックスが欲しいかほしくないかに関わらずインデックスを取ることにすると
class hoge:
_items = []
_def each(self,callback=None):
__res=[]
__for i,item in enumerate(self.items):
___res.append(callback(item,i))#itemの方が使用頻度高いので引数を逆に渡す
__return res
h=hoge()
h.items = ["a","b","c"]
print( h.each(lambda item: "_"+str(item)) )#エラー
print( h.each(lambda item,i: str(i)+"_"+str(item)) )
と書けると思いましたが
無い引数を渡すとエラーが出てしまいました

この辺の慣習とかあるのか、そもそもそんなことしなくてもいい(継承できるようなテクニックがある)のか
というのがわからないので
iを使わない場合も、callback(i,item)と書けばいいのでは?とか
index情報を持ったitemオブジェクトを返却して、item.itemでitem取得
みたいな方法は保留してます

今考えているのは
callback.__code__.co_varnames[:callback.__code__.co_argcount]
使ってみたりの条件分岐です
0302デフォルトの名無しさん
垢版 |
2021/10/25(月) 20:51:56.35ID:LSRIz4jp
リスト内包表記で得られたリスト
[’金額¥150’,’金額¥222’,’’,’’,’金額¥0’,’金額¥465’]のうち、’’を’金額¥0’に置換するにはどのようにしたらいいですか?

[money.replace("","¥0") for money in moneys]ではだめでした。
0303デフォルトの名無しさん
垢版 |
2021/10/25(月) 21:10:11.44ID:utaK2F0U
>>302
>>> ['金額¥0' if money == '' else money for money in moneys ]
['金額¥150', '金額¥222', '金額¥0', '金額¥0', '金額\0', '金額\465']


ていうか、動くコード貼れよ
0304デフォルトの名無しさん
垢版 |
2021/10/25(月) 21:43:12.61ID:i1JdqDPj
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

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

クソチョンw

在日朝鮮人は強姦と窃盗してる犯罪者!
在日朝鮮人は皆殺しにすべし!
0305デフォルトの名無しさん
垢版 |
2021/10/25(月) 22:45:53.76ID:sv7Zp2+/
>>301
コールバック関数のシグニチャが違えば違うAPIを用意するのが普通
Pythonに限らずJS以外の言語ではそれが普通だと思う
Rubyで言うeachとeach_with_index

HogeをIterableにして
print([f”_{item}” for item in hoge]) や
print([f”{i}_{item}” for i, item in enumerate(hoge)]) することのほうがPythonでは多いと思う
0306デフォルトの名無しさん
垢版 |
2021/10/26(火) 18:26:21.05ID:58PW1UcQ
javascriptに限った話じゃないんだけど、
Max Retry、っていったら純粋に"リトライ"の回数でカウントする?それとも総実行回数を指す?
MaxRetry=5なら
初回の1回含めて最大6回やるのか、5回なのか。
なんか気になって。
0310デフォルトの名無しさん
垢版 |
2021/10/27(水) 16:50:18.70ID:rwCBpLuv
pyodbcの接続時にスキーマまで指定する方法ありませんか
接続文字列に入れてもエラーになってしまいます
0311デフォルトの名無しさん
垢版 |
2021/10/27(水) 18:14:05.36ID:CtZ0vCqQ
変数の名付けでちょうど良い具合がわからない

たとえば文字列の長さの変数をstr1_wordlengthとしたんだけど
---------------------
str1 = 'apple'
str1_wordlength = len(str1) # 5
#文字列と文字数を格納する辞書dic1をつくる
dic1 = {str1_wordlength: str1} # {5: 'apple'}
---------------------
「str1_wordlength ならたぶん意味が通じると思うけど長過ぎじゃね? 毎回これ書くのか?」とも思うし
この変数「名付けするの面倒だからいっそ a でいいんじゃね?」とも思うし
「そもそも変数作る必要あるか? len(str1)は変数名より短いじゃん?」とも思うし

練習問題やってるうちはぶっちゃけ何でも良いと思うんだが
後々を考えるとどうしたらいいんだろうな、と
0313デフォルトの名無しさん
垢版 |
2021/10/28(木) 02:31:25.25ID:bnoFQANv
strの特殊メソッドつかったらprintにも反応するんですね・・
class pr:
_value="aa"
_def __str__(self):
__return self.value+"bb"
p=pr()
print(p)

def __str__の中にエラー処理いれてたらprintでエラー引っかかっていて
気づくのに時間かかりました・・
0315デフォルトの名無しさん
垢版 |
2021/10/28(木) 06:56:16.71ID:dSweiYMb
特殊メソッドは使わんほうが無難
ていうかPythonはクラス自体使わない方がいい
昔ながらの構造化言語としてシンプルに使うのがベスト
0319デフォルトの名無しさん
垢版 |
2021/10/28(木) 10:18:44.69ID:MKFZM1zj
>>312
結果的にはファイルdnsで出来ますた
0320デフォルトの名無しさん
垢版 |
2021/10/28(木) 12:42:04.06ID:RV1LSDaq
PythonでマイクロソフトAccessをDBとして使う実例は多いけど、単にAccessをマクロ起動かける例が無いんです
誰か成功した人は居ますか?
0321デフォルトの名無しさん
垢版 |
2021/10/28(木) 12:56:15.77ID:XVuwIiyB
Access側のマクロのエントリポイント用の関数を造っておく
pywin32でその関数を呼ぶ
0324デフォルトの名無しさん
垢版 |
2021/10/28(木) 14:14:58.06
from datetime import datetime
now=str(datetime.now())
#2021-10-28 05:12:03.857881
#この文字列を、datetime型に変換したい
_at=now.split(" ")
_at[0]=_at[0].split("-")
_at[1]=_at[1].split(":")
print( datetime(int(_at[0][0]),int(_at[0][1]),int(_at[0][2]),int(_at[1][0]),int(_at[1][1]),int(float(_at[1][2].split("+")[0])) ) )

としたのですがこれってスマートなやり方ではないですよね・・?
ようはstr(datetime)でフォーマットが決まってるのだから、もっと簡単にその文字列からdatetime型に変換できたらいいのに
と思うのですが・・
0327デフォルトの名無しさん
垢版 |
2021/10/28(木) 16:09:10.81
>>325
いえ・・そういうことじゃないんです
それだと指定子を選定する作業が出てくるかもしれないので・・

>>326
うおおおおおおあったんですね ありがとうございます!!!
from datetime import datetime
now=datetime.now()
print(str(now))
str2dt=datetime.fromisoformat(str(now))
print(now==str2dt)#True

できました!!!
0328デフォルトの名無しさん
垢版 |
2021/10/28(木) 17:41:33.23ID:Nbft1WLw
>>314
これなんですけどvenvを推奨していてdjangoのことも書かれているpythonの本です
名前を忘れました
誰か分かりませんか?
0329デフォルトの名無しさん
垢版 |
2021/10/28(木) 17:46:38.21ID:IFkzxSt8
テキストとかだと
list = [0]*10 は [0,0,0,0,0,0,0,0,0,0] になるから初期値作るのに使えるぞ
とか書いてあるのに

list1 = [[0,0,0]]*3
list2 = [[0,0,0],[0,0,0],[0,0,0]]
list3 = [[0,0,0]] + [[0,0,0]] + [[0,0,0]]

print(list1 == list2)
print(list2 == list3)
--------------------
True
True

この結果は両方Trueなんだけど

list1[0][0] = 1
list2[0][0] = 1
list3[0][0] = 1
print(list1)
print(list2)
print(list3)
--------------------------------
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]

こうなるのって結構罠じゃね?
0333デフォルトの名無しさん
垢版 |
2021/10/28(木) 21:08:20.17ID:WnlLUDNQ
os.walkで一発だろ。
0334デフォルトの名無しさん
垢版 |
2021/10/28(木) 21:20:53.36ID:3jEWrZM3
django2.2、vscode、venvでプロジェクト作りました
models.py

from django import models

Import "django.utils" could not be resolved from source Pylance
とエラーになります

解決策ありますか?

因みにdjango3.2で作ったプロジェクトではエラーでませんがpythonインタープリターがPython3.9.7 64-bit ('mysite': venv) ./mysite/bin/pythonとなってます

2.2でのプロジェクトではPython 3.9.7 64-bit /opt/homebrew/bin/python3となってます
0335デフォルトの名無しさん
垢版 |
2021/10/29(金) 00:14:03.10ID:qT0pkZDa
>>329
Ruby では「たのしいRuby」みたいな入門書に書いてあるけど、

配列を初期化する際に、ブロックを渡さないと、
浅いコピー、つまり参照だけのコピーとなり、
実体が1つしかないので、同じオブジェクトを指してしまう

初期化時にブロックを渡すと、3つの実体が作られる

ary = Array.new( 3, [ 0, 0, 0 ] )
ary[ 0 ][ 1 ] = 1
p ary #=> [ [0, 1, 0], [0, 1, 0], [0, 1, 0] ]

ary2 = Array.new( 3 ) { [ 0, 0, 0 ] }
ary2[ 0 ][ 1 ] = 1
p ary2 #=> [ [0, 1, 0], [0, 0, 0], [0, 0, 0] ]
0336デフォルトの名無しさん
垢版 |
2021/10/29(金) 00:29:20.81ID:qT0pkZDa
Ruby on Rails では、Node.js も使うから、
日本人が作った、バージョンマネージャーのanyenv で、
19 言語を、統一した使い方で管理している

Renv, crenv, denv, erlenv, exenv
goenv, hsenv, jenv, jlenv, luaenv
nodenv, phpenv, plenv, pyenv, rbenv
sbtenv, scalaenv, swiftenv, tfenv

which ruby
/home/<ユーザー名>/.anyenv/envs/rbenv/shims/ruby

which node
/home/<ユーザー名>/.anyenv/envs/nodenv/shims/node

venv はPython の標準だけど、多言語を使う際、
各言語のバージョンマネージャーの使い方が異なるから、覚えられない

基本、主要フレームワーク・ゲームエンジンなどは、掌田津耶乃が本を出している。
ただし、猿向きで簡単だけど、知識は少なめだから、1冊目には良い

例えば、Railsでは黒田努の本の方が、本格的
0339デフォルトの名無しさん
垢版 |
2021/10/29(金) 10:21:09.67ID:fhDC1KF/
seleniumを起動してchromeドライバから下記を行うとyahooはすぐにページ接続して遷移できるのに楽天はページ接続に時間がかかります。

seleniumではなく、普通にchromeを起動して手動でurlを入力する場合は楽天もすぐにページに接続できます。

原因や対応わかるかた教えてください。

janlist = ["4976365125510","4976365200934","4976365158013"]
for jan in janlist:
url=f"https://search.rakuten.co.jp/search/mall/{jan}/?filter=fs-fsl&s=2"
driver.get(url)
url=f"https://shopping.yahoo.co.jp/search?p={jan}&X=2"
driver.get(url)
0342デフォルトの名無しさん
垢版 |
2021/10/29(金) 12:32:43.97ID:9CukeuuL
>333
os.walk 勉強中。
すっごい便利機能だけど高機能すぎて、forループでサブフォルダーを回していくつもりだったから困惑。
どうすればいいんだ!
0343デフォルトの名無しさん
垢版 |
2021/10/29(金) 17:17:25.29ID:d8BIZQAf
classの__init__()するclassmethodが使いたいんだけどできますか?

c = Class()
c.method()

を一行で書きたいだけです
Class.method()
0346デフォルトの名無しさん
垢版 |
2021/10/29(金) 20:26:40.87ID:/8Rm9/az
>>343
method()がselfをreturnすれば
c=Class().method()
とできる
0348デフォルトの名無しさん
垢版 |
2021/10/29(金) 21:26:19.76ID:AIexy1X9
このページの404エラーの箇所をベースに学習しています
https://docs.djangoproject.com/ja/3.2/intro/tutorial03/

DjangoにHttp404というクラスがあります
Exceptionクラスを継承しています(これはBaseExceptionを継承しています)

コントローラーにてtry文のexceptの中に
raise Http404("これは404です")
を書くと推移先の画面にはPage Not found(404)と表示されます

しかし自分でExceptionを継承した、passが書かれたクラスAを作って上記と同様にこのクラスをraiseすると画面にはA at /polls/
これは404です
と表示されます(Page Not found(404)とは表示されない)

一体どの段階でHttp404クラスに特別な実装が行われたんですか?
0349デフォルトの名無しさん
垢版 |
2021/10/29(金) 23:15:06.20ID:krcALBmR
>>348
特別な実装はされてない
django/core/handlers/exception.pyで例外捕まえたときにインスタンス見て処理振り分けてるだけ
0350デフォルトの名無しさん
垢版 |
2021/10/29(金) 23:43:42.33ID:ZYpuK0cb
>>349
おお!
どうもです
後で見てみます
そのexeption.pyでviewなどでraiseされた例外を捕まえてフロントに適切なHttpResponseオブジェクトを送ってるんですかね?あとでそのモジュール見てみます
0351デフォルトの名無しさん
垢版 |
2021/10/30(土) 01:26:36.60ID:fDTZDMBU
>>342
馬鹿には無理
0352デフォルトの名無しさん
垢版 |
2021/10/30(土) 10:12:33.06ID:V5MhI+QS
>>343
即席だけど何度も使うつもりなら、シングルトンにしておいた方がいいだろう。
class Hoge:
__instance = None
def __new__(cls):
if cls.__instance is None:
cls.__instance = object.__new__(cls)
return cls.__instance
Hoge().method()
0354デフォルトの名無しさん
垢版 |
2021/10/30(土) 12:49:58.82ID:xUY0JK8T
他クラスのインスタンスを生成するならともかく
自クラスなら__init__で対応したほうがいい
0355デフォルトの名無しさん
垢版 |
2021/10/30(土) 17:28:58.03ID:6LdaSTDR
>351
ありがとう。walkの使い方わかってきたよ。
フォルダの深さが1段ならできた。2段だと想定外の動きになるのでまだ検討が必要。
多層になるとforで回して掘っていった方が良いのかな?
0356デフォルトの名無しさん
垢版 |
2021/10/31(日) 02:00:51.68ID:hGI7wBpw
Ruby には、walk 無いから、glob でやってる

VB のコードでは、しょっちゅう再帰で、子の階層へ降りていく。
これが典型的な馬鹿の見本w
0357デフォルトの名無しさん
垢版 |
2021/10/31(日) 03:36:26.99ID:Fmzj87Tl
type(a)で
<class 'sqlalchemy.sql.elements.BooleanClauseList'>
と出るオブジェクトaを
if a==None:
みたいにifに入れたら
Boolean value of this clause is not defined
ってエラーがでました
条件分岐に入れることでそもそもエラーがでる
という今まで経験したことないエラーが出ました
こういう場合、どうやって条件分岐すればいいのでしょうか
0359デフォルトの名無しさん
垢版 |
2021/10/31(日) 06:55:40.09ID:wNGz0WbD
関数Aからしか呼ばれないとわかっている関数Bがある場合、
BをAの内側に定義してしまうスタイルってありですかね
こうすれば見た目にも局所的であるとわかるし、
Aの外からBを呼ぶことはできないから安全と思うのですが

※関数内関数はクロージャっていう機能でも使うらしいんですが、
そっちはよくわからんので置いておくとして…
0360デフォルトの名無しさん
垢版 |
2021/10/31(日) 12:40:55.03ID:Fmzj87Tl
>>358
ありがとうございますできました!

なぜそうなるのかはわかりませんが一応検証です

from sqlalchemy import and_,or_,text
id_q=or_(*[text("id=1"),text("id=2")])
name_q=or_(*[text('name="tarou"'),text('name="tanaka"')])
q=and_(*[id_q,name_q])

def ck1(q):
_try:
__if q is None:
___print("q is None")
__else:
___print(q)
_except Exception as e:
__print(e)

def ck2(q):
_try:
__if q==None:
___print("q is None")
__else:
___print(q)
_except Exception as e:
__print(e)
print("### is None")
ck1(q)
ck1(None)
print("")
print("### ==None")
ck2(q)
ck2(None)

### is None
(id=1 OR id=2) AND (name="tarou" OR name="tanaka")
q is None
### ==None
Boolean value of this clause is not defined
q is None
0362デフォルトの名無しさん
垢版 |
2021/10/31(日) 13:21:43.76ID:e6cnICXj
>>345
エンジニア基礎試験とデータ分析試験の話なら、油断していると落ちる程度に考えておけばいいよ。
python使いこなしているなら普段使わないような標準モジュールの問題を暗記すればいける
0363デフォルトの名無しさん
垢版 |
2021/10/31(日) 14:21:08.43ID:a/o9PbUa
PILのimageオブジェクトを複数扱うとき
その画像固有の色々なデータをどこかに保管しといて使い回すんだけど
sizeとかのプロパティと同じじゃんと思ってimageオブジェクトごとにインスタンス変数としてぶちこんでたんです
im1.x_rate = yyy
みたいな。

重いデータを押し付けるわけでないので現状別に困ってはいないけど、なにか問題ありますか? アクセス速度とか、データ保持周りの都合とかで
普通は辞書とかで管理しますよね
あとこういうインスタンスに、本来無いメンバーをねじ込むことができるのって、他の言語にはあまりない特徴なのですか?
0364デフォルトの名無しさん
垢版 |
2021/10/31(日) 14:52:05.62ID:e6cnICXj
>>363
不都合はないと思われるけど一般的ではないな

プロパティのねじ込みは他の言語にもある。Javascriptはねじ込みと呼び出しがもっと自由度高い。
0365デフォルトの名無しさん
垢版 |
2021/10/31(日) 15:21:43.12ID:Q9Xu5pvX
>>364
勉強になります
0366デフォルトの名無しさん
垢版 |
2021/10/31(日) 17:14:53.49ID:Yc4PEJna
動的言語のいいところでもあり悪いところでもある。
当然こういうのを徹底的に嫌う人はいる。
0367デフォルトの名無しさん
垢版 |
2021/10/31(日) 17:19:32.57ID:Q9Xu5pvX
まあ入れたかどうか分かりづらい
自分で全部把握してないとしんどいですね
あとpylanceがすげえ怒ってる
0370デフォルトの名無しさん
垢版 |
2021/10/31(日) 18:11:50.92ID:4KbMhR6u
バグの温床
0371デフォルトの名無しさん
垢版 |
2021/11/01(月) 11:52:01.98ID:f7xOE2SJ
def _is(f):
_if f:
__return True
_else:
__raise Exception("error")

try:
__is(True)
_print("success")
except Exception as e:
_print(e)

何もしない、もしくはエラーを吐く
という_is()の行が、一行で完結していると
個人的に可視性が悪いように感じるのですが工夫や慣習とかあるのでしょうか?

例えば_isをTrueもしくはFalseを返すようにして
if not _is(True):
_raise Exception("error")
みたいにすれば「ここで条件分岐していますよ」というのがパット見で
どう分岐しているのかがわかります
しかし関数実行で一行で完結してるだけだと何してるかわからないし
関数名に「エラーかどうかチェックし、エラーがあるならエラーを吐く」的な名前を付けるにも
どういうのが適切なのかわかりません
0372デフォルトの名無しさん
垢版 |
2021/11/01(月) 12:51:54.43ID:MaHd86e9
isはboolを返すようにする

if is_foo()
else

try:
check_foo()
except

あるいは

try_foo()
if try_foo()
else

が自然
0373デフォルトの名無しさん
垢版 |
2021/11/01(月) 12:53:04.27ID:1SV0gAru
>>371
何をしたいのかよくわからないけど
設計アドバイス有りのほうの命名スレで聞いてみれば?
0374デフォルトの名無しさん
垢版 |
2021/11/01(月) 14:26:50.37ID:z/x9VzKb
文法以前に本人の頭が混乱してるな
病院池
0375デフォルトの名無しさん
垢版 |
2021/11/01(月) 16:23:27.64ID:SSiHi0ki
まずはPythonスレでインデントをアンダーバーで代替するのやめて全角空白「 」にしたらどうかな?
0378デフォルトの名無しさん
垢版 |
2021/11/01(月) 16:50:34.49ID:SSiHi0ki
>>377
連続する半角スペースはスレ投稿時に1つに短縮されてしまうでしょ。
他にいい方法があれば教えてもらいたいくらい。挑発とかじゃなくて真面目に。
0379デフォルトの名無しさん
垢版 |
2021/11/01(月) 17:10:45.07ID:+PGSxGGW
class Cls(object):
def __new__(cls):
self = object.__new__(cls)
print('__new__ :', str(id(self)))
return self

def __init__(self):
print('__init__:', str(id(self)))
self.attr = 'Hello, world!'

obj = Cls()
0381デフォルトの名無しさん
垢版 |
2021/11/01(月) 17:17:16.17
テスト
連続全角スペース 2個
「  」
連続半角スペース 2個
「 」
連続アンダーバー 2個
「__」
0382デフォルトの名無しさん
垢版 |
2021/11/01(月) 17:19:02.31
続いてテスト
先頭空白の、

連続全角スペース 2個
  」
連続半角スペース 2個

連続アンダーバー 2個
__
0384デフォルトの名無しさん
垢版 |
2021/11/01(月) 17:33:20.31ID:usQd0Ibl
まあ
 全角スペース積んで
  それらしいインデント表現できるなら
   とはいえ全角スペースって…


   あと>>379はパソコンで表示できねーのでやめとけ
0386デフォルトの名無しさん
垢版 |
2021/11/01(月) 17:48:52.19
ちなみに過去スレみても全角スペースインデント派が極端に少ないように思えるけどなぜ
0387デフォルトの名無しさん
垢版 |
2021/11/01(月) 17:50:38.30ID:SSiHi0ki
Pythonはインデントそのものに文法的な意味があるから、他言語スレのような雑なコピペ、やりにくい
0390デフォルトの名無しさん
垢版 |
2021/11/01(月) 17:54:59.57ID:QIRv2mIK
意味があるからこそアンダーバーで表現してるんでしょ
5ch内では_が確実
コピペするなら^_*くらい置換しろよ
0392デフォルトの名無しさん
垢版 |
2021/11/01(月) 18:06:02.27
>>1
if エラーを解決したい場合:
 print('表示されたエラーの全文')
 print('実行環境')
else:
 if インデントが崩れてチヌ:
  コードうp用サイトに貼ってこいください()
 else:
  ご自由に()

#エラー解決が目的でなく、ただの質問なら自由でおk
0397デフォルトの名無しさん
垢版 |
2021/11/01(月) 20:11:25.62ID:nDDBE8sn
馬鹿に優しすぎるスレも考え物
0404デフォルトの名無しさん
垢版 |
2021/11/01(月) 21:43:46.72ID:+3mYHrQj
じゃ、スペース併用で
space(0)
space(1)
space(2)
space(3)
space(4)

もう一つのパターン
space(0)
space(1)
space(2)
space(3)
space(4)
0407デフォルトの名無しさん
垢版 |
2021/11/01(月) 22:04:51.14ID:FRFHTlVD
>>368
>>400
> 400 デフォルトの名無しさん sage 2021/11/01(月) 21:03:19.83 ID:+3mYHrQj
> でテスト
> space(0)
> space(1)
> space(2)
> space(3)
> space(4)
0408デフォルトの名無しさん
垢版 |
2021/11/01(月) 22:07:56.25ID:FRFHTlVD
すまん間違って書き込んでしもた

&&nbsp; だとどうか
space(0)
&nbsp;space(1)
&nbsp;&nbsp;space(2)
&nbsp;&nbsp;&nbsp;space(3)
&nbsp;&nbsp;&nbsp;&nbsp;space(4)
0409デフォルトの名無しさん
垢版 |
2021/11/01(月) 22:10:07.03ID:vUqioc9F
space(0)
&nbsp;space(1)
&nbsp;&nbsp;space(2)
&nbsp;&nbsp;&nbsp;space(3)
&nbsp;&nbsp;&nbsp;&nbsp;space(4)
0413デフォルトの名無しさん
垢版 |
2021/11/01(月) 22:56:34.54ID:sInySGRJ
結局のところ専ブラによって半角スペースの扱いと同等とみなす文字違うから
トリッキーな事するくらいなら>>1のサイト使った方がいいかと
0414デフォルトの名無しさん
垢版 |
2021/11/02(火) 00:04:30.18ID:cL54tPf/
別サイトに散らすと、そちらのほうが消えれば集合知としての掲示板の意味がなくなる
0415デフォルトの名無しさん
垢版 |
2021/11/02(火) 00:09:02.19ID:lNPw5frO
pythonどころか5ch初心者ですが質問いいですか?
anacondaでのライブラリのロードが出来ない事での質問です
0416デフォルトの名無しさん
垢版 |
2021/11/02(火) 09:39:34.41ID:px0qcy1y
anaconda より pip
0417デフォルトの名無しさん
垢版 |
2021/11/02(火) 14:07:05.67ID:9BPbJ83e
ターミナルからライブラリ自体はダウンロード出来て、それがライブラリとして存在しているのは確認出来たのですが、

本文
#%matplotlib inline
import numpy as np
from scipy import sparse
#import matplotlib.pyplot as plt
import pandas as pd
#import matplotlib
import mglearn
from IPython.display import display
import sys
import scipy as sp

エラー内容
ImportError: dlopen(/opt/anaconda3/lib/python3.8/site-packages/PIL/_imaging.cpython-38-darwin.so, 2): Library not loaded: @rpath/libjpeg.9.dylib
Referenced from: /opt/anaconda3/lib/python3.8/site-packages/PIL/_imaging.cpython-38-darwin.so
Reason: Incompatible library version: _imaging.cpython-38-darwin.so requires version 14.0.0 or later, but libjpeg.9.dylib provides version 12.0.0

やってみたこと
ライブラリのバージョンダウン
0418デフォルトの名無しさん
垢版 |
2021/11/02(火) 14:09:16.74ID:9BPbJ83e
環境
python3.8
ide : anaconda juster notebook
os : macos catalina 10.15.7
0420デフォルトの名無しさん
垢版 |
2021/11/02(火) 15:31:56.15ID:px0qcy1y
anaconda が糞な訳じゃなくて >>415 があほなんだと思う
0421デフォルトの名無しさん
垢版 |
2021/11/02(火) 16:28:48.44ID:43SS6bxs
既存の環境にぐちゃぐちゃ絡みつくからなあ
venv+pipよ
0422デフォルトの名無しさん
垢版 |
2021/11/02(火) 17:41:01.75ID:9BPbJ83e
libjpeg.dylib調べてきます。
ほんと初心者でわからんことばっかっす。
0423デフォルトの名無しさん
垢版 |
2021/11/02(火) 19:29:02.24ID:0Xy7v0Wb
pipenvって少数派なのかな
0424デフォルトの名無しさん
垢版 |
2021/11/02(火) 19:38:43.07ID:EooZJJGk
pythonのパッケージマネージャーはもうpoetry一択って結論出てる

PEP582が実現すればいずれPDMも選択肢に入るかもしれない
いずれにせよ現時点ではpoetry以外を使う理由はない
0426デフォルトの名無しさん
垢版 |
2021/11/02(火) 20:59:02.62ID:28sKmwTr
標準使うのが一番、便利な流行り機能はどうせ標準に取り込まれるんだから
あちゃこちゃ手出すよりvenv一択!
0431デフォルトの名無しさん
垢版 |
2021/11/02(火) 23:04:27.39ID:6VLiUVJr
漏れは、WSL2, Ubuntu 18.04 で、
日本人が作った、バージョンマネージャーのanyenv を使っている

Renv, crenv, denv, erlenv, exenv
goenv, hsenv, jenv, jlenv, luaenv
nodenv, phpenv, plenv, pyenv, rbenv
sbtenv, scalaenv, swiftenv, tfenv

これで、ruby, node.js などの多言語のバージョンを、統一的に扱える。
各バージョンマネージャーの使い方を覚えなくても良いので楽

which ruby
~/.anyenv/envs/rbenv/shims/ruby

which node
~/.anyenv/envs/nodenv/shims/node
0433431
垢版 |
2021/11/03(水) 00:00:30.86ID:XfZZ+0lv
でも、有名な多言語のバージョンマネージャーは、asdf/anyenv しかないでしょ?
0434431
垢版 |
2021/11/03(水) 00:09:48.64ID:XfZZ+0lv
特に、node.js では、ndenv がnodenv へ乗り換えるように言ってて、
他には、nvm, n を使う人もいる

バージョンマネージャーが乱立していて、訳が分からない
0435デフォルトの名無しさん
垢版 |
2021/11/03(水) 00:25:34.93ID:U7i9huA/
全然訳が分からなくない
nvm以外は泡沫
日本のみnodebrewのシェアが少し高いくらい
env系使ってるのは他言語から渡ってきて「ヤダヤダ、違うの覚えるのヤダー!」ってダダ捏ねてる無能のみ
0436デフォルトの名無しさん
垢版 |
2021/11/03(水) 01:28:38.00ID:f3FJf/OR
そこまで多言語に対応する必要ないんだよね
自分で使う言語選べる立場だからさ
糖質でも採用されるようなクソザコの下請けと違うんだよ
0437デフォルトの名無しさん
垢版 |
2021/11/03(水) 05:23:29.54ID:ixyj7YWU
何とかenvの乱立がPython普及の足かせになってる
ググるとオワコンenvの情報が膨大に引っかかってくるので
初心者が最適解を見つけるのはまず不可能
ブログやQiitaに古い記事を置きっぱなしのやつらは
汚染源になっていることを自覚して欲しい
0440デフォルトの名無しさん
垢版 |
2021/11/03(水) 08:14:46.32ID:Ubw2Gqz6
docker + poetry

仮想環境なんか使う必要ない
コンテナイメージ変える方がシンプルで取り回しがいい
0441デフォルトの名無しさん
垢版 |
2021/11/03(水) 08:42:58.91ID:RAebC74D
seleniumの設定について教えてください。
navigator.webdriverをFalseにしたいです。

普段は下記で起動しているのですが、何を追加したらnavigator.webdriverをFalseにできますか?

from selenium.webdriver import Chrome, ChromeOptions, Remote
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.action_chains import ActionChains
import lxml.html
import random
import time
import re
import numpy as np

options = ChromeOptions()

#windowサイズを決める
options.add_argument('--window-size=1920,1600')

#プロファイルを追加する
options.add_argument('--user-data-dir=/home/goya/crawler/profile')

#ヘッドレスモードを有効にさせる場合は、次の行のコメントアウトを解除する
#options.headless = True
#ChromeのWebDriverオブジェクトを作成する。
driver = Chrome(options=options)
0443431
垢版 |
2021/11/03(水) 11:56:46.09ID:XfZZ+0lv
anyenv update
で、anyenvで入れた、**env系の全てをアップデートできる

anyenv-git は、
anyenv git pull
で、anyenvで入れた、**env系の全てのgitコマンドを実行する

rbenv install -l
3.0.2

nodenv install -l
17.0.1

多言語をやる人は、操作が統一されているから良い
0446デフォルトの名無しさん
垢版 |
2021/11/03(水) 13:02:51.65ID:RAebC74D
>>444
ありがとうございます
Google翻訳して読んで実装してみます!!!!
0447デフォルトの名無しさん
垢版 |
2021/11/03(水) 13:58:05.52ID:RAebC74D
>>444
navigator.webdriverをFalseにできました!!
設定できてからしばらくはクローリングできてたんですけど、すぐにまたbot認定されてしまいました。
ほかに何をすればbot認定回避できるんだろう?
昨日まではnavigator.webdriverをFalseにしてなくても問題なくクローリングできてたのに。。。
0448デフォルトの名無しさん
垢版 |
2021/11/03(水) 14:02:36.28ID:YDDGMZzD
webdriverをFalseにしても駄目ならそのサイトがどういうbot対策してるか次第だろう
一般的な回答はない
0450デフォルトの名無しさん
垢版 |
2021/11/03(水) 15:29:02.45ID:RAebC74D
>>448
ログインせずにamazonをスクレイピングしてたんだ。
新品出品者一覧ページだけが今日からどうしても取れなくなった。
navigator.webdriverをFalseにしてもだめ。
useragentのクロームのバージョンをいじると少しの間はスクレイピングできるんだが、少しするとロボット対策ページがでるようになる
0454デフォルトの名無しさん
垢版 |
2021/11/03(水) 19:46:52.23ID:RAebC74D
>>449のundetected_chromedriverも試してみたけどだめそうだ
今日から急にできなくなったから他の人にも影響でて誰か解決策を見つけてくれることを祈ろう
0455デフォルトの名無しさん
垢版 |
2021/11/03(水) 21:06:34.94ID:Q82Zq3XZ
ツイッターで見かけたんだけど
tkinterのentryで
選択範囲に何かすると検証可否に関わらず選択範囲と中身が消える挙動って
こんだけしないと回避できないの?

https://i.imgur.com/ldiCdw0.jpg
0456デフォルトの名無しさん
垢版 |
2021/11/03(水) 21:37:10.82ID:seSNXpAW
目的がAmazonの商品情報ならAPIつかえばいいのに
習作ならAmazonに固執する必要ないし
0457デフォルトの名無しさん
垢版 |
2021/11/03(水) 22:14:34.64ID:nn1iuVsd
APIは無料じゃないので。
0459デフォルトの名無しさん
垢版 |
2021/11/04(木) 03:13:20.72ID:vgkZPDuF
venv環境内でpip install --user 自作のパッケージのpath としてもERROR: Can not perform a "--user" install. User site-package are not visible in this virtualenv.と出て出来ません

どうすればいいですか?
0462デフォルトの名無しさん
垢版 |
2021/11/04(木) 11:06:53.47ID:JyTL4wpj
>>450
UserAgentをランダムに変化させ続けるとか
cookieを毎回(必要最小限)リセットするとか

自分でスクリプト描いてるなら自由に戦えばよろし
0463デフォルトの名無しさん
垢版 |
2021/11/05(金) 07:42:42.91ID:aGM278ZV
psycopg2でpostgresqlを勉強してるのですが下記のクエリを実行するにはpsycopg2でどう書けばいいですか?

SELECT
user_id
, CASE
WHEN register_device = 1 THEN 'PC'
WHEN register_device = 2 THEN 'SP'
WHEN register_device = 3 THEN ' アプリ '
-- デフォルトの値を指定する場合は ELSE 句を用いる
-- ELSE ''
END AS device_name
FROM mst_users
;

下記で実行してもうまくいきませんでした。
0464デフォルトの名無しさん
垢版 |
2021/11/05(金) 07:43:49.46ID:aGM278ZV
# psycopg2 モジュールのインポート
import psycopg2

# PostgreSQL Server へ接続
conn = psycopg2.connect('host=localhost port=5432 dbname=〇〇 user=〇〇 password=〇〇')
# カーソルを取得
c = conn.cursor()

#execute()メソッドでSQL文を実行する。
#このスクリプトを何回実行しても同じ結果になるようにするため、mst_usersテーブルが存在する場合は削除する。
c.execute('DROP TABLE IF EXISTS mst_users')

#mst_usersテーブルを作成する。
c.execute("""
CREATE TABLE mst_users(
"user_id" text,
"register_data" text,
"register_device" integer
)
""")


#executemany()メソッドでは複数のパラメーターのリストで指定できる。
#パラメーターの数(ここでは3つ)のSQLを順に実行できる。
c.executemany('INSERT INTO mst_users VALUES(%(user_id)s, %(register_data)s, %(register_device)s)',
[{"user_id":"u003","register_data":"2016-08-27", "register_device":2},
{"user_id":"u004","register_data":"2016-08-28", "register_device":3},
{"user_id":"u005","register_data":"2016-08-29", "register_device":2},
])
0465デフォルトの名無しさん
垢版 |
2021/11/05(金) 07:44:04.24ID:aGM278ZV
#コードをラベルに置き換えるクエリ(WHEN (条件式) THEN(条件を満たす場合の値))
c.execute("""
SELECT
user_id,
CASE
WHEN register_device = 1 THEN 'PC'
WHEN register_device = 2 THEN 'SP'
WHEN register_device = 3 THEN ' アプリ '
-- デフォルトの値を指定する場合は ELSE 句を用いる
ELSE ''
END AS device_name
FROM mst_users;
""")

#変更をコミット(保存)する
conn.commit()

#保存したデータを取得するSELECT文を実行する
c.execute('SELECT * FROM "mst_users"')
#クエリの結果はfetchall()メソッドで取得できる。
for row in c.fetchall():
#保存したデータを表示する
print(row)

#コネクションを閉じる
conn.close()
0466デフォルトの名無しさん
垢版 |
2021/11/05(金) 08:12:10.06ID:w3w9SeME
>>463
> 下記で実行してもうまくいきませんでした。
・実行したらどうなって
・どうなって欲しい
のかを書けよ…
0468デフォルトの名無しさん
垢版 |
2021/11/05(金) 10:52:47.15ID:CgcDsDN+
会話が不自由なのは頭が不自由なのに起因
0470デフォルトの名無しさん
垢版 |
2021/11/05(金) 12:45:07.02ID:bB3TtMEF
>>463
まず、DBってデータを永続化させるためのものだから
コメントにあるような「何回実行してもおなじになるように」(←べき等性、という)
のくだりの処理は一般的ではない

メンテしたいならDBbouer(名前うろ覚え)やA5sqlみたいなツールでメンテしたほうがいい

つぎに、テーブルの扱いだけど
テーブル定義の段階で一意キーを定義すれば
上にあるやうなinsert複数回実行したらデータが多重登録されることを防げる
キーに設定したくないときはinsert条件をつけてあげるといい

テーブル定義、データの登録と済んだらつぎにセレクト文でデータを参照できるようになる

まあ、pythonの勉強というよりDBの勉強したほうがよさそうな感じやね
0471デフォルトの名無しさん
垢版 |
2021/11/05(金) 12:56:19.66ID:bB3TtMEF
>>465
ついでにそのスクリプトについていうと
まずinsertのあとコミットかけないとポスグレって参照できなかった気がする
1queryごとにwith句でもつかって接続しなおしたほうが分かりやすいのではないかと

つぎに、コメントに「コードをラベルに書き換える」とあって、そのあとまたセレクトかけてるけど
たぶんこれはあなたがセレクト文の性質を誤解してる

最初のセレクト文で端末コードごとに表示文字を切り替えてるけど
実はこのセレクトで既にデータをとり終えて、表示できる状態になってる
また、セレクトはあくまでデータの参照(写像)であって、データの書き換えは行わない
出力の見かけを変更する処理じたいはそれで正しい
0472デフォルトの名無しさん
垢版 |
2021/11/05(金) 15:54:39.51ID:sm1wg6Gg
めちゃいい加減なこと言ってるな
君も一緒にDBの勉強したほうがよさそうな感じやね
0475デフォルトの名無しさん
垢版 |
2021/11/05(金) 18:22:58.00ID:IF3gwUAV
いろいろ回答ありがとうございます。
もう少しで帰宅できるので帰ったら試してみます。
0477デフォルトの名無しさん
垢版 |
2021/11/05(金) 18:28:54.22ID:IF3gwUAV
プログラミングの勉強始めたのが7月からでDBはいじったことがないので苦戦してます

ビッグデータ分析・活用のためのSQLレシピって本買ってみたけど、pythonからpostgresqlいじる方法が乗ってなくて手探りで検索したりしてる

おすすめの本あれば教えてくだしあ
0479デフォルトの名無しさん
垢版 |
2021/11/05(金) 20:31:14.39ID:d5XheO1i
この分野は進歩が早いので
すぐに本が陳腐になる
公式サイトが読めるようになることが必要
0480デフォルトの名無しさん
垢版 |
2021/11/05(金) 22:12:47.65ID:u2OkzB/r
バックエンドのwebプログラマーになるのにhtml/cssの知識は必要ですか?
bootstrapなど面倒くさいです
それを覚える暇があればdbとかフレームワークとか覚えたいんですが駄目ですか?
0481デフォルトの名無しさん
垢版 |
2021/11/05(金) 22:20:35.18ID:m7NNpy+h
>>480
・フロントエンド
・AWSまたはGCP
・特定のDBMSに関する深い知識
最低どれか一つは欲しいかな
バックエンドは多かれ少なかれオールラウンダーとして動くことが期待されるんで、裏側のコーディングだけできますというのは厳しい
0483デフォルトの名無しさん
垢版 |
2021/11/05(金) 23:35:32.62ID:s+xNbh4M
現場が分業体制でアサインされた分野以外まったく学ぶ気もないなら
都度専門家に聞けば仕事はなりたつだろうし、
そんなの嫌ならDBはRDBMSの説明書あれば困らないくらい
AWSはSAPの試験内容が理解できるくらい?
0484デフォルトの名無しさん
垢版 |
2021/11/05(金) 23:52:39.03ID:/IlkeVzp
プログラミング超初心者の質問
https://mevius.5ch.net/test/read.cgi/tech/1616755673/430-431

ここに書いた

YouTube で有名な、雑食系エンジニア・KENTA の、
Ruby on Rails 初心者向けサロンの内容

全くの素人は、Cloud9, Heroku, CircleCI, Bootstrap だけで始める

仕事レベルでは、AWS Fargate, Terraform, React, Vue.js, TypeScript もやる。
だから、AWSのくろかわこうへいのサロンにも、入る必要がある

初心者向け、くろかわのお勧め本が、
Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)、
NRIネットコム株式会社、2018

DB はミックの本。
最難関は、国家資格・データベーススペシャリスト
0485484
垢版 |
2021/11/06(土) 00:15:30.00ID:x0h3LLto
KENTA, 2021/11/04

「強いエンジニア」の定義とは?
https://www.youtube.com/watch?v=vjDOgkrkorA

AWS だけではダメ。GCP もやる。
Ruby だけではダメ。Go もやる

(PHP, Java のような)保守の仕事ばかりをやらない事。
必ず、(Ruby on Rails を使っているような)モダンな企業で、新規案件をやるべき
0487デフォルトの名無しさん
垢版 |
2021/11/06(土) 02:27:25.73ID:2JPnQnVe
5chってWEB屋さん多いよね
0488デフォルトの名無しさん
垢版 |
2021/11/06(土) 11:10:52.20ID:Y8IidGqg
webプログラミングは日本のIT系の技術業務の大半を占めるからな
後はゲームプログラミング

アプリ開発とか機器の制御組み込みなんて需要が殆どない

ところでPythonってやろうと思えばそれらが一応全部出来るんだな
PyGameとかtkinterとか仕事は無いけど
0489デフォルトの名無しさん
垢版 |
2021/11/06(土) 11:13:57.22ID:b1XdA94q
KENYAは超初心者
まで読んだ
0490デフォルトの名無しさん
垢版 |
2021/11/06(土) 23:10:49.67ID:6scjaAhI
内包表記のif句で内包表記を使った場合、シーケンスからひとつ取り出すたびに内包表記内の内包表記が実行される?それとも記憶されてて最初だけ?

_ = [i for i in hoge if i in [x for x in fuga]]
0494デフォルトの名無しさん
垢版 |
2021/11/07(日) 00:31:20.69ID:FiWKnTjM
>>490
そこまで書いたなら自分で試せると思うんだが
記憶されずに毎回内側の内包表記のリストを生成する
0497デフォルトの名無しさん
垢版 |
2021/11/07(日) 15:07:34.53ID:dPEzTB6K
c#とJavaしかやったことないけど初めてPython始める時に気をつけるべきことある?
セミコロンないってのと()がインデントになるってことくらいしか知らない
0498デフォルトの名無しさん
垢版 |
2021/11/07(日) 15:24:39.37ID:7u/wN+Bg
>>497
C#とJavaができるならぶっちゃけ楽勝だけど、それらに比べるとPythonはビチグソ遅いという点には注意が必要かな
まとまった量のデータを扱うときにはなるべくpandasやnumpyのような強力なライブラリを使用し、
処理の粒度を大きくしてPythonにできるだけ処理を戻さないことが重要になる
0501デフォルトの名無しさん
垢版 |
2021/11/07(日) 16:36:23.47ID:sYF1hNAJ
Cは関数だけでなく if や for の中にもスコープがあるらしいね
Pythonは関数・クラス・クラス内関数にしかないから
腰を抜かすほど驚いた
0503デフォルトの名無しさん
垢版 |
2021/11/07(日) 17:47:04.33ID:f4OJt/oF
ひたすら中かっこ連打して同じ名前の変数を別の意味で使い続けることができちまうんだ
画期的だろ?w
0504デフォルトの名無しさん
垢版 |
2021/11/07(日) 19:38:56.22ID:EGKzblaZ
np.linalg.inv(np.array([[1,2],[3,4]])) @ np.array([[1,2],[3,4]])
はほぼ単位行列
1 0
0 1
になるのですが
np.linalg.inv(np.array([[1,2,3],[4,5,6],[7,8,9]])) @ np.array([[1,2,3],[4,5,6],[7,8,9]])
の結果が単位行列にならないのは何故?
0506デフォルトの名無しさん
垢版 |
2021/11/07(日) 19:54:49.18ID:EGKzblaZ
解決しましたω
ありがとうωω
こんな例もあるんですねωωω
0508デフォルトの名無しさん
垢版 |
2021/11/07(日) 20:11:28.00ID:e/2wOCv0
0511デフォルトの名無しさん
垢版 |
2021/11/07(日) 21:12:42.76ID:VzSbYdr/
それだけ読むと特異性かんじないけど
結果ミュータブルなインスタンスでも使い回されるから
知らないとハマるかも
0512デフォルトの名無しさん
垢版 |
2021/11/07(日) 21:28:16.74ID:zDn3yvq/
>>490
それだと内側が普通のlistになってるでしょ。
generatorにしないとパイプにはならないんじゃないかな?
0514デフォルトの名無しさん
垢版 |
2021/11/08(月) 00:18:17.83ID:AFFY8UkB
>>513
いやC++とかC#みたいな静的言語だとデフォルト引数には定数など静的に決まっている値しか使えないのが普通なんで、それに似せてるんでしょ
別にそんなに普通じゃなくもない
0516デフォルトの名無しさん
垢版 |
2021/11/08(月) 02:34:48.50ID:J6d/ajGt
>それに似せてる

いや
上から順に実行してるだけだからにせるも何も
0517デフォルトの名無しさん
垢版 |
2021/11/08(月) 02:52:44.14ID:pXoKYUcM
MDNのJavaScriptのデフォルト引数の説明で
Pythonが名指しで引き合いに出されるくらいには特異
0522デフォルトの名無しさん
垢版 |
2021/11/08(月) 11:04:28.92ID:3dYPFnlP
"重要な警告: デフォルト値は 1 度だけしか評価されません。デフォルト値がリストや辞書のような変更可能なオブジェクトの時にはその影響がでます。例えば以下の関数は、後に続く関数呼び出しで関数に渡されている引数を累積します:"
https://docs.python.org/ja/3/tutorial/controlflow.html#default-argument-values
ここ見れ

設定を読み込む関数とかで、 if config == None: なんとか みたいな感じでよく使われてる
0523デフォルトの名無しさん
垢版 |
2021/11/08(月) 11:10:57.60ID:3dYPFnlP
一応この話題もこのスレで見た記憶あるんだけど、はまる人が少ないからか、出てきたときは割と新鮮な感じで受け入れられるよね
0525デフォルトの名無しさん
垢版 |
2021/11/08(月) 11:29:31.49ID:3dYPFnlP
あとあれ、デフォルト引数にlistじゃなくてtuple使う理由の一つもこれ
0526デフォルトの名無しさん
垢版 |
2021/11/08(月) 12:21:09.03ID:kxrCfTp4
そもそもデフォルト値とかいう一般的にconst期待するようなものに動的リストを指定する時点で
殆んどの現場でおいバカやめろってなるだろ
似たようなことするならデコレータ使ったりとかほかにやり方はいくつもあるはずだし
0529デフォルトの名無しさん
垢版 |
2021/11/08(月) 18:18:26.84ID:3dYPFnlP
>関数を量産
この言葉の方が気になるわ
0530デフォルトの名無しさん
垢版 |
2021/11/08(月) 18:23:35.95ID:GDZdggMg
generator
0532デフォルトの名無しさん
垢版 |
2021/11/09(火) 06:25:58.20ID:AjdA0gQv
恐いなあ
デフォルト引数は極力使わないようにしとこう
(幸い使ったことはないが)
自分が職場に残したコードが後々悲劇の元にらないように
0533デフォルトの名無しさん
垢版 |
2021/11/09(火) 06:58:51.77ID:UCZ76//B
>>498
>>500
情報ありがとう
いろんなアルゴリズム勉強してて次は数千万くらいループするようなことをPythonでやろうと思ってたけど厳しそう
0536デフォルトの名無しさん
垢版 |
2021/11/09(火) 17:51:14.43ID:gY1b2lRY
整数の1か2か3か4がランダムに入ってる可変長配列がある
すべての要素が奇数か偶数かを求める

算数できないマンなんだけど、これって各要素%2==0するしかない?
算数的に一発で判定できる?
0537デフォルトの名無しさん
垢版 |
2021/11/09(火) 17:52:44.04ID:gY1b2lRY
可変長配列て意味不明ね
各要素が1から4のどれかの、長さランダムな配列の全奇偶判定がしたい
0543デフォルトの名無しさん
垢版 |
2021/11/09(火) 18:42:49.20ID:LNU/VeL4
ランダムなら先頭から1つずつ見てearly returnしたほうが効率いいよ
実際O(n)になるのはnが十分小さいときだけだから
0544デフォルトの名無しさん
垢版 |
2021/11/09(火) 19:45:19.14ID:DzPX9Zv+
全部の要素のANDをとって1bit目が1なら全部奇数
全部の要素のORをとって1bit目が0なら全部偶数
速いかどうかは知らん
0545デフォルトの名無しさん
垢版 |
2021/11/09(火) 19:48:55.73ID:6aoIkSDY
all(i % 2 == 0 for i in l)
アルゴリズム的な話なら、>>542でいいのかな?
どっちが速くなるかはわからんけど。
0546デフォルトの名無しさん
垢版 |
2021/11/09(火) 20:08:07.20ID:UQ//qCST
>>536
各要素の従う確率分布が独立なら全て調べるしかない
0547デフォルトの名無しさん
垢版 |
2021/11/09(火) 21:27:08.92ID:ge8vpxBP
割り算って計算コスト高いみたいなはなしなかったっけ
だとしたら割り算一回で済む>>542が優勝か?
0549デフォルトの名無しさん
垢版 |
2021/11/09(火) 22:33:14.00ID:eryNNSUL
まあ現実的には長さランダムならearly returnでしょうな
0550デフォルトの名無しさん
垢版 |
2021/11/09(火) 22:37:04.39ID:LNU/VeL4
CPythonのほうで最適化されてるからか%2と&1で速度的に有意な差は見られないけどな
それより1つでも条件はずれたら処理を打ち切らないと
0551デフォルトの名無しさん
垢版 |
2021/11/09(火) 22:57:55.14ID:/aNe03Si
こういうのジェネレータ書いてnext()が常套だけど
イテレータに対してfind firstする分かりやすい書き方がないのがな
0552デフォルトの名無しさん
垢版 |
2021/11/09(火) 23:22:12.36ID:8kpY2GOq
for else
0555デフォルトの名無しさん
垢版 |
2021/11/10(水) 06:52:37.08ID:Mmr3oxKF
SJISのテキストファイルで、全角半角混在の行の長さを
バイト数で知るにはどうすればよいか
len関数は全角文字を1と判定するので、この目的には使えないようだ
0556デフォルトの名無しさん
垢版 |
2021/11/10(水) 09:21:40.34ID:morNzhKw
数学だけ知っててプログラミング下手な人は
論理的に正しくても実行にかかる時間を考慮しない傾向にあるな
0558デフォルトの名無しさん
垢版 |
2021/11/10(水) 09:25:16.07ID:morNzhKw
そもそも問題の設定が可笑しいな
行の長さをバイト数でってことなら
バイト列で\nから\nまでのバイト数を数えれば良いんじゃね
0560デフォルトの名無しさん
垢版 |
2021/11/10(水) 10:56:18.25ID:BOw4D0hZ
x = 0
y = 0
cmd = 0

var = x if cmd else y
var = 1
# x=0, y=1
というのがやりたい.値じゃなくて変数を自体を代入したいんだけど,できますか?

if cmd:
__x = 1
else:
__y = 1
0562デフォルトの名無しさん
垢版 |
2021/11/10(水) 11:05:25.69ID:ABhSQgxq
cmdって名前の変数に数値が入ってるのはまだしも、それが条件判断に使われてるのはセンスが凄い
0563デフォルトの名無しさん
垢版 |
2021/11/10(水) 11:33:47.73ID:4NOC2kX2
pythonの三項演算子だけは許せない
見にくすぎる

ほかの言語と同じくこの形にしてほしい
hoge = condition ? true_value : false_value
0564デフォルトの名無しさん
垢版 |
2021/11/10(水) 11:34:23.49ID:enrtMuCa
>>556
計算量って考え方がCS独特だからな
計算機科学としてしっかり教えてるような大学か専門課程、またはトレーニングコースで学んでないと身に付きにくい

正解の根拠を数理的な証明じゃなく、出力としてのアサーションに求める時点で
つまり根本的なことろから変わってくるからな
0566デフォルトの名無しさん
垢版 |
2021/11/10(水) 11:41:15.02ID:l5Ahtbnb
>>560
varに変数そのものへの参照を保持するのは無理じゃないかな
変数を参照するための文字列を格納しておいてvars()やlocals()だったり
getattr()やsetattr()を使えばできなくはない

どうしてもそれが必要な場面以外ではまずやらないけど
0567デフォルトの名無しさん
垢版 |
2021/11/10(水) 12:11:38.18ID:/xBD3bqR
xy = [0, 0]
var = cmd
xy[var] = 1
あるいは
xy = {'x': 0, 'y': 0}
var = 'x' if cmd else 'y'
xy[var] = 1
0568デフォルトの名無しさん
垢版 |
2021/11/10(水) 12:54:40.31ID:n5kix8Fi
再帰して、条件にあったらbreak
という処理をしているのですが
すべて回したけど条件に合わなかった
って場合はどうやればいいのですか

f=False
for i in range(5):
_if i==8:
__f=True
__break
_else:
__f=False
if f:
_print("○")
else:
_print("×")

例えばこの例だとfor抜けたあとにif i==8でも判別できます
しかし、for内外で2回、i==8を使った表現がなんか野暮というか・・
かといってそれを言い出せばわざわざ追加したf=Falseも、ってなりそうですが。
が、これ以上に他の方法なんてあるのでしょうか
0569デフォルトの名無しさん
垢版 |
2021/11/10(水) 13:20:24.40ID:pJeuK/iL
0-4で回して8でTrueって意味がわからんけど、
それだとelseは不要だし既に抜けた後に条件に合わなかった場合になってるだろ。
0570デフォルトの名無しさん
垢版 |
2021/11/10(水) 13:22:02.64ID:BOw4D0hZ
>>566
あーやっぱ文字でattrかー
了解しました
0571デフォルトの名無しさん
垢版 |
2021/11/10(水) 13:36:42.37ID:n5kix8Fi
>>569
はい、例なのでそこに意味はありませんよ
例えばrange(5)のところをrange(10)とかに変えて検証しやすいようにしてるだけです
0572デフォルトの名無しさん
垢版 |
2021/11/10(水) 13:37:10.46ID:FEUt3UaQ
>>568
for i in range(5):
  if i==8:
    print("○")
    break
else:
  print("×")
0573デフォルトの名無しさん
垢版 |
2021/11/10(水) 13:50:56.80ID:n5kix8Fi
>>572
forにelseなんて使えたんですね
本コードでもたぶん罠なくできました!ありがとうございます!!
0574デフォルトの名無しさん
垢版 |
2021/11/10(水) 15:17:50.26ID:l5Ahtbnb
ヘルパー関数作ってreturn Trueとreturn Falseしたほうがいいと思う
Effective Pythonにもforやwhileのelseブロックは使うなって書いてる
0575デフォルトの名無しさん
垢版 |
2021/11/10(水) 17:36:43.66
ヘルパー関数で分けて(処理の中身隠して)見やすくすれば
(ヘルパー関数内で)else句は使ってもいい
って意味ではなく、
そもそもelse句使わない方がいいってことかな
0576デフォルトの名無しさん
垢版 |
2021/11/10(水) 17:56:41.01ID:HNNUg8pO
oddnum = len((x for x in X if x in (1,3)))
allnum == len(X)
if oddnum == allnum > 0:
 print('allodd')
elif allnum > 0 == oddnum:
 print('alleven')
else:
 print('other')
0577デフォルトの名無しさん
垢版 |
2021/11/10(水) 20:44:30.15ID:BOw4D0hZ
>>575
違う
英語圏的にはelseの意味がガバガバやんけ誤読するやろという趣旨
effective pythonの言い分はね
0578555
垢版 |
2021/11/10(水) 21:12:33.58ID:vnM01vTc
>>557
半角カタカナの混在もあり得る

>>558
問いがあいまいかも知れない
全角文字は2、半角文字は1として文字数を数えたい
len('全a') で3が返って欲しいということ

>>559
len('全a'.encode('cp932'))で3が返るようだ
これからテストが必要だがまずはありがとう
0580デフォルトの名無しさん
垢版 |
2021/11/11(木) 00:46:55.85ID:x6810Q1K
そもそもループのelseっていわれても
なにやってるのかピンときづらいからな…
3系になってから用途不明の文法が結構増えた気がするわ
0581デフォルトの名無しさん
垢版 |
2021/11/11(木) 07:09:46.59ID:rdUNi5nM
そうかなあ、コレクションから何か探してる時に見つからない時の処理書いたりするのにめっちゃ便利だと思うんだが
https://python.civic-apps.com/else-loop/amp/
まあelseというキーワードがいいかどうかはよくわからんけど他にしっくりくるようなキーワードもなさげだし
0583デフォルトの名無しさん
垢版 |
2021/11/11(木) 12:20:10.51ID:ncCD0/gc
使えるけど使わないほうがいいよって話でしょ
>>581のコード例も探索と出力を分離してない悪い例
0584デフォルトの名無しさん
垢版 |
2021/11/11(木) 12:27:02.25ID:rdUNi5nM
>>583
> 使えるけど使わないほうがいいよって話でしょ
うん、君はそうすればいいと思うよ

> >>581のコード例も探索と出力を分離してない悪い例
さすがに例にそのツッコミはどうかと思うぞ
0585デフォルトの名無しさん
垢版 |
2021/11/11(木) 12:39:45.52ID:8NRWWnb2
古いバージョンとの互換性がないか、考慮する必要のない場合、
標準で使えるものは使っとくほうが楽
それに対して、別途導入が必要なものは使わないな
0586デフォルトの名無しさん
垢版 |
2021/11/11(木) 14:03:11.82ID:VFTg6I1W
でもループのあとにいきなりelse出て来て
これがどの条件でそこにいくのかすぐに分かるやつおらんのでは?
ループ内でbreakしたあとだよ、とかいえばそのまま信じる人多そう
結局、分岐条件をちゃんと真面目に書いたほうが誤認、誤読を防げてwysiwygみが出る
0587デフォルトの名無しさん
垢版 |
2021/11/11(木) 14:11:28.15ID:1agSgarI
windowsのpoetryでキャッシュからパッケージをインストールするとエラーになるやつってまだ修正されてない?
0588デフォルトの名無しさん
垢版 |
2021/11/11(木) 18:08:48.51ID:JDtebxVn
辞書に"data"がある限り掘っていき
キー名と値をハイフン文字列で連結する
みたいなことをやりたくて自分で考えてみたのですが
https://ideone.com/o5VIjG
これで一応は出来た(期待する出力)のですが
最適化してもらえないでしょうか
0592デフォルトの名無しさん
垢版 |
2021/11/12(金) 05:11:14.29ID:nOrEz+co
>>586
> ループ内でbreakしたあとだよ、とかいえばそのまま信じる人多そう
バカに合わせろと?
まあ土方職場ならそうかもねw
0593デフォルトの名無しさん
垢版 |
2021/11/12(金) 05:44:51.77ID:69xCA6xu
forでelse使えるってしらんだし普通にインデントミスってたのかなと思ってifの所に直しておくかな
0594デフォルトの名無しさん
垢版 |
2021/11/12(金) 07:15:43.05ID:Wbl+f+tk
>>593
あり得るからマジで怖い
どうしても使うなら、「このelseはfor の一部で、
ここに処理が来る条件は〜」のような
詳細なコメントを残す必要がある
0596デフォルトの名無しさん
垢版 |
2021/11/12(金) 09:08:04.32ID:bLCSn2ms
昨日pythonの存在を知ったガチ初心者です
下の解説を参考に国土数値情報を一括DLしようとしましたができません
助力お願いします
https://qiita.com/mits003/items/2c8c77514a09aee99cc0

Win 10
コマンドプロンプトで実行
pyhton 3.9 DL済
ChromeDriver 93.04577 DL済
pip install selenium 実行

cd C:\Users\cucum\mlit-ksj-dl-tool-main
してから
python mlit_ksj_dl.py https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-L03-a.html
を入力すると以下の文がでます
0597デフォルトの名無しさん
垢版 |
2021/11/12(金) 09:08:47.83ID:bLCSn2ms
C:\Users\cucum\mlit-ksj-dl-tool-main\mlit_ksj_dl.py:50: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
driver = webdriver.Chrome(executable_path=DRIVER_PATH, chrome_options=options)
C:\Users\cucum\mlit-ksj-dl-tool-main\mlit_ksj_dl.py:50: DeprecationWarning: use options instead of chrome_options
driver = webdriver.Chrome(executable_path=DRIVER_PATH, chrome_options=options)
Traceback (most recent call last):
File "C:\Users\cucum\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\common\service.py", line 74, in start
self.process = subprocess.Popen(cmd, env=self.env,
File "C:\Users\cucum\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 951, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "C:\Users\cucum\AppData\Local\Programs\Python\Python39\lib\subprocess.py", line 1420, in _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。
0598デフォルトの名無しさん
垢版 |
2021/11/12(金) 09:09:00.65ID:bLCSn2ms
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "C:\Users\cucum\mlit-ksj-dl-tool-main\mlit_ksj_dl.py", line 115, in <module>
dl_dir = file_dl(DRIVER_PATH)
File "C:\Users\cucum\mlit-ksj-dl-tool-main\mlit_ksj_dl.py", line 50, in file_dl
driver = webdriver.Chrome(executable_path=DRIVER_PATH, chrome_options=options)
File "C:\Users\cucum\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\chrome\webdriver.py", line 69, in __init__
super(WebDriver, self).__init__(DesiredCapabilities.CHROME['browserName'], "goog",
File "C:\Users\cucum\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\chromium\webdriver.py", line 90, in __init__
self.service.start()
File "C:\Users\cucum\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\common\service.py", line 84, in start
raise WebDriverException(
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://chromedriver.chromium.org/home
0599デフォルトの名無しさん
垢版 |
2021/11/12(金) 09:09:56.62ID:bLCSn2ms
長文失礼しました
スレチだったら申し訳ありません
よろしくお願いします
0601デフォルトの名無しさん
垢版 |
2021/11/12(金) 09:56:07.83ID:M7lyd7nj
>>598
>selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.
>Please see http://chromedriver.chromium.org/home

chrome driver・chromedriver.exe を置いたフォルダを、
ユーザー環境変数(または、システム環境変数)PATH へ追加すれば?

PowerShell を起動して、
$env:Path.split( ";" )
と入力して、chrome driverを置いたフォルダが、表示されるか確かめる

漏れの場合、C:\BrowserDriver と出力される

漏れは、そこにchrome driverを置いて、Ruby で使っている。
C:\BrowserDriver/chromedriver.exe
0603デフォルトの名無しさん
垢版 |
2021/11/12(金) 10:37:35.81ID:0ShHeix+
>>600
selenium 3.14に変更してみましたが同様の文がでました
0604デフォルトの名無しさん
垢版 |
2021/11/12(金) 10:38:15.67ID:0ShHeix+
>>601
試してみます
0605デフォルトの名無しさん
垢版 |
2021/11/12(金) 11:05:42.02ID:0ShHeix+
>>601

ユーザー環境変数とシステム環境変数にPATHを追加しPowerShellでchrome driverを置いたフォルダが表示されるのを確認しました

再度python mlit_ksj_dl.py https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-L03-a.html
を実行しましたが
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
と表示されます
0606デフォルトの名無しさん
垢版 |
2021/11/12(金) 11:07:27.73ID:0ShHeix+
>>602
データ取得するのが目的です
ソースとは国土数値情報のサイトのほうですか?
0607デフォルトの名無しさん
垢版 |
2021/11/12(金) 11:18:39.40ID:+FPwLl69
関係無いけど、昨日Python知った割にはすんなりといろんなことがよくできるな。
もともとLinuxやってた人?
0608デフォルトの名無しさん
垢版 |
2021/11/12(金) 11:21:32.57ID:0ShHeix+
>>607
プログラミング関係一切やったことないです
cd コマンドも昨日知りました
0609デフォルトの名無しさん
垢版 |
2021/11/12(金) 11:21:59.16ID:du4vJvWd
わろたw
そっちの「ソース」をどうやっていじるんだよ。

ドライバのPATH通したなら、
executable_path=DRIVER_PATH,
を削除したらどうだ?
おそらく、上記を設定するとそっちが優先されるだろう。
0610デフォルトの名無しさん
垢版 |
2021/11/12(金) 11:29:55.18ID:0ShHeix+
>>609
動きました!ありがとうございます!
こういうプログラムが機能するのって面白いですね!
拙い知識でご迷惑をおかけしましたが,レスくれた人たちありがとうございます
0612デフォルトの名無しさん
垢版 |
2021/11/12(金) 11:56:23.24ID:+D42agk2
やりたいことがあるのは良いことなので
この調子で色んなことに挑戦しよう
0613デフォルトの名無しさん
垢版 |
2021/11/12(金) 13:04:57.85ID:iYNtaU8H
OSのインストールのときの最後に、
カウンドダウンする表示が出てきて、
あと30秒で再起動する、今すぐのときはボタン押せ表示が出てくる。
ああいうのをpythonでやりたいんだが、参考になるものある?

自分ではWinAPIで似たようなの見つけて
from ctypes import *
windll.user32.MessageBoxTimeoutA(None,"YYY","ABC",4,0,30000)
をやってみたんだが、
カウントダウンしてくれないからちょっと違うと思ってる。
0614デフォルトの名無しさん
垢版 |
2021/11/12(金) 14:53:07.55ID:MdQVbi6g
try:
__if x.has('A') and use :
____foo()
__else:
____bar()
except ValueError:
__bar()

こういうのって例外クラス作ってexceptでまとめて受けたほうがいいですか?
同じ内容のbar()が散乱するのって気になる?
0618デフォルトの名無しさん
垢版 |
2021/11/12(金) 18:16:04.90ID:1KWt8wEr
>>614
bar()の意味合い次第だと思うが
引数含めて全く同じ処理をするんならelse句でraiseしてまとめてしまったほうが理解しやすいと思う

それよりどこで発生する例外をexceptで受けてるのかが曖昧なのが気になる
x.has()なのかuse()なのかfoo()なのか
bar()でもValueError発生する可能性があるのかないのかみたいな
0619デフォルトの名無しさん
垢版 |
2021/11/12(金) 18:29:01.39ID:JnXYuZWY
from ctypes import *
t = 30000
while(t -= 1):
windll.user32.MessageBoxW(None,"YYY","ABC",0)
0621デフォルトの名無しさん
垢版 |
2021/11/12(金) 19:30:16.12ID:xRtlJ9/N
こういうのを見るたび「Zen of Python」ってなんだったんだろうなって思ってしまうw
0622デフォルトの名無しさん
垢版 |
2021/11/12(金) 19:54:46.68ID:JnXYuZWY
>>621
Zenは原理主義じゃないから
0623デフォルトの名無しさん
垢版 |
2021/11/12(金) 20:27:32.37ID:MdQVbi6g
>>618
あーそうかー
has部分だけなんす、tryするの。tryは短くないとですよね

if use :
__try:
____x.has('A'):
________foo()
__except ValueError:
____use =False
if not use:
__var()

んーーーー
0624デフォルトの名無しさん
垢版 |
2021/11/12(金) 20:32:02.95ID:+D42agk2
('A')が(´A`)に見えた
0628デフォルトの名無しさん
垢版 |
2021/11/13(土) 01:57:43.67ID:PnBDGE+q
そりゃ後悔するわな
0629デフォルトの名無しさん
垢版 |
2021/11/13(土) 04:38:52.17ID:qYaZF+ZS
Web Designing 2021年12月号
>入門〜上級まで本気で勉強したい人必携。Pythonの利点からWebビジネスで活きる仕組みまで丁寧に解説!
0630デフォルトの名無しさん
垢版 |
2021/11/13(土) 17:33:14.40ID:kgYXWGHf
sqlのスレのほうがいいのか迷いましたがこちらで。
psycopg2で重複させずにinsertをする方法を知りたいです。

import psycopg2
#データベースにいれるurlのリスト
url_list1 = ['url1', 'url2', 'url3', 'url4', 'url5',]
url_list2 = ['url1', 'url2', 'url6', 'url7', 'url8',]
# PostgreSQL Server へ接続してカーソルを取得
conn = psycopg2.connect('host=localhost port=5432 dbname=urlman user=urlman password=urlmaniscool')
c = conn.cursor()
#urlを保存するテーブルの作成
c.execute("""
CREATE TABLE url_table(
"url_name" text,
"count" integer default 0
)
""")
0631デフォルトの名無しさん
垢版 |
2021/11/13(土) 17:33:37.48ID:kgYXWGHf
#url_list1のデータを挿入
for url in url_list1:
c.execute('INSERT INTO url_table (url_name) VALUES(%s)',[url])
conn.commit()

#入ったか確認
c.execute('SELECT url_name FROM url_table WHERE count=0')
urllist = [row[0] for row in c.fetchall()]
print(urllist)
0632デフォルトの名無しさん
垢版 |
2021/11/13(土) 17:33:55.87ID:kgYXWGHf
#新たに取得したurlのうち重複してないurlを挿入
#これのやりかたがよくわかりません
for url in url_list2:
c.execute('INSERT INTO url_table (url_name) VALUES(%s)',[url])
conn.commit()

#入ったか確認
c.execute('SELECT url_name FROM url_table WHERE count=0')
urllist = [row[0] for row in c.fetchall()]
print(urllist)

#コネクションを閉じる
conn.close()
0633デフォルトの名無しさん
垢版 |
2021/11/13(土) 17:36:19.84ID:kgYXWGHf
上記でprint(urllist)の結果を['url1', 'url2', 'url3', 'url4', 'url5','url6', 'url7', 'url8']にしたいのですが、
['url1', 'url2', 'url3', 'url4', 'url5','url1', 'url2', 'url6', 'url7', 'url8']になってしまいます。
0635デフォルトの名無しさん
垢版 |
2021/11/13(土) 18:09:47.53ID:kgYXWGHf
>>634
今回は練習で入ったかどうかを確認しているのですが、
最終的にはurlをどんどん目視確認なし重複なしで入れていくようにしたいです
0637デフォルトの名無しさん
垢版 |
2021/11/13(土) 18:18:47.95ID:x1CN7sQN
>>630
c.execute('INSERT INTO url_table (url_name) VALUES(%s) on conflict (url_name) do nothing',[url])

ただしon conflictで指定する列はuniqueでないとダメなので

CREATE TABLE url_table(
"url_name" text unique,
"count" integer default 0
)

にしないとエラーになる

>>634,636
今どきupsertやmergeも知らないのはどうかと思うぞ
0638デフォルトの名無しさん
垢版 |
2021/11/13(土) 18:21:14.00ID:6FXvjqIK
pythonロジックでセレクトかけてインサートするかどうか決めたり或いは
インサート文にwhere条件入れてもいい
ただ設計的なはなしでいうなら、最初から重複すべきではないなら
テーブル定義の重複NGにキー制約かけたほうがベスト
その際、インサートで主キーだぶるとdbms側で例外吐くので、例外処理のpythonロジックを追加する必要がある

規模が大きいシステムだと、最後のやり方をまず一番最初に考慮する必要がある
上二つのやり方は考え方としてはほぼ一緒で
実装としてSQL文として一筆書き出来ますよと言うはなしでしかない
範囲が限られた業務ロジックのなかでなら有効に使える
0640デフォルトの名無しさん
垢版 |
2021/11/13(土) 18:27:23.32ID:6FXvjqIK
>>637
>>636は設計として推奨する場面が多いからな
本来重複しちゃいけないデータが大量にdb上にあると
ほかの業務ロジックでも想定外のデータを取ったり
テーブル結合時に直積による組み合わせ爆発がおこってシステムが停止する可能性もある
数行しか期待してないクエリから数万〜数十万のデータが取れてしまうことになりかねない

基本的に、セレクトででてくるデータは写像であって実体ではない
これをまず理解してないと、組み合わせ爆発まで考えが行き届かないことになりやすい
0641デフォルトの名無しさん
垢版 |
2021/11/13(土) 18:42:45.91ID:kgYXWGHf
>>637の内容で入れてみます!!!
データベース勉強しはじめでよくわかってなくて申し訳ない。
upsertは調べてみたのですが、重複した場合、内容を更新するとなっていてやりたいことと違うのかと思いました
0642デフォルトの名無しさん
垢版 |
2021/11/13(土) 18:46:41.57ID:6FXvjqIK
>>641
マージ文でググればでてくるけど
じつはアレ、アップデート文書かなくてもちゃんと期待どおりに動くぞw
インサートやって、出来なければスルーしたいならOR UPDATEの部分だけ書かなければいい
0643デフォルトの名無しさん
垢版 |
2021/11/13(土) 18:55:43.88ID:kgYXWGHf
>>638
最初は、pythonで重複の比較して重複してないやつを入れることも考えたんです。
c.execute('SELECT url_name FROM url_table WHERE count=0')
urllist = [row[0] for row in c.fetchall()]
で持ってきたurllistをurl_list2と比較して重複してないやつを入れるみたいな
url_list2 = set(url_list2)-set(urllist)とかで?
でもせっかくデータベースの勉強してるのでそっちでやってみたいなって感じです
>>640
すまん、話してることが難しくてよくわからない
0644デフォルトの名無しさん
垢版 |
2021/11/13(土) 18:58:26.95ID:kgYXWGHf
ぽまいらなんでこんなに詳しいんだ
挫折しながらもpythonちょっとできるようになってきて、
csv辞めてデータベースに入れてみたいってなって、
postgresqlの勉強始めたら挫折して、挫折しかしてねえぞ俺
0645デフォルトの名無しさん
垢版 |
2021/11/13(土) 18:59:24.51ID:kgYXWGHf
>>642
これから637と642どっちも試してみるです!!
0646デフォルトの名無しさん
垢版 |
2021/11/13(土) 19:00:45.55ID:x1CN7sQN
>>641
> upsertは調べてみたのですが、重複した場合、内容を更新するとなっていてやりたいことと違うのかと思いました
upsertやmergeはDBMS毎に書き方違うから調べにくいよね
まあおいおい調べていけばいいと思うよ
あと、例外出してPython側で処理するとかPostgreSQLにないマージ文とか言ってるアホは無視でいい
0648デフォルトの名無しさん
垢版 |
2021/11/13(土) 19:16:23.51ID:kgYXWGHf
637のやりかたでできたぞです!
ありがとう。

642も試してみる
0650デフォルトの名無しさん
垢版 |
2021/11/13(土) 19:54:50.55ID:kgYXWGHf
>>646,647
マージ文?ないってレスに今気づいたありがとう。
0652デフォルトの名無しさん
垢版 |
2021/11/13(土) 21:58:49.17ID:diWAL6lC
>>651
import functools
d={"a":{"b":{"c":{"d":111}}}}
ary=["a","b","c","d"]
print(functools.reduce(lambda d, k: d[k], ary, d))
0654デフォルトの名無しさん
垢版 |
2021/11/14(日) 00:17:07.01ID:MXTEWU7A
静的にキーを定義してる時点で動的とは言えないのでは
0655デフォルトの名無しさん
垢版 |
2021/11/14(日) 01:36:39.78ID:ZInZl5Ie
ええもちろん実際は
>ary=["a","b","c","d"]
の部分は動的生成ですよ >>654
ちなみにどう書いてあると良かったでしょうか
今後質問するときに参考にします
0656デフォルトの名無しさん
垢版 |
2021/11/14(日) 01:47:41.70ID:MXTEWU7A
>>> d={"a":{"b":{"c":{"d":111}}}}
>>> def get_value(dd): return dd if isinstance(dd, int) else get_value(list(dd.values())[0])
>>> print(get_value(d))
111

lambda使って頑張ればいける?無理かな
0657デフォルトの名無しさん
垢版 |
2021/11/14(日) 02:13:49.47
>>656
それ、目的が「111を取得する」ことになってね?
もしdが
d={"a":{"b":{"c":{"e":222,"d":111}}}}
とかだったら、222になっちゃうよ
0659デフォルトの名無しさん
垢版 |
2021/11/14(日) 08:05:21.74ID:8oLu5/jW
>>655
> ちなみにどう書いてあると良かったでしょうか
> 今後質問するときに参考にします
一部の変な人が無駄に絡んでるだけ
元の書き方で普通わかるから気にしなくていいよ
0661デフォルトの名無しさん
垢版 |
2021/11/14(日) 13:40:46.75ID:E00roTgy
と思ったが画像観てなかったわω
関数名 search_tree とか search_node の方が良いんじゃね
0662デフォルトの名無しさん
垢版 |
2021/11/14(日) 14:59:17.47
相手の日本語を疑う前にまず抽象化して考えた方が良いと思うわ
質問者の質問には、期待部分とコード部分が分かれてるわけで。
コード部分だけみて文字通りコードだけみて
「何したいかわからん」っていう人いるけど
全部同じ人だとしたら、ずっとネタでやってんのかと思ってたけど
返しがガチアスペっぽいんだよなぁ・・

例えば if True:とか書くと
「Trueだと当たり前じゃん、何がしたいかわからん」
みたいな返しの人いるじゃん
これまじでネタでやってんのかと思ってたけど
安定して登場してるんでどうもネタでやってないっぽい
0664デフォルトの名無しさん
垢版 |
2021/11/14(日) 15:06:35.08ID:L6aMQe6P
>>651
ここまでいくつか挙がってるが、そのコードが一番いいよ
無理やり1行にすると後で見た時に意味不明になるよ
コードゴルフが目的なら言うことはないが
0665デフォルトの名無しさん
垢版 |
2021/11/14(日) 15:38:37.79ID:vfrWY536
それあるわ
苦労して一行にまとめたコードだが、
何をしているのかを解説するコメントが10行くらい必要になって
これやらない方がよかったなって経験がある
0666デフォルトの名無しさん
垢版 |
2021/11/14(日) 15:41:51.67ID:mFG9NQD5
>>644
YouTube で有名な、雑食系エンジニア・KENTA のサロンの、Ruby on Rails 初心者用コースでは、

Rails, Linux, Docker Compose, Node.js(Webpack, Babel), Bootstrap
VSCode(Remote Container, WSL2 ならRemote WSL), Heroku, CircleCI、データベース(DB)

バックエンド技術者の大前提として、基本情報処理資格も必須。
DBも、第3正規形まで入る

さらに、データベース技術者資格・ミックの本も読んだ方がよい
0668デフォルトの名無しさん
垢版 |
2021/11/14(日) 18:18:34.52ID:XvRnuZG1
質問は割とまともでも
最初に付いたレスが頓珍漢だと
頓珍漢な質問者だということにされる好例
0669デフォルトの名無しさん
垢版 |
2021/11/14(日) 18:40:23.82ID:+PJrsOCi
ただ絡みてえだけのバカが数人常駐しとるでな
0670デフォルトの名無しさん
垢版 |
2021/11/14(日) 19:22:31.60
>>667
コード例は関係ない
>>651質問者の期待は
>辞書のキー名から動的に値を取得したい
であって
「キー名a,b,c,d順の最期の値を取得したい」
ではない
質問者の期待とコードを見た上で抽象化すれば
「あー、search_dict()にselectors(キー名の入ったリスト)入れて検索したいのね」
「dやaryが他の場合も対応しつつ」
ってのが一般回答者なら意識しなくてもわかる

「コードが{"a":{"b":{"c":{"d":111}}}}ってなってる!!
しかも出力が111だ!
さらには["a","b","c","d"] と静的に定義されてる!!
いやいやそもそもa→b→c→dの順で検索するコード書けばいいじゃねえか!!」
とはならんだろ・・
だからアスペっぽいなぁと感じる所以
で、ネタならただの荒らしなんでそれはそれでいいが
ネタじゃないっぽいガチアスペっぽいやつがいるんだよな
0671デフォルトの名無しさん
垢版 |
2021/11/14(日) 19:31:47.93ID:6/4ZgoB5
教えてください。
開いているメモ帳などに、言葉を複数回入力したいのですが、

pyperclip.copy(text)  #textは変数
でクリップボートにコピーしたものを、メモ帳に貼り付けるため

hwnd = win32gui.FindWindow(None, "〇〇 - メモ帳")   # "〇〇 - メモ帳"は例えです
win32gui.SetWindowPos(hwnd,win32con.HWND_TOPMOST,0,0,0,0,win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)

で、常に最前面にした状態で、

pyperclip.paste()
を実行しても貼り付けできません。
pyautogui.typewrite(text)
でも、メモ帳をアクティブにすれば、日本語はダメですが英語だと貼り付けできます。

@メモ帳をアクティブにする方法 PID指定でもいいです
A日本語を貼り付け可能にする方法

よろしくお願いいたします。
0673デフォルトの名無しさん
垢版 |
2021/11/14(日) 19:58:23.61ID:qsoauoys
コードが全然わからず困ってます。
有料のサブスクで勉強しているんですが、説明が分からなくて困ってます。
def から何をしているのかさっぱりわかりません。
DataFrame の処理の問題です。

コメントの15文字までを切り出して列(SlicedComment列)に格納する処理をSeries.apply()を使って実行します。
まず実行したい関数(ここでは、get_sliced_str関数)を実装します。
その後、Series.apply()に引数として実装した関数を渡すと、Seriesの各データが実装した関数の引数として渡された結果をシリーズとして返します。

# 前回のプログラムの読込
%run 2.ipynb
def get_sliced_str(x):
return x[:15]
# 関数を使って作成
df['SlicedComment'] = df['Comment'].apply(get_sliced_str)
df
# strアクセサを使って作成
df['SlicedComment'] = df['Comment'].str[:15]
df
0674デフォルトの名無しさん
垢版 |
2021/11/14(日) 20:19:49.33ID:y/dqGNjn
コードが意訳でなくコピペなら引用の範疇かが気になるし有料ならそっちで聞いた方がよくない?
前後の流れもあるだろうし
0675デフォルトの名無しさん
垢版 |
2021/11/14(日) 20:23:34.90ID:sz2Sy1tN
そもそもpyperclip.paste()とpyperclip.copy()はクリップボードの中身をどうこうするために存在するのであって
なんかの画面に貼り付けるために存在するのではない
結論としてはpyautogui.hotkey()にctrlとv渡せ
0676デフォルトの名無しさん
垢版 |
2021/11/14(日) 20:26:13.01ID:6/4ZgoB5
>>672さん
ありがとうございます。
理解しました。そうですよね。よく考えれば当然でした。

Aの貼り付けは、
pyautogui.hotkey('ctrl', 'v')
で解決しました。

で、メモ帳にフォーカスをあてるには、バーチャルマウスでクリック等はあったのですが、
直接指定してフォーカスする方法があればお教えください。
0678デフォルトの名無しさん
垢版 |
2021/11/14(日) 21:23:31.50ID:qmSPgrdk
>>673
説明の何がわからないのかもう少し細かく考えてみては?

defが何かわからない?
「コメントの15文字までを切り出して列に格納する」という日本語の意味がわからない?
スライスやSlicedの意味がわからない?
x[:15]が何をしてるかわからない?
シリーズが何かわからない?
「Series.apply()に引数として関数を渡す」という日本語の意味がわからない?
などなど
0679デフォルトの名無しさん
垢版 |
2021/11/14(日) 21:58:02.31ID:u3eAdyh4
>>651
1行じゃ無いけど再帰は要らなくね?
def search_dict(target,selectors):
c = target
for k in selectors:
c = c[k]
return c
0681デフォルトの名無しさん
垢版 |
2021/11/15(月) 01:36:18.56ID:5MYJc3th
>>678
アドバイスありがとうございます。
シリーズがよく分かっていなかったのと、apllyもよく分かっていませんでした。ノートに書きながら色々実行したら何となくわかりましたが、x[:15]がよく分かりません。
コメントを渡して最初の15文字をなぜ切り取れるんでしょうか
0682デフォルトの名無しさん
垢版 |
2021/11/15(月) 02:57:55.17ID:/1nodzje
>>681
お前はまず初心者向けの本を一冊読んでから出直せ
0683デフォルトの名無しさん
垢版 |
2021/11/15(月) 03:02:41.97ID:r/fnyP+y
まあ超初心者用とはいえ論外だわ
クジラ飛行机の入門書でも読めや
あれプログラムしたこと無い人がスタートラインに立てるようになるから
0684デフォルトの名無しさん
垢版 |
2021/11/15(月) 03:13:21.02ID:x301xsWW
誰に吹き込まれていきなりこんな課題やってんのかな
詐欺メッセージに騙されてコンビニでアマギフ券買ってしまうくらいのIQと見た
0685デフォルトの名無しさん
垢版 |
2021/11/15(月) 03:25:27.36ID:hipLkLbw
>>681
まずPython自体の習熟度に問題があるな
(Pythonは文字列そのままスライスできる書き方がある)
Pandasに触る前に、先にそっちやらないと構文的に分からない所が多々出てくる

最低ラインとして入門書1冊か、根気があるなら公式チュートリアルをまずやるのが先決

実行する時にもデバッグのブレークポイント使って、
1個ずつ処理をステップ実行で見ていくのもいい、何をやってるのか分かる
0686デフォルトの名無しさん
垢版 |
2021/11/15(月) 03:44:37.20ID:/1nodzje
多分だけど
有料だから手取り足取り教えてくれるだろうという認識なんじゃないかな
違うんよ
有料で、その分野(python)の専門的な領域(pandas)を解説する講座なんじゃて

その講座の入門条件は「pythonが一通り使える」よ
明言しない講座も悪いんだろうが今のままじゃ金をゴミ箱に捨てるのと大差ない
def(関数定義)も分からないんじゃ、class出てきたら即死するでせう

っていう、超初心者スレが現状の>>681にできる最大限のアドバイス
受け取れ
0687デフォルトの名無しさん
垢版 |
2021/11/15(月) 05:51:22.02ID:OfX77+Sf
KENTA, 2021/2

Web系エンジニアを目指す人のためのプログラミング学習ロードマップ
https://www.youtube.com/watch?v=0TABrlhci5M

この動画は、Ruby on Rails で、ポートフォリオを作って転職するためのものだけど、

HTML/CSS, JavaScript, Ruby, RDB/SQL などは、
Progate, Dot Install で学ぶと言ってる

多分、Python も同じじゃないの?
0688デフォルトの名無しさん
垢版 |
2021/11/15(月) 09:01:49.22ID:EiiKCwr/
>>681
長さが決まっててインデックスアクセスができる型をPythonではシーケンスと呼ぶんだけど
シーケンスxに対してx[:15]と書くとxの0番目要素から14番目要素までを切り取ったもの(スライス)が返される

x[:15]はx[0:15]と書くのと同じで開始位置の0番目を省略した記法
list, tuple, range, strなどがシーケンス
https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range

SeriesはDatatFrameの1行や1列のデータを表現するPandasの型で1次元配列とラベル情報を持ってる
SeriesやDataFrameもシーケンスなのでリストや文字列と同じようにスライス可
0689デフォルトの名無しさん
垢版 |
2021/11/15(月) 14:23:06.05ID:2H0KJ/Z9
scheduleって同期処理なんですね・・

import schedule
import time

def sleep1():
 print('start sleep1')
 time.sleep(10)
 print('end sleep1')
def sleep2():
 print('start sleep2')
 print('end sleep2')

schedule.every(3).seconds.do(sleep1)
schedule.every(1).seconds.do(sleep2)

while True:
 schedule.run_pending()
 time.sleep(1)

sleep2が1秒おきのスケジュールだとしても
sleep1内のtime.sleep(10)を待ってしまいます
どうにか非同期的に処理できないものでしょうか
0690デフォルトの名無しさん
垢版 |
2021/11/15(月) 14:48:29.66ID:P/PCEOHq
>>689
sleep1/2を非同期処理で書けばいいやん
scheduleが機能持つと重複だし作法が縛られるからよろしくない
PyPIにいけばasyncioをラップしたスケジューラはありそうだけどね
0691デフォルトの名無しさん
垢版 |
2021/11/15(月) 14:58:38.85ID:i/3H6iLT
threading
thread
0692デフォルトの名無しさん
垢版 |
2021/11/15(月) 16:08:12.68ID:2H0KJ/Z9
>>690,691
sleep12を非同期で処理するとスケジュールタイマーが機能せず
スケジュールタイマーを機能させるとsleep12が互いに処理を待つ
みたいな、こちらを立てればあちらが立たず状態です
0694デフォルトの名無しさん
垢版 |
2021/11/15(月) 16:41:25.31ID:nBoI3p59
>>692
「三秒おきに『10秒待つ』をループする処理」
と「一秒おきに『即時実行』をループする処理」
のふたつをアウェイタブルオブジェクトとしてつくって、せーので流す
が、ぱっと思い付いた

他にかっこいいやり方ありそうやけど
0695デフォルトの名無しさん
垢版 |
2021/11/15(月) 16:55:34.42ID:zyhNM4DJ
10秒待ちと1秒待ちを非同期にするだけなら簡単そうだけど
3秒待って10秒待ちの場合13秒待ちで非同期にすればええのか
最終的にどういう関数動かすかによるけど
3秒ごとに10秒待ちも非同期なん?
0696デフォルトの名無しさん
垢版 |
2021/11/15(月) 17:23:28.77ID:2H0KJ/Z9
>>693,694
なるほどとりあえずschduleは置いといて作ってみることにします
>>659
def sleep1()とdef sleep2()の内容に関わらずとりあえず非同期実行したい感じですね
極端な話、[sleep1を3秒おき,sleep1を1秒おき,sleep2を1秒おき,sleep2を3秒おき,sleep1を3秒おき・・・]
みたいなタスクを登録して、スタートさせれば
3秒おきに登録した分だけのsleep12が非同期に実行(もし3秒後にsleep12が処理中であっても関係なし、重複非同期実行)
1秒おきに登録した分だけのsleep12が非同期に実行(もし1秒後にsleep12が処理中であっても関係なし、重複非同期実行)
みたいな極簡単な処理だと思ってましたが
scheduleを使いつつ非同期させるやり方がわかりませんでした
0698デフォルトの名無しさん
垢版 |
2021/11/15(月) 20:29:39.63ID:WP/h0dcw
ヘッダーありのcsvファイルをpandasで読み込んでlist化する際にデータをいじることって可能ですか?

data = pd.read_csv("csvファイル名").values.tolist()
print(data)

上記の結果が、
[['¥2,680','ストアA','yes'],['¥680','ストアB','yes'],['¥6,890','ストアC','no']]だった場合に下記にしたいです。
[[2680,'ストアA','ストアA'],[680,'ストアB','ストアB'],[6890,'ストアC','佐川急便']]

ヘッダーは価格、ストア名、配送者です。
スマホから手打ちしたのでズレてたらごめんなさい。
0699デフォルトの名無しさん
垢版 |
2021/11/16(火) 00:23:59.11ID:2pODoVjh
import re
data = pd.read_csv("csvファイル名")
data[‘価格’]=data[‘価格’].map(lambda x:int(re.sub(r’[,\\]’, ’’, x)))
data=data.values.tolist()
0700デフォルトの名無しさん
垢版 |
2021/11/16(火) 00:25:14.03ID:2pODoVjh
yes/noはどうなって欲しいかよくわからん
0702デフォルトの名無しさん
垢版 |
2021/11/16(火) 05:47:58.24ID:gIvqaGJY
Ruby で作ってみたけど、
ひょっとして、この\ は、逆スラッシュ\ と異なる文字を使っている?
"a5"なんて、使う?

p "\".ord.to_s( 16 ) #=> "a5"
p "\\".ord.to_s( 16 ) #=> "5c"

require 'csv'

options = { :headers => true } # ヘッダー有り

# CSV ファイルを、1行ずつ処理する
result = CSV.foreach( "input76_4.csv", options ).map do |row|
# 「,\」を削除してから、整数型へ変換する。
# 注意。この\ は、逆スラッシュ\ と異なる文字です
row[ "価格" ] = row[ "価格" ].tr( ",\", "" ).to_i

if row[ "配送者" ] == "yes"
row[ "配送者" ] = row[ "ストア名" ]
else
row[ "配送者" ] = "佐川急便"
end

row
end

p result
puts result
0703デフォルトの名無しさん
垢版 |
2021/11/16(火) 09:54:19.33ID:OREEnQL3
windowsだと円マークとバックスラッシュに5Cを当ててるけど
Macなんかはちゃんと区別してるってことじゃないの
0709708
垢版 |
2021/11/16(火) 17:30:31.28ID:jfdNp8v5
いらぬおせっかいかもしれぬが、関数型プログラミングの正しい知識があれば、
Python でも標準ライブラリ関数 reduce を使って一行で書けるハズ
なお、内包表記は map/filter の構文糖だから、還元(あるいは畳み込み)機能の
実装である reduce の代替にはならない
これは Pyhthon の問題ではなく内包表記の限界だから、例えば Haskell でも同じ
0711デフォルトの名無しさん
垢版 |
2021/11/16(火) 18:39:12.08ID:GJIVmbG1
スレタイに超初心者用って書いてあるやん
超初心者相手に知識マウント取って楽しいか?
0712デフォルトの名無しさん
垢版 |
2021/11/16(火) 18:44:06.19ID:ndL262TB
無駄無駄
Pythonって単語が入ってしまってる以上どうやっても好き勝手パイ雑談したがるやつが出るから。ルールってそんなもん
Pythonお勉強スレと両方見ててスレの流れだけ見てどっちのスレか区別もなくレスしてる奴がほとんどだろう
0713デフォルトの名無しさん
垢版 |
2021/11/16(火) 19:04:24.15ID:2pODoVjh
関数型プログラミングのメリットって何ですか?
0714デフォルトの名無しさん
垢版 |
2021/11/16(火) 22:37:11.33ID:iw6chFt8
パイ雑談て😅
0715デフォルトの名無しさん
垢版 |
2021/11/17(水) 07:06:55.40ID:ytfPCTgK
seleniumについて質問です
特定のサイトで起こるわけではないのですが、
たまにdriver.get(url)を実行してページ遷移した画面でフリーズすることがあります。

driver.get(url)
wait = WebDriverWait(driver=driver, timeout=30)
wait.until(EC.presence_of_all_elements_located)
で実行していて、要素が確認できてないから待機してるのかと思っていましたが、
driver.get(url)
print("待機中でごわす")
wait = WebDriverWait(driver=driver, timeout=30)
wait.until(EC.presence_of_all_elements_located)
で実行してもフリーズする際は"待機中でごわす"が表示されないので、
driver.get(url)でページ遷移した状態で固まってると思います
0716デフォルトの名無しさん
垢版 |
2021/11/17(水) 07:09:40.02ID:ytfPCTgK
同じurlで繰り返しためしてみても正常に処理できるときがほとんどで
極稀にdriver.get(url)でページ遷移した後の画面でフリーズするので原因がわかりません。
対応策とか分るかた入れ歯教えてください
0717デフォルトの名無しさん
垢版 |
2021/11/17(水) 07:10:50.45ID:ytfPCTgK
あとはdriver.get(url)の次の処理が60秒間の間に始まらなければエラーを返すみたいな処理が可能でしたら教えてほしいです
0720デフォルトの名無しさん
垢版 |
2021/11/17(水) 08:00:22.67ID:k9NuPgD9
日本語翻訳して読みましたが
os.path.devnullってやつを起動時のオプションにいれるか、driver.set_page_load_timeout(15)をdriver.get(url)の次の行に入れればいい感じですかね?
0722デフォルトの名無しさん
垢版 |
2021/11/17(水) 10:23:22.69ID:B6bo55Im
0か1かそれ以外の文字 で構成された配列がある
l = [0, 1, 0, A, www, 9, 1]
mode = ''

すべて0なら mode = 0
0か1なら mode = 1
どちらでもないなら mode = 2
にしたい.
配列の長さが長いときに一番早く整う書き方って
mode = 0
for i in l:
__if i not in (0, 1):
____mode = 2 ; break
__elif i == 1:
____mode = 1 ; break
ですか? in 遅いんでしたっけ?
numpyあたりに高速allみたいなのないですか?
0723デフォルトの名無しさん
垢版 |
2021/11/17(水) 10:29:30.19ID:wlAtkNPK
A と WWW が変数でないならば文法エラー
変数であれば変数の中身次第だが
not in (0, 1):
で期待する動作にはならないだろう
0724デフォルトの名無しさん
垢版 |
2021/11/17(水) 10:32:21.44ID:f/0NZNwK
>>698
csv_normalなら簡単にできるよ!

>import csv_normal as csv
>c = csv.csv([['価格','ストア名','配送者'],[r'\2,680','ストアA','yes'],[r'\680','ストアB','yes'],[r'\6,890','ストアC','no']])
>c.header_idx=0; c.data_row_range = slice(1,None) #ヘッダーとデータ範囲設定
>c.money2int() #通貨文字列を数字に変換
>def hoge(row):
____if row[c['配送者']] == 'yes':
________row[c['配送者']] = row[c['ストア名']]
____else:
________row[c['配送者']] = '佐川急便'
>
>c.map_rows(lambda row: hoge(row)) #配送車列の変換
['', None, None, None]
>c.csv #データ確認
[['価格', 'ストア名', '配送者'], [2680, 'ストアA', 'ストアA'], [680, 'ストアB', 'ストアB'], [6890, 'ストアC', '佐川急便']]
>c.print2() #見やすく表示(5chだからズレちゃう)
+------+--------+--------+
|価格 |ストア名|配送者 |
+------+--------+--------+
| 2_680|ストアA ストアA |
+------+--------+--------+
| 680|ストアB ストアB |
+------+--------+--------+
| 6_890|ストアC |佐川急便|
+------+--------+--------+
0725デフォルトの名無しさん
垢版 |
2021/11/17(水) 10:37:50.75ID:GPq3lXDW
>>722
>>723が言う様に文法エラーだと思うが、文字列だとした場合は
re.search('[^01]',"".join(l))
re.search('[^0]',"".join(l))

一番速いかどうかは知らん
0727デフォルトの名無しさん
垢版 |
2021/11/17(水) 11:55:11.92ID:B6bo55Im
失礼しました
全部strっすね。不定文字列もstr型
'0', '1', 'wooo'
i n ('0', '1')
0728デフォルトの名無しさん
垢版 |
2021/11/17(水) 12:34:52.78ID:4tNSHn/X
in '01':
0730デフォルトの名無しさん
垢版 |
2021/11/17(水) 12:49:55.55ID:iywzxd5E
>>722
その条件だとO(n)で回すにはfor-loopしかない気がする
any()とか使えなくもないけど2周必要だし3つ分岐が必要なことには変わりないので素直にforで回すのがいいと思う

def judge_mode(array):
__mode = 0
__for x in array:
____if x == '0':
______continue
____elif x == '1':
______mode = 1
______continue
____else:
______return 2
__return mode
0731デフォルトの名無しさん
垢版 |
2021/11/17(水) 13:03:09.62ID:4tNSHn/X
def judge_mode(array):
__mode = 0
__for x in array:
____if mode == 0:
______if x == '1':
________mode = 1
________continue
______elif x != '0':
________return 2
____elif x != '0' and x != '1':
______return 2
__return mode
0732デフォルトの名無しさん
垢版 |
2021/11/17(水) 16:16:01.02ID:f/0NZNwK
>>729
csv_normalではデータ読み込みの際のデータ区切りはカンマ固定だったんですが
今回のようにデータにカンマがある例では不便なので、データ区切りを指定できるようにしました

最新Version3.2.4では以下のようにデータ区切りを空白にもできます
c = csv.load('hogehoge.csv', sep='\s+', encoding='utf8')
0733デフォルトの名無しさん
垢版 |
2021/11/17(水) 20:20:04.76ID:ytfPCTgK
>>718
driver.set_page_load_timeout(30)を入れて回してみましたが、フリーズしてから5分くらい待ってもエラーになりません。
0734デフォルトの名無しさん
垢版 |
2021/11/17(水) 20:28:25.14ID:ytfPCTgK
driver = uc.Chrome(options=options, service_log_path=os.path.devnull)

wait = WebDriverWait(driver=driver, timeout=30)

driver.set_page_load_timeout(30)

for url in urllist:
try:
driver.get(url)
print("接続完了でござる")
except:
print("エラー")

で試してもエラーが出ない感じです
0735デフォルトの名無しさん
垢版 |
2021/11/18(木) 07:11:18.86ID:5H17mfWr
psycopg2でテーブル作成時にテーブル名を代入する方法を教えてください

import psycopg2
conn = psycopg2.connect('host=localhost port=5432 dbname=test user=test password=testdayo')
c = conn.cursor()
table_name_list = ["table1","table2","table3",]
for table_name in table_name_list:
c.execute("""
CREATE TABLE IF NOT EXISTS testschema.%s(
"code" text,
)
""",[table_name])
conn.commit()

testschemaにtable1,table2,table3て感じでテーブルを作っていきたいですがうまくいきません。
0736デフォルトの名無しさん
垢版 |
2021/11/18(木) 10:52:34.99ID:/He/baLS
c.execute(f"""
CREATE TABLE IF NOT EXISTS testschema.{table_name}(
"code" text,
)
""")
0737デフォルトの名無しさん
垢版 |
2021/11/18(木) 11:31:32.62ID:IG65qiRj
psycopg2つかったことないけど
それpreparedステートメント透過的につかわれてるの?
0738デフォルトの名無しさん
垢版 |
2021/11/18(木) 16:23:01.48ID:176auHoD
Djangoで python manage.py runserverでサーバーを起動させたが全てのターミナルを消しても上記のサーバーのページにアクセス出来る
どうやったらサーバーを止められる?
0741デフォルトの名無しさん
垢版 |
2021/11/19(金) 19:16:34.09ID:gJnyLrIF
df = df.values.tolist()
print(df)
を実行すると[[a1,b1],[a2,b2],[a3,b3]]のような形でデータを取得できますが、
これをタプルで取得する方法ってありますか?
下記みたいな感じで取得死体です
[(a1,b1),(a2,b2),(a3,b3)]
0743デフォルトの名無しさん
垢版 |
2021/11/19(金) 21:02:22.10ID:gJnyLrIF
>>742
できました!ありがとうございます。

ちなみにpsycopg2で[(a1,b1),(a2,b2),(a3,b3)]のデータを
テーブルに入れるにはどうしたらいいんだ?

import psycopg2
from psycopg2 import extras
conn = psycopg2.connect('host=localhost port=5432 dbname=db user=db password=db')
c = conn.cursor()
insert_list = [(a1,b1),(a2,b2),(a3,b3)]
extras.execute_values(c, "INSERT INTO table values %s", insert_list)
c.commit()
調べたら上記でいけるかと思いましたがだめでした
0744デフォルトの名無しさん
垢版 |
2021/11/20(土) 04:07:01.58ID:Pz0iKQrb
プログラミング自体が初めて2週間ほどなので幼稚な質問をお許しください。

目的:読み込まれたリストから複数の条件で項目を除外する

testlist = ['月A','月B','火A','火B','','水A','水B','','月C','月D']
boxlist = list(map(str, testlist))

というところまで書いた時に、例えばこのリストから
「'月'が含まれている物全て」と「""(空行)」を消したいんです。
(特に空行はどうしても発生する物なので除去必須です)

たとえば『list(filter(lambda...』というのが使えるらしい事は調べたものの
文法がよく分からず何度やってもエラーが出てしまいました。
他の方法でもいいのでなにとぞ複数条件の除去が可能なコードなりを教えてもらえると助かります。
0745デフォルトの名無しさん
垢版 |
2021/11/20(土) 04:49:44.14ID:w0sFPEUw
簡単なところから徐々にステップアップしていけよ
とりあえず超初心者本買って読め
今の調子じゃ一から十まで全部聞くハメになるぞ

newlist = []
for data in testlist:
__if data:
____if '月' not in data:
________newlist.append(data)

これならわかるだろ
lambdaとかfilterは、まずこれが書ける人が次の段階で覚えろ
0746デフォルトの名無しさん
垢版 |
2021/11/20(土) 06:00:34.25ID:hT1QMP3Z
初めて2週間でそんな所まで行くって凄いな
上の奴の言う通りだけどあえて書いてみるならば

testlist = ['月A','月B','火A','火B','','水A','水B','','月C','月D']

a = list(filter(lambda x: x and x[0] != '月', testlist))

filterやmapは高階関数と言うよ
第一引数に関数を取る
第二引数にイテラブルな型のオブジェクトを取る

上記の例ではtestlistから順番に一つずつvalueを:の左のxという引数に取り出して自分で書いたlambda関数内で処理して条件に合うvalueをメモリ領域に一時保存しているよ
そんでtestlistの全てのvalueを取り出し終えたらメモリ上に保存しておいたvalueをlist型に変換してaに代入している

testlist[0]の部分はスライス
0747デフォルトの名無しさん
垢版 |
2021/11/20(土) 07:17:36.90ID:7hjyIAPL
Ruby では色々な書き方ができるが、メソッドチェーンを使うのが、バグらない書き方。
Linux のパイプみたいな感じ。
各フィルターで処理を分けて、実行していく

最後の2つは、処理が複雑

ary_1 = [ "A月A", "", "火B", "", "月C" ]

# 配列から、空文字列を除去する
p ary_2 = ary_1.reject( &:empty? ) #=> ["A月A", "火B", "月C"]

# ary_2 から、月を含む文字列を除去する
p res_1 = ary_2.reject { |str| str.include? "月" } #=> ["火B"]

# 上の2つの処理をメソッドチェーンでつなげる
p res_2 = ary_1.reject( &:empty? ).
reject { |str| str.include? "月" } #=> ["火B"]

# 空文字列か、月を含む文字列を除去する
p res_3 = ary_1.reject { |str| str.empty? || str.include?( "月" ) } #=> ["火B"]

# 上の処理を、lambda にする
lambda_1 = ->( str ){ str.empty? || str.include?( "月" ) }
p res_4 = ary_1.reject{ |str| lambda_1.call( str ) } #=> ["火B"]
0748デフォルトの名無しさん
垢版 |
2021/11/20(土) 08:38:43.30ID:/G7VwRdk
複数のpythonファイルを順に実行する方法ってないですか?

zikkou.py
1.py
2.py
3.py
ってファイルがあった場合にzikkou.pyを実行すると1.py→2.py→3.pyの順で処理してくれる感じです。

import osかimport subprocessでできますか?
0749デフォルトの名無しさん
垢版 |
2021/11/20(土) 08:43:20.89ID:EeA4sZVq
rubyのアタマがバグってるやつはおいといて
今回の件は
news=[dat for dat in olds if '月' in dat]
だけでいいんじゃ〜
forの実直ループ覚えたら内包表記覚えて
そのあと高階関数とpandas行くのだぞ
やりたいことの範囲はopenpyxlぽいけど
0750デフォルトの名無しさん
垢版 |
2021/11/20(土) 09:12:28.20ID:MzN+MOHO
>>748
subprocessでできると思うけど、結局コマンドプロンプトのコマンドを実行するわけだから
zikkou.pyじゃなくてbatファイルで1.py, 2.py, 3.pyを呼び出した方がいいんじゃないかな?
0752デフォルトの名無しさん
垢版 |
2021/11/20(土) 13:43:03.64ID:EfL5Dmlb
>>744
最初の考え方としては `boxlist.filter(空行以外).filter(‘月’が含まれてない)` みたいに2回filterしてやるのでもいいよ

↑をpythonで愚直に実装すると
list(filter(lambda x: '月' not in x, filter(lambda x: x != ‘’, boxlist)))

↑pythonの場合は2回filterするとオーバーヘッドが大きくなるだけなので1回にまとめて
list(filter(lambda x: x != ‘’ and ’月’ not in x, boxlist))

↑pythonではmapやfilterの代わりに内包表記を使うのが一般的なので
[ x for x in boxlist if x != ‘’ and ’月’ not in x ]

↑空行以外のfalsy値(0やNone)も除外してよければ
[ x for x in boxlist if x and ’月’ not in x ]

2回filterしても最適化されてオーバーヘッドかからない言語もあるので
アルゴリズム的な考え方と特定言語での実装とを分けて捉えるようにしておくと後々役に立つ
0753デフォルトの名無しさん
垢版 |
2021/11/20(土) 15:32:34.01ID:/G7VwRdk
>>750
ありがとう!
ちょっとやってみます
0754デフォルトの名無しさん
垢版 |
2021/11/20(土) 15:34:29.98ID:/G7VwRdk
pandasの列のデータ型をnumpy.int64からpythonのintにするにはどうしたらいいんや?
列名["count"]の場合にdf["count"].astype(int)でいけるのかと思ったらできなかった
0755デフォルトの名無しさん
垢版 |
2021/11/20(土) 17:05:24.67ID:Pz0iKQrb
>>744です。
帰ってきたら想像してた以上に色んなやり方を書いてもらえててなんか感動してます。

実は超初心者向けとされている本は読んでいて、>>745さんが書かれてる通りリストやfor inを使う範囲で出来そうな
単純な内容の1000行とかになる記録簿の整理なら覚えた範囲で可能そう、かつ超便利と思ったのがきっかけなんです。
ただ、’月’とかの単語を指定しての除去だけならそれで出来たんですが、同時に空行の除去をしようとすると
ろくに作動しなくなってしまったために色々調べてfilterに行き着いたという流れでした・・・。

特に、というと序列を付けてるみたいで違うのですが、>>745さんのコードが目からうろこでした。
さっきまでどうして空行が除去出来てるのか理解できずググりまくったんですが、さんざん見てたはずの.appendの特性の応用で
正直色々空行の除去についてググってた時に見た色んなコードよりスマートに思えました。

他の皆さんのコードもかなり学び甲斐があってほんと頭が下がりました。
今からまた一個一個調べて見直しますが、かなり成長出来そうなので楽しみです。

・・・ちなみになんですが、こういう引数の知識は基礎の基礎と思うのですが、
その一通りが日本語でまとめてあるような本やサイトってあるんでしょうか?
0756デフォルトの名無しさん
垢版 |
2021/11/20(土) 17:42:34.55ID:IJPPTR8A
pythonの勉強を1ヶ月位してるけど、ここ1ヶ月何度も解いてる問題がノーヒントだと解けない
たとえばこういうやつ

>>
文字列 str1 と str2 が引数として与えられたとき、 str2 が str1 を部分文字列として含むかどうか判定する関数 simple_match を作成してください。
具体的には、str2 を含む場合、 その部分文字列が開始される str1 のインデックスを返値として返してください。
str2 を含まない場合、 -1 を返してください。 ただし、simple_match の中で文字列のメソッドやモジュール(正規表現など)を使ってはいけません。
<<
以下コード
https://techiedelight.com/compiler/?~simple_match

局所的な部分は分かるんだけど、全体を把握してきれいな回答が作れない
こういうアルゴリズムはどっからとっかかりを作って組み立てていくの?
0757デフォルトの名無しさん
垢版 |
2021/11/20(土) 18:00:04.82ID:8IbVqVu9
個人的にそんな問題が解けることになんの価値があるのか理解不能だけど
スライスを使うと簡単に書けるよ
0758デフォルトの名無しさん
垢版 |
2021/11/20(土) 18:01:23.71ID:8IbVqVu9
スライスを知ってるかどうかはアルゴリズムというより言語の知識の話だよな
アルゴリズムを数知ってるよりググる能力が高い方が
十把一絡げレベルのプログラマならよほど当てになると思う
0759デフォルトの名無しさん
垢版 |
2021/11/20(土) 18:17:57.11ID:IJPPTR8A
こういう練習問題をすぐ解けないからって定期的にやり直すより
どんどん先へ勉強を進めてしまった方が良いのか?
0760デフォルトの名無しさん
垢版 |
2021/11/20(土) 18:31:09.23ID:7hjyIAPL
>>756
典型的な2重ループのアルゴリズムの問題

s1 を、1文字ずつ処理していく。
s2 の先頭文字と一致したら、s1のインデックスを保存して、
1文字目の意味で、1も保存する

s1を1文字進めて、s2も1文字進めて、また一致すれば、
2文字目も一致したので、2も保存する

s1を1文字進めて、s2も1文字進めて、また一致すれば、
3文字目も一致したので、3も保存する

この数字が、s2の文字数と一致するまで増加したら、s2がs1に含まれる

スライスを使うと、もっと簡単に書けるのか?
0763デフォルトの名無しさん
垢版 |
2021/11/20(土) 20:00:29.61ID:w0sFPEUw
俺はこれは問題のための問題
クソ問だと思う
特に-1返すとか、モジュールはともかく、文字列メソッド使用不可とかバカの極み
クイズは無視してやりたいことを追え
0767デフォルトの名無しさん
垢版 |
2021/11/20(土) 20:54:17.15ID:785tmrzC
> str2 が str1 を部分文字列として含むかどうか
> str2 を含む場合
逆転してね?
0769デフォルトの名無しさん
垢版 |
2021/11/20(土) 22:02:54.27ID:IJPPTR8A
>>768
いや、これ初心者向けの教材なんだよ
だからこの問いの答えがぱっと出て来なきゃいけないのかと思ったんだ
0770デフォルトの名無しさん
垢版 |
2021/11/20(土) 22:05:42.97ID:hT1QMP3Z
>>769
普通にググればいいよどうしても自力でやりたいなら組み込み関数のソースコード読んでパクればいいんじゃねやったことないけど
0771デフォルトの名無しさん
垢版 |
2021/11/20(土) 22:16:28.52ID:eO5P7jHp
>>756
自分でやるときどうする?
例えば location と cat なら

location
cat → 合わない
location
_cat → 合わない
location
__cat → お、合った、2個ずらしたから 2 を返せばいいんだな

って言うようにずらしながら比較していくよね
って言うところからやればいいんじゃね
0772デフォルトの名無しさん
垢版 |
2021/11/20(土) 23:00:40.68ID:W0+y3mk4
>>766
それが文字列のメソッドに該当するならインデックスアクセスもできねえだろw
解なしになっちまうよ
0773デフォルトの名無しさん
垢版 |
2021/11/20(土) 23:03:09.18ID:W0+y3mk4
まあ、スライスがいい回答だとは思わないけど
小学校の教材ならたぶん0点つけてくる教師がいる回答
0774デフォルトの名無しさん
垢版 |
2021/11/21(日) 00:27:58.17ID:QD7EEWWT
構文などの書き方が分からないってなら仕方無いと思うけど
この程度のアルゴリズムを思い付けないってならヤバいだろ
池沼疑われるレベル
0779デフォルトの名無しさん
垢版 |
2021/11/21(日) 11:02:45.04ID:6VEnDrqa
def simple_match(str1, str2):
____for idx, _ in enumerate(str1):
________if str1[idx:idx+len(str2)] == str2:
____________return idx
____return -1
0780デフォルトの名無しさん
垢版 |
2021/11/21(日) 11:15:39.23ID:6VEnDrqa
さらに速く高機能にした

def simple_match(str1, str2):
____len_str1 = len(str1)
____len_str2 = len(str2)
____if ret := [idx for idx in range(len_str1) if str1[idx:idx+len_str2]==str2]:
________return ret
____else:
________return -1

simple_match('location', 'cat')
[2]
simple_match('soccer', 'cat')
-1
simple_match('locationcat', 'cat')
[2, 8]
0783デフォルトの名無しさん
垢版 |
2021/11/21(日) 15:17:06.09ID:BLVHorEN
列"B1FD24"は存在しませんになって行のデータが取得できません。
解決策おしえてください。

import psycopg2

conn = psycopg2.connect('host=localhost port=5432 dbname=goya user=goya password=goya1395CCC')
c = conn.cursor()

#練習用のテーブル作成
c.execute('''
CREATE TABLE IF NOT EXISTS info_test(
"A_code" text unique,
"weight(g)" integer,
"item_name" text
)
''')
data = [("B1FD24",int(566),"ハンマー"),("B6DE49",None,"空気"),("B4XB21",int(823),"米")]
for d in data:
c.execute(f'INSERT INTO info_test ("A_code","weight(g)","item_name") VALUES(%s,%s,%s) on conflict ("A_code") do nothing',d)
conn.commit()

#練習
c.execute(f'SELECT "A_code" FROM info_test')
a_code_list = [row[0] for row in c.fetchall()]
for a_code in a_code_list:
c.execute(f'SELECT * FROM info_test WHERE "A_code"="{a_code}"')
d = [row for row in c.fetchall()]
print(d)
0784デフォルトの名無しさん
垢版 |
2021/11/21(日) 15:24:19.44ID:BLVHorEN
行データを一行ずつ取得したいのですが、できませんでした。
書き込み時にインデントが消えてしまいましたので再度投下します。
import psycopg2

conn = psycopg2.connect('host=localhost port=5432 dbname=goya user=goya password=ksfdkjwoe')
c = conn.cursor()

#練習用のテーブル作成
c.execute('''
CREATE TABLE IF NOT EXISTS info_test(
____"A_code" text unique,
____"weight(g)" integer,
____"item_name" text
)
''')
data = [("B1FD24",int(566),"ハンマー"),("B6DE49",None,"空気"),("B4XB21",int(823),"米")]
for d in data:
____c.execute(f'INSERT INTO info_test ("A_code","weight(g)","item_name") VALUES(%s,%s,%s) on conflict ("A_code") do nothing',d)
conn.commit()

#練習
c.execute(f'SELECT "A_code" FROM info_test')
a_code_list = [row[0] for row in c.fetchall()]
for a_code in a_code_list:
____c.execute(f'SELECT * FROM info_test WHERE "A_code"="{a_code}"')
____d = [row for row in c.fetchall()]
____print(d)

c.execute(f'SELECT * FROM info_test WHERE "A_code"="{a_code}"')
の部分をc.execute(f'SELECT * FROM info_test WHERE "weight(g)"=566')にすると行データを取れるのでどうしていいかわかりません
0786デフォルトの名無しさん
垢版 |
2021/11/21(日) 15:43:34.67ID:BLVHorEN
>>785
今%sにしてみましたが、
not all arguments converted during string formatting
がでてきてしまいました
0789デフォルトの名無しさん
垢版 |
2021/11/21(日) 17:18:17.35ID:BLVHorEN
>>788
#練習の上の行に下記を入れると表示されるのでinsertは成功してると思います
import pandas as pd
df = pd.read_sql(sql=f'SELECT * FROM info_test;', con=conn)
print(df)

A_code weight(g) item_name
0 B1FD24 566.0 ハンマー
1 B6DE49 NaN 空気
2 B4XB21 823.0 米
0790デフォルトの名無しさん
垢版 |
2021/11/21(日) 17:53:07.18ID:pk+QZJjo
f'SELECT * FROM info_test WHERE "A_code"=\'{a_code}\''
f"SELECT * FROM info_test WHERE \"A_code\"='{a_code}'"
SQL文字列リテラルはSQL標準ではシングルクォート。
0791デフォルトの名無しさん
垢版 |
2021/11/21(日) 18:18:28.27ID:szj4saah
Warning
Never, never, NEVER use Python string concatenation (+) or string parameters interpolation (%) to pass variables to a SQL query string. Not even at gunpoint.

f-stringも同じこと
0792デフォルトの名無しさん
垢版 |
2021/11/21(日) 18:22:31.92ID:BLVHorEN
>>790
できた!できました!!!
ありがとうございます!!!!!!
0794デフォルトの名無しさん
垢版 |
2021/11/21(日) 19:40:20.97ID:coVM5S7R
実験や習作だと思うけどprepared statement使うのが筋だし
f-stringで教えるアホは業界去った方がいい
0795デフォルトの名無しさん
垢版 |
2021/11/21(日) 20:19:01.83ID:BLVHorEN
すまん、791はwarningって書いてあったからよくみてなかった。
初心者すぎてよくわからんのですが、f-stringとprepared statementってどっちがどっちですか?
@f"{a}"のやつ
A(%),aのやつ
結果が同じでも処理に違いがある感じですか?
0796デフォルトの名無しさん
垢版 |
2021/11/21(日) 20:23:30.97ID:BLVHorEN
791google翻訳してみましたが、よくわからん。

警告
変数をSQLクエリ文字列に渡すために、
Python文字列連結(+)または文字列パラメーター補間(%)を使用しないでください。
銃を突きつけても。

(%),aではなくf"{a}"がいいですよってこと?
0798デフォルトの名無しさん
垢版 |
2021/11/21(日) 20:48:25.93ID:BLVHorEN
>>797
ありがとう。
ブクマして少しずつ読んで見る
0799デフォルトの名無しさん
垢版 |
2021/11/21(日) 21:16:22.28ID:zYUtuXs9
基本、Ruby on Rails などのウェブ開発では、

SQL 文を、文字列で組み立ててはいけない!
ユーザーが危険な文字列を送ってきて、SQL injection しようとするから

必ず、危険な文字列をエラーにするように、
place holder という書き方をしないといけない!

フレームワークを使った、ウェブ開発の基本
0801799
垢版 |
2021/11/21(日) 21:44:07.52ID:zYUtuXs9
例えば、Ruby では、

変数a を使って、上の2つのように文字列を連結させたり、
式展開してから埋め込んだりしても、

変数aの内容をユーザーからもらった、危険な文字列の場合、SQL injection される

例えば、WHERE (id = 1 OR 1 = 1)なら、
true となるので、すべてのレコードが取得される!

それを最後のように、place holder, ? を使えば、
危険な文字列をエラーにできる

こういうやり方が、Ruby on Rails などのフレームワークを使った、ウェブ開発の基本

id = '1 OR 1 = 1'

User.where( "id = " + id )
User.where( "id = #{id}" )

User.where( "id = ?", id )
0802デフォルトの名無しさん
垢版 |
2021/11/21(日) 21:46:31.38ID:BLVHorEN
調べてきたけど、プレースホルダーを使わないと攻撃されたとき危険ってのがわかったわ。

ちなみに↓をf''使わずに(%)をつかって書くとどうなるんや?
f'SELECT * FROM info_test WHERE "A_code"=\'{a_code}\''
0803799
垢版 |
2021/11/21(日) 21:47:15.98ID:zYUtuXs9
>>801
修正

変数a ではなく、変数id
0804デフォルトの名無しさん
垢版 |
2021/11/21(日) 21:48:35.16ID:6VEnDrqa
で、結局どう書くのがベストなの? こう?
c.execute("SELECT * FROM info_test WHERE A_code=%s", (a_code,))

テーブル作成とかの"A_code"って、ダブルクォーテーションいらないんじゃない?
ttps://www.curict.com/item/20/20f70b7.html
とか見るとダブルクォーテーションで囲ってないよね
0806デフォルトの名無しさん
垢版 |
2021/11/21(日) 22:20:00.67ID:EfkKXMOb
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

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

クソチョンw
クソチョンはウンコを食べる糞食人種w
ゲリ便をじゅるじゅると
うまそうに食ってるw
0807デフォルトの名無しさん
垢版 |
2021/11/21(日) 22:30:00.92ID:nzk7IXVa
>>804
記号とかを含まなきゃ " " で囲む必要ない
info_test, item_name, A_code とかは囲まなくても良いけど weight(g) は多分だめ
0808デフォルトの名無しさん
垢版 |
2021/11/21(日) 23:10:08.06ID:i/lteX3h
>>807
そうそう、だからカラム名に()とか入れないほうがいいのよね。めんどくさいから
必要な場合自分は逆引用符`使ってるけど
0810デフォルトの名無しさん
垢版 |
2021/11/23(火) 12:20:48.24ID:HWlCU4L+
3.10に変えたらscikit-learnがインストール出来なくなった
まあそう頻繁に使うライブラリでもないけど
0812デフォルトの名無しさん
垢版 |
2021/11/23(火) 20:09:45.21ID:HurF++pM
>>811
a<0になるようにプログラム組んだけどもしa<0になったまま次にいくと
機械がつぶれる
不安だというとき
assert文で例外エラーだしてストップさせるとか
0813デフォルトの名無しさん
垢版 |
2021/11/23(火) 20:42:03.75ID:mB/cMOfZ
あくまで開発中の考慮漏れなんかを防ぐ用途なので
ランタイムエラーにしたいならassertの出番ではない
0814デフォルトの名無しさん
垢版 |
2021/11/23(火) 22:55:20.18ID:bS29UIDJ
>>812
要するに
> a<0になるようにプログラム組んだけどもしa<0になったまま次にいくと機械がつぶれる
みたいな意味不明な状況を検出するためだよね
0815デフォルトの名無しさん
垢版 |
2021/11/23(火) 22:55:45.59ID:xEN2JBOU
var : Optional[str] =None

on_btn():
__assert var
__var処理

みたいな。pylanceとかに怒られない
varにモノ入ってっからbtnが押されるに決まってんだろうがっていうとき

on_btn():
__if not var:
____return
__else:
____var処理

て書くのがバカらしいので
0816デフォルトの名無しさん
垢版 |
2021/11/24(水) 03:25:37.66ID:Q5JPayEq
>>812
絶対壊れる未来しか観えない
0818デフォルトの名無しさん
垢版 |
2021/11/24(水) 08:02:23.61ID:jO3RIx+f
1000行のプログラムって初心者からすると途方もない規模のプログラムに感じるけど、慣れた人からすると当たり前な規模なのかな
0819デフォルトの名無しさん
垢版 |
2021/11/24(水) 10:22:49.14ID:9k7x+oD0
一本の文脈でプログラム書こうとすると人間は必ずワーキングメモリの限界がくるから、そんなもんだよ
自分の場合、そうやって場当たり的に書けるのは1000行くらいが限界だな
大きなプログラムを書くには、プログラムというものをトップダウンに考えて、モジュールや関数に適宜分割していくことが必要
そうすることで枝葉の細かい部分を忘れてワーキングメモリを節約できる
特にPythonの場合はJupyter使って勉強する人が多いから、プログラムの分割が身に着きにくいんだよ
0821デフォルトの名無しさん
垢版 |
2021/11/24(水) 10:42:31.59ID:kXzWnsgO
>819
Jupyterは慣れた人が楽するためには良いけど
あれで勉強するのは限界もあるな
Jupyterが悪いとは言ってない
あれがPython世界の全てだと勘違い認識しないようにするのが大事
0822デフォルトの名無しさん
垢版 |
2021/11/24(水) 11:34:24.45ID:q9kQZP30
Jupyterなんか、ここ5年くらいてpythonはいった人の一部がつかってるだけで、python流行り出した2005年頃から利用してるpython使ってる組み合わせは今もあまり使ってないでしょ。
0823デフォルトの名無しさん
垢版 |
2021/11/24(水) 16:15:21.36ID:uoHN98GH
今日中にあるサイトのスクレイピングコードを書かないといけなくなりました
しかしスクレイピングはしたことがありません
どのように書くのがいいのでしょうか?
恐らくpostであろうformっぽい部分にデータを入れて検索すると色々と表示される感じです
djangoだろうと思います
インプット・アウトプットが特にイメージできません
0825デフォルトの名無しさん
垢版 |
2021/11/24(水) 17:33:42.69
まぁresponseがjsonなのかhtmlなのかによるけど
後者ならbeautifulsoup4(他にもあるけど安定してるのはなんだかんだでbs4)
スクレイピングはrequestsとbs4だけでどうにかなることが大半
なんのデータを扱うかによるが時系列やら行列計算するならならpandas,numpyも必須
データベースに出力と言うなら、djangoで何使われているかは知らんが
sqlite3のORMのsqlalchemyで事足りることが大半

レスから察するにインプットは、
forms.pyだかview.pyだかに
クエリかリクエストボディ(get/post)受け取る部分書いて
スクレイピングするコードをclass Command(BaseCommand):形式で書いて
適当に名前つけてpyファイルにして
management>commandsディレクトリに放り込んで終い。
で、view.pyで受け取ったパラメータをそのCommandに投げて
結果をtemplatesに渡して表示する感じじゃなかたっけ
0826デフォルトの名無しさん
垢版 |
2021/11/24(水) 17:40:18.98
>management>commandsディレクトリに放り込んで終い。
コマンド使わないなら↑これは必要なかったわ
全部 views.pyに書いても分けても好きにしたらいいと思う
0827デフォルトの名無しさん
垢版 |
2021/11/24(水) 19:16:52.56ID:xsp2scS+
ぼくも3ヶ月くらい前からスクレイピングの勉強始めてようやくほしいデータを物怖じせず取れるようになりましたが、自分はseleniumとlxmlに落ち着きました。

requestsだとうまく取れないページがあったり、scrapyだと非同期処理?で爆速過ぎてサイトから速攻banされたりしました

サイトによってはpyppeteerやseleniumじゃないととりづらいとこもあるのでselenium+beautifulsoup or lxmlをおすすめしたい
0829デフォルトの名無しさん
垢版 |
2021/11/25(木) 01:42:23.64ID:nh0ZEMSE
Ruby では、Nokogiri, Selenium WebDriver, Capybara

Nokogiriには、wait が無いから、
5ch みたいに、空のHTML を送ってきてから、
Ajax でページ内容を取得するようなサイトでは、要素が取れないかも

要素が出現するまで確実に待つには、Seleniumを使う
0830デフォルトの名無しさん
垢版 |
2021/11/25(木) 02:33:04.16ID:Xt1TOEJK
NokogiriがインストールできないってQiitaではクッソほど量産された記事ですよね
ガイジ言語には本当にお似合いだと思った
0831デフォルトの名無しさん
垢版 |
2021/11/25(木) 05:20:37.28ID:xhC4D+V9
確率がpの宝くじを当たるまで引いて、当たるのにかかった回数を記録。それをn回繰り返し(100万回とか)、最後はそれをpyplotでヒストグラムにしようとしています

回数を記録する配列はndarrayで作り、そこにnp.concatenateで回数を追記していったのですが、どうもこれが処理が重いのか時間がものすごくかかる…
サイズが100万の配列を作る以外に思いつかないのだけど、このやり方は良くないのでしょうか?
0832デフォルトの名無しさん
垢版 |
2021/11/25(木) 07:58:41.89ID:ysfwc6h6
ndarrayは固定配列。だから、appendなどサイズを変更する処理は考えなしにしてはいけない。
0833デフォルトの名無しさん
垢版 |
2021/11/25(木) 09:32:49.11ID:1DZpA8jw
例えばM回引いてk回当たったとするじゃん?
するとk回の「当たるまで引いた」データが取れるわけだから、律儀に「当たるまで引く」をn回繰り返す必要はない
0835デフォルトの名無しさん
垢版 |
2021/11/25(木) 09:44:51.66ID:r5Heuy4P
concat は無駄が多いので
予め最大の大きさが判ってるならその大きさで確保しておくとか
最大が判らないなら concat せずに list で繋ぐ方が速い
0837デフォルトの名無しさん
垢版 |
2021/11/25(木) 10:42:23.98ID:jB6AdxeI
ヒストグラムの範囲毎に予め変数作って当たりが出る度に直接そこに+1してカウントして行けば
100万個の「当たるのにかかった回数」を全て保持する必要が無いと思うが
何か他にデータ残したい理由があるの?
0838デフォルトの名無しさん
垢版 |
2021/11/25(木) 12:47:25.27ID:+wzV+gbn
確率の収束をマジで計算しちゃうと何したって遅いよ
0.01%当たるまで を100万回
リストに数字appendするの100万回
それぞれやってみたらいい

後者は1秒とかでしょう
前者は1万回試行のレベルでも1分くらいかかるべ
0840デフォルトの名無しさん
垢版 |
2021/11/25(木) 15:31:05.54ID:fS0drys5
確率はscipy.stats.berniulli.rvs(p)で求めてたけど、確かにこれを100万回繰り返すのに時間かかってますね…
リストにappendは100万回でも一瞬でした

しかし、これ以外で確率求める関数なさそうだし困ったな…
ありがとうございました
0841デフォルトの名無しさん
垢版 |
2021/11/25(木) 19:42:57.03ID:37B47xca
pythonで生成したhtml文字列を、
一時ファイルを経由せず直接ブラウザに渡す方法ある?
webbrowserモジュールではURIしか渡せないようなので
0842デフォルトの名無しさん
垢版 |
2021/11/25(木) 19:53:24.24ID:mqEOsm/5
>>840
先に固定長確保すればさらに速いよ
0843デフォルトの名無しさん
垢版 |
2021/11/25(木) 19:54:52.38ID:0uwmxbI7
>>841
動的なポート(=0)で1回だけリクエスト受け付けるHTTPServer作成
パスはランダムでも固定でも任意
webbrowserモジュールにその動的なURIを渡す
0844デフォルトの名無しさん
垢版 |
2021/11/25(木) 20:21:07.43ID:0YPlXaMU
>>842

l = [0] *1000000
for i in range(1000000):
__l[i] = i

l = []
for i in range(1000000):
__l.append(i)

誤差じゃね?
0845デフォルトの名無しさん
垢版 |
2021/11/25(木) 21:11:00.95ID:yEJnYkB5
文字列に/dとxと.とcm以外の文字が含まれている場合にエラーが発生するように死体です。
moziretu_list = ["36.4x27.5x18.8cm","風量調整なし","36.4x27.5x18.8cm","Size:140型(14x14cm);Color:【No.01】2枚セット"]
for moziretu in moziretu_list:
____try:
________print(moziretu)
________#moziretuに/dとxと.とcm以外の文字が含まれている場合にエラー
________if re.search(r"正規表現の書き方がよくわからないです",moziretu):
____________raise ValueError
________print("必要な文字列の取得に成功しました")
____except:
________print("文字列に/dとxと.とcm以外の文字が含まれています")

moziretu_listの2つめと4つめの要素の時にエラーが発生するようにしたいのですが、
正規表現の書き方がよくわからないです
0848デフォルトの名無しさん
垢版 |
2021/11/25(木) 21:58:41.55ID:yEJnYkB5
>>847
だと4つめの"Size:140型(14x14cm);Color:【No.01】2枚セット"がとれてしまいます。
0849デフォルトの名無しさん
垢版 |
2021/11/25(木) 22:03:38.00ID:yEJnYkB5
すみません。matchからsearchにしたら行けました!!
0850デフォルトの名無しさん
垢版 |
2021/11/25(木) 23:05:36.84ID:37B47xca
>>843,841
レスサンクス

鯖を使わず直接やりたかったので、data URIでやってみた
プレーンのままだと、改行処理とか面倒くさいので、
base64でエンコードしてやってみたらうまくいった
ただ、webbrowserモジュールを使うとWindows OSがこのプロトコルで開くことを許可しないので、
subprocess.Popenを使ってブラウザ指定(Firefox)
そしたら、ブラウザ自体もこのプロトコルで開くことがデフォルトではできないので
設定を変更して、なんとか一時ファイル経由と同じ状態で開くことができた
文字化けさせないようにするのがけっこう大変だった
ただ、ブラウザの設定をいじってまで直接やりとりに拘る必要もないのかなとも思ったよ
0854デフォルトの名無しさん
垢版 |
2021/11/26(金) 03:43:17.12ID:o6j9/HV6
乱数のタネを乱数にしてペッ別に始めればばiid
どっちにしても疑似乱数を使うとiidは崩れる
「疑似」だけに
問題はそこまで厳密性を求めるかどうか
0856デフォルトの名無しさん
垢版 |
2021/11/26(金) 11:34:14.13ID:TzeTaFZ5
シードを乱数にしたら重複する可能性あるから
UUID的なやつか同時実行しない前提で時刻から生成しないと
0861デフォルトの名無しさん
垢版 |
2021/11/28(日) 00:22:44.41ID:UCS6EEgA
プログラムが大きくなったとき
管理しやすくなる
再利用もしやすくなる
ちゃんとclassを設計すればだが
0863デフォルトの名無しさん
垢版 |
2021/11/28(日) 01:31:06.42ID:YY1hk1pY
>>862
似たようなメソッドで機能が違うもの作るとき
少し出すだけで作れるとか

敵と自機をキャラというクラスに持たせて
画面表示や移動という共通部分は一度に設定できてそうじゃない部分を
簡単に分けられる
んで全体的少しずつ変えたい時に
一箇所変えれば両方変えられる
みたいな
0864デフォルトの名無しさん
垢版 |
2021/11/28(日) 07:21:31.61ID:nfhtQiKt
my_literal_eval(str):
__try
____return ast.literal_eval(str)
__except SyntaxError:
____return str

samples = my_literal_eval(str) #辞書
samples.keys()
としたときに、型チェッカーがkeys()あるかわがんね!!って怒るんですが
どこで辞書型の宣言をしたらいいですか?
0866デフォルトの名無しさん
垢版 |
2021/11/28(日) 08:46:26.48ID:TS21VHmH
>>858
極力使うな
クラスは設計した人しか理解できないブラックボックス
いじるのが自分だけならいいけど
他人がメンテする可能性のあるコードにクラスは使うな
0868デフォルトの名無しさん
垢版 |
2021/11/28(日) 09:34:35.03ID:/NNHm8tx
令和のstaticおじさん現る
0869デフォルトの名無しさん
垢版 |
2021/11/28(日) 12:45:20.85ID:nfhtQiKt
>>865
assert isinstance(samples,dict)
samples.keys()

いけました。多謝
ところで
assert type(samples) == dict
は型チェッカー通らなかったんだけど、なぜですか?継承的な理由?
0870デフォルトの名無しさん
垢版 |
2021/11/28(日) 14:02:56.10ID:/OsOh/FW
windowsで
python_ide.exe /run sample01.py
ってやるとIDE起動しつついきなり実行して結果を表示して
そのあとから編集なりデバッグなりが出来るIDEかエディタってありますか
いちいちプロジェクト作ってF5押してとかやらずにできるものがいいです
0872デフォルトの名無しさん
垢版 |
2021/11/28(日) 23:04:03.88ID:SJI7MgMY
漏れは、デスクトップにショートカットを作って、
WSL2, Ubuntu-18.04 を起動して、
VSCode で、その中のproj01 プロジェクトを開く

リンク先
C:\Windows\System32\wsl.exe code .

作業フォルダ
\\wsl$\Ubuntu-18.04\home\ユーザー名\proj01

これを応用して、VSCode に「ruby a.rb」とか、
実行したいプログラム・スクリプトファイル名を、引数として渡せるかも知れない

漏れは知らないけど
0873デフォルトの名無しさん
垢版 |
2021/11/28(日) 23:41:14.23ID:bWBMruPI
getメソッドのformを送信したときに表示されるページをスクレイピングしたい
getメソッドなのでチェックボックスやinputの有無や内容でurlが変わるのでそのurlに直接値を入れてrequests.get()で送ろうと思う
このときどのような設計をすればいい?

formにどのような値を入れるかは状況によって異なるのでその部分をまずどうするか
クラスにして__init__に書くかそれとも他にいい手段があるか
0874デフォルトの名無しさん
垢版 |
2021/11/28(日) 23:43:03.05ID:bWBMruPI
あと初歩的な質問だけど__init__(self, test):でコンストラクターを定義して例えばself.test = testと書いた
これでそのクラス内でself.testでアクセスできると思ったがselfがないと出る
何故か分かる?
0875デフォルトの名無しさん
垢版 |
2021/11/29(月) 00:15:55.62ID:wv+/7oZZ
知らんけどそのクラスメソッドの最初の引数にselfって書いてないんじゃねーの(ハナホジ)
0882デフォルトの名無しさん
垢版 |
2021/11/30(火) 11:38:22.32ID:+4eAilPB
>>874
self って仮の名前に過ぎないから
__init__(slef, test):
とかになってても
slef.test = test
だと通る
もちろん
self.test = test
が通らない
0884デフォルトの名無しさん
垢版 |
2021/11/30(火) 12:05:19.58ID:1ptP5nW8
>>882
へぇそうなんだ
俺の場合はクラスの中で自身のクラスをインスタンス化してたのが良くなかったっぽい
0886デフォルトの名無しさん
垢版 |
2021/11/30(火) 12:35:00.71ID:PosRcxUn
条件分岐用の関数をテキトーに作ったら?こんな風に使えるように
y = ifelsefunc(x > 0, -1, 1)
0888デフォルトの名無しさん
垢版 |
2021/11/30(火) 22:01:14.38ID:YBfM7cAP
pandasの列置換について質問です。

import pandas as pd
df = pd.DataFrame({'deli_name': ['自社配送', '自社配送', 'store_A'], 'store_name': ['store_A', 'store_B', 'store_C'], 'price': [890, 833, 7842]}, index=[0, 1, 2])
df.deli_name[df.store_name == 'store_A'] = 'store_A'

上記はstore_nameがstore_Aの時に該当する行のdeli_nameをstore_Aに置換するつもりで書きました。
実行すると置換に成功しているのですが、下記の警告文が出ます。
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
警告がでない書き方とか分る方教えてください
0889デフォルトの名無しさん
垢版 |
2021/11/30(火) 23:30:55.06ID:Z8ik9ZGC
import pandas as pd
pd.options.mode.chained_assignment=None
df = pd.DataFrame({'deli_name': ['自社配送', '自社配送', 'store_A'], 'store_name': ['store_A', 'store_B', 'store_C'], 'price': [890, 833, 7842]}, index=[0, 1, 2])
df.deli_name[df.store_name == 'store_A'] = 'store_A'
0891デフォルトの名無しさん
垢版 |
2021/12/01(水) 00:11:27.02ID:X46if3HQ
>>888
deli_name_copy = df.deli_name.copy()
deli_name_copy[df.store_name == 'store_A'] = 'store_A'
df.deli_name = deli_name_copy
0892デフォルトの名無しさん
垢版 |
2021/12/01(水) 11:49:27.95ID:kM+Jjoc8
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

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

クソチョンw
クソチョンはウンコを食べる糞食人種w
朝鮮人はゲリ便をじゅるじゅると
うまそうに食うw
0893デフォルトの名無しさん
垢版 |
2021/12/02(木) 13:28:11.18ID:XKNm0UTJ
beautifulsoupで<div class="box_area">の下にあるpタグの下にある全ての<span class="link_pdf">タグの下にあるaタグを取得するには例えばどう書けばいいですか?
0898デフォルトの名無しさん
垢版 |
2021/12/03(金) 00:05:29.70ID:/aixTtEw
ビルトインのlist、dict使えってことなんじゃね?困ることあるん?
0899デフォルトの名無しさん
垢版 |
2021/12/03(金) 01:06:36.94ID:mlmp5wts
3.9から
list[int]
とか
dict[str, int]
とか書けるようになったから要らんだろってこと
この調子でイテレータもどうにかして欲しい
0900デフォルトの名無しさん
垢版 |
2021/12/03(金) 02:36:40.94ID:XIVj35HM
>>893
下と言う表現は、あいまい

下と言っても、子・直下のみは、> を使う

例えば、id がabc の直下の、xyz クラス
#abc > .xyz

(再帰的な)子孫なら、半角空白を使う

例えば、div の子孫の、p
div p

詳細は、jQuery などのCSS セレクター一覧表を参照
0904デフォルトの名無しさん
垢版 |
2021/12/05(日) 21:47:07.14ID:z1lQW/5A
はじめてプロファイラー使ってみたら
Pythonでファイルの存在確認って遅くないか?
じぶんの環境だけなのか?
0905デフォルトの名無しさん
垢版 |
2021/12/05(日) 21:58:46.62ID:z1lQW/5A
自己解決
ファイルの存在確認が遅いのはHDDのせいみたい
2度目以降は高速になった 
キャッシュが聞いてるからかと
0906デフォルトの名無しさん
垢版 |
2021/12/06(月) 00:07:26.37ID:Phmk8fSW
HDD関係なく初回のstatが遅いのはWindowsも含めUnix系のファイルシステムだとしょうがない
0907デフォルトの名無しさん
垢版 |
2021/12/06(月) 07:12:36.68ID:1pNPp5ri
コマンドプロンプトのような見た目のコンソール上で動く、CUIの特殊な計算機があります
C言語で書かれていてコンパイル済みのフリーソフトです
これをpythonで操作して自動化に役立てようと思っています

出力はコンソール上に文字列でなされるのですが、文字列を直接取得する方法はありますか?
0909デフォルトの名無しさん
垢版 |
2021/12/06(月) 08:58:45.68ID:1pNPp5ri
>>908
ありがとうございます
VSCODEで試してみてるんですが
引数にそのexeファイルだけ取って、runかpopenを使うと、どちらでもコンソールにCUIが直接表示されます
(そのままキー入力すると普通に動作します)

しかし引数にstdin=PIPE,stdout=PIPE,などを入れるとピクリとも動かなくなります(CUIが出ない、communicationやinputなどで入力を試みても出力がなく先に進まない、エラーも吐かない)

何か間違えたのだと思うのですが、
解説ブログやドキュメントを読んでも全く解決策がわからず困り果てています
何かご存知の方がいらしたらお願いします
0910デフォルトの名無しさん
垢版 |
2021/12/06(月) 09:06:19.91ID:1pNPp5ri
すみません、書き間違えました
runまたはpopenでexeファイルを開くと、
VScodeの画面上で、「ターミナル」にCUIが表示されます
そこにキー入力するとそのまま動作します。
0911デフォルトの名無しさん
垢版 |
2021/12/06(月) 10:11:30.79ID:+xtv5Wsa
expect相当がほしいならpexpectとか
標準モジュールだけで解決するのは面倒なのでPyPIで探すのが吉
0912デフォルトの名無しさん
垢版 |
2021/12/06(月) 12:38:40.47ID:+ZC47hZJ
>>909
問題を再現できるコードを提示するか切り分けするかしてもらわないと
Pythonのコードの書き方が悪いのかその計算機の呼び出し方が間違ってるのかわからない

1. 単純なpipeを使ったコマンドをpopenで動かしてstdout, stderrを取れてるかどうか?
$ echo "foo.txt" | grep -o ".t"
(echoやgrepはwindowsのコマンドで代用して)

2. 取れてるなら特殊な計算機はpipeを使ったコマンドで動くのか?
$ echo “1 + 2” | foo.exe

CUIと言ってるのがncursesのようなTUIだとSendKeysが必要かも
0913デフォルトの名無しさん
垢版 |
2021/12/06(月) 17:45:57.66ID:eUQmGuZl
visual studioでkeras/tensorflowのデバッグ方法でつまっています
K.sigmoid()やtf.boolean_mask()のようなバックエンド処理ばかりなのでデバッグ中に変数の中身が分かりません
今はとりあえずnumpyや独自実装で移植しながら中を見てデバッグしています
しかし問題にぶつかったとき原因が移植作業なのか元々のソースなのか切り分けができず困っています

keras.backendなどを使いながらも変数の中を見れるようにする方法ないでしょうか?
0914デフォルトの名無しさん
垢版 |
2021/12/06(月) 18:44:05.67ID:5Z6rXs0A
>>911
ありがとうございます。試してみます。

>>912
ありがとうございます。
1.は難しくて実行できませんでした。
2.について、送りたい入力を付けて実行してみたところ、cmdのコンソール上に求めるexeファイルの起動時初期状態の画面が現れて入力待ちになり(入力すると正常に動作する)、求める結果は得られませんでした。

TUI、対話型という言葉を知らなかったのですが、検索したところどうもそれらに該当するように思えます。
pexceptを使ってみようと思います。
0915デフォルトの名無しさん
垢版 |
2021/12/06(月) 20:25:32.94ID:ZoRh0Nkj
ターミナルでfor命令を1行で実行する場合、両サイドを[]で囲むじゃないですか
>>> [i for i in range(10)]
のように。この[]は、一般的になんて呼ばれていますか?
0918デフォルトの名無しさん
垢版 |
2021/12/06(月) 23:38:34.79ID:fS/Lj56T
すいませんmaxについて教えて下さい。
ordered_list_xrp = [menber.get('price') for menber in open_orders_xrp]

このコードでリストを取得してこのようなリストがとれました、
['99.460', '104.150', '118.290', '123.800', '127.440', '130.990']

次にこのリストの中から最大値を取得しようとして、
このようなコードを実行したのですが、
max_price_list_xrp = float(max(ordered_list_xrp))

結果が、99.46になってしまいました、
最大値はリスト最後の、130.99のはずなのに、
どうしてうまく取れなかったのでしょうか?
0920デフォルトの名無しさん
垢版 |
2021/12/06(月) 23:50:20.47ID:UpeudXBw
>>918
文字列だからだよ。
0921デフォルトの名無しさん
垢版 |
2021/12/06(月) 23:51:25.10ID:fS/Lj56T
>>919
>>920
ありがとうございます、
floatで数字にしたつもりだったのですが、
何か間違えてますか?
0924デフォルトの名無しさん
垢版 |
2021/12/06(月) 23:58:55.21ID:fS/Lj56T
>>922
うぉありがとうございます!
これでやってみたらちゃんと正しい最大値とれました、
文字列のリストにこんな罠あるの知りませんでした、
数字に変換するのすごい、感動しました!
0925デフォルトの名無しさん
垢版 |
2021/12/07(火) 01:52:20.23ID:904hja4x
pythonのselfについて教えてくだしあ
selfはインスタンス自身を表すってのはわかったんですが、
自分のクラスのメソッドの中でselfを関数として呼ぶと何が起こるんですか?
つまりこんな感じです

class Testclass:
 def __init__(self):
  pass

 def kansuu(self):
  self("hikisu") #←これ何してるんですか?
0926デフォルトの名無しさん
垢版 |
2021/12/07(火) 07:54:32.43ID:G7aiaFNj
dict((str(i),i) if i%2==0 else (i,str(i)) for i in range(10))

max(float(x) for x in ordered_list_xrp)

この2つってどういう順番で何が起きてんの?
0927デフォルトの名無しさん
垢版 |
2021/12/07(火) 08:26:52.55ID:KRSgdo5l
>>925
self.__call__が実行される
0929デフォルトの名無しさん
垢版 |
2021/12/07(火) 15:22:45.64ID:g74FV+wu
pythonは後出しだから慣れないな
python「ここにこれを代入して。ああ、もしもこの条件だったら代入するのはやっぱりこっちね。ああ、その代入はループでしてね」
ほかの言語「次の処理をループして。もしもこの条件だったら、ここにこれを代入、条件違ったらこっちを代入」
0931デフォルトの名無しさん
垢版 |
2021/12/07(火) 18:04:11.03ID:cqBSzh42
EmpathというA PIを用いてその結果の数値をリストにまとめシリアル通信でarduinoに送りたいです。
↓リストにまとめた以降
RGB = [round(red) , round(green) , round(blue) , energy , calm] 
print (RGB)

send_RGB = bytes(RGB)
print(send_RGB)

with serial.Serial('COM15' , 9600) as ser:
print('----')
ser.write(send_RGB)
print('----')
こんな感じでbyte型にできているのか(そもそもbyteにするか)わからないのですが
この数値をarduinoに取り込みたいので何か参考にさせてください。
受け取るarduino側が悪いのかもしれませんが。。
0932デフォルトの名無しさん
垢版 |
2021/12/07(火) 18:47:54.90ID:g74FV+wu
csvの文字列にした方がいいよ。簡単にやるならこんな感じ
送信側はcsv文字列で送信
受信側は1文字ずつメモリに貯め込んで改行コード検出で、そこまで貯まった文字列が数値と区切り文字だけで構成されてて区切り数が正しかったら正規なデータとして処理
受信側テストはターミナルソフトで手入力したcsv送って処理できたらおk
0933デフォルトの名無しさん
垢版 |
2021/12/07(火) 19:57:20.96ID:1b+mdTOc
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

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

クソチョンw
クソチョンはウンコを食べる糞食人種w
朝鮮人はゲリ便をじゅるじゅると
うまそうに食うw
0934デフォルトの名無しさん
垢版 |
2021/12/12(日) 02:21:30.33ID:neH/oCpw
Pythonで「オブジェクトが存在しなかったら作る」という処理を書きたいと思ってます
Pythonは3.6.9、OSはAlmaLinux8.5、IDEはVS.codeです

import class
if (objA is None):
  objA = class.classA('nameclassA')

とやってみたのですが、if文のところで name 'objA' is not defines となってしまいます

何かよい方法はありますか
0936デフォルトの名無しさん
垢版 |
2021/12/12(日) 02:58:35.01ID:neH/oCpw
>>935
回答どうもです

いただいた回答にて対応してみました
うまく動作しているようです

ありがとうございました
0937デフォルトの名無しさん
垢版 |
2021/12/12(日) 03:00:27.68ID:lyarTocF
>>934
try: objA
except NameError:
objA = class.classA('nameclassA')
0938デフォルトの名無しさん
垢版 |
2021/12/12(日) 03:42:09.06ID:neH/oCpw
>>937
なるほど例外で対処する方法ですね
ありがとうございます
こちらでの対処も考えてみます
0939デフォルトの名無しさん
垢版 |
2021/12/12(日) 12:38:50.06ID:0NBntfzw
メタプログラミングするレベルでこんなのわからんのも変
十中八九設計がおかしい
0940デフォルトの名無しさん
垢版 |
2021/12/12(日) 14:44:59.69ID:qWcO2iK8
>>934
まあ正解は>>935だと思うが文字通り
> Pythonで「オブジェクトが存在しなかったら
と言うなら
if('objA' not in globals() and 'objA' not in locals()):
かな
0941デフォルトの名無しさん
垢版 |
2021/12/12(日) 16:17:39.25ID:GOu/cbbC
サーバー側のタイムゾーンはUTCという前提で、
それをフロントエンドで日本時間表示することになりました
しかしその表示に使うライブラリがawareを受け付けなくて
nativeでないといけないのです つまり
awareなUTC時間のdatetime型 → nativeなJST(Asian/Tokyo)時間のdatetime型
への変換をすることになったのですが
これを一発で変換するようなメソッドって
標準はもちろんpytzとかにも用意されてませんよね?
一度timestampに変換してtimedeltaにして演算
という認識で良いのでしょうか?
0942デフォルトの名無しさん
垢版 |
2021/12/12(日) 17:28:22.24ID:9VS1oyXL
失礼します
BeautifulSoupというライブラリを使って"任意のサイトのhtmlソースから特定の部分だけを抜き出して表示する"というプログラムを作りたいのですが、ググっても"URLの中の一部の文字列"のみを抽出する方法が分からないので教えて頂きたいです

具体的には、htmlソースからUA-XXXXXXX-Xという文字列を抜き出したい場合、
<p>UA-XXXXXXX-X</p> ←これならできるのですが

<script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXX-X";></script> ←この場合にUA-XXXXXXX-Xだけを抜き出す方法が分かりません
0944デフォルトの名無しさん
垢版 |
2021/12/12(日) 17:35:49.84ID:a4cuZ/Mw
1. scriptエレメントを全部取得する
2. ↑で取得したscriptエレメントのsrcを読み取る
3. ↑で読み取ったsrcにua〜が含まれてるかチェックする
って流れで考えれば分かりやすいんじゃない?
0947デフォルトの名無しさん
垢版 |
2021/12/12(日) 20:30:44.55ID:9VS1oyXL
>>944,945,946
ご丁寧にありがとうございます。特に945さんに貼って頂いたコードは大変参考になりました。
お陰様で目的は達成できたのですが、他の余計な行も大量に表示されてしまいます。
邪魔な行を取り除くには下のコードに何を追加すればよいでしょうか?

b''
b''
b''
↑こんな感じで不要な行が残っています

・ソースコード
from bs4 import BeautifulSoup
from urllib.parse import urlparse
import requests

url = input("Enter a domain: ")
r = requests.get("http://"; +url)
data = r.text
soup = BeautifulSoup(data)
for link in soup.find_all('script'):
urls = link.get('src')
res = urlparse(urls)
print(res.query)
0949デフォルトの名無しさん
垢版 |
2021/12/14(火) 11:59:17.10ID:s9Ba9CTM
PysimpleGUIについてちょっと聞きたいんですが、
sg.popup_get_fileを使いたいんですが、ファイルを選択せずキャンセルを行うと
『TclError: can't set "::tk::dialog::file::showHiddenBtn": parent namespace doesn't exist』
といったエラー文が出てしまうんですが、何が問題なのでしょうか

公式に載ってる↓のコードでもエラーが出るのでとっかかりすら掴めません・・・
import PySimpleGUI as sg
filename = sg.popup_get_file('処理したいファイルを入力してください')
sg.popup('入力した', filename)
0950デフォルトの名無しさん
垢版 |
2021/12/14(火) 20:49:18.01
import numpy as np
a1=np.array([1])
a2=[1]
print(type(a1[0]),type(a2[0]))
print(a1[0]==a2[0]) #@
d1={"n":a1[0]}
d2={"n":a2[0]}
print( json.dumps(d2) )
print( json.dumps(d1) ) #TypeError: Object of type int64 is not JSON serializable

#@がTrueになるのってpythonのバグではありませんか・・?
仕様であれば何かメリットとかあるのでしょうか?
0951デフォルトの名無しさん
垢版 |
2021/12/14(火) 21:04:19.38ID:70QYvgE2
a1[0]は(int32の)1でしょ?そしてa2[0]も(intの)1
int32とintぐらいの差でfalseになると色々困る
0952デフォルトの名無しさん
垢版 |
2021/12/14(火) 21:30:31.61ID:lu87KQQd
コード追ってはないけどnumpy側でそういう風に__eq__実装してるだけ
なんなら
>>> a1 == a2
array([ True])
になるしうれしいけど変だわな
0953デフォルトの名無しさん
垢版 |
2021/12/15(水) 11:10:32.17
>>951-952
なるほど
pandasもnumpy int64なので
dataframeを何かしらのAPIに投げるときに
そのままjson.dumps使えたらなぁと思いましたが
とりあえずはint32変換して成型した方がよさそうですねありやした
0954デフォルトの名無しさん
垢版 |
2021/12/17(金) 08:55:01.03ID:s+y1HFod
Windows、Linuxの両方で動作するスクリプトを作ろうと思っているのですが
スクリプトのファイルの改行コードについて、CR+LFがよいのかLFがよいのか
教えて下さい

#!/usr/bin/env python3
print("aaa")

こういうshebangが使われたスクリプトの場合なのですが、関連付けやbashのshellext等の
設定が無い環境では
・改行コードがLF
 →Windowsだと「python3 〇〇.py」で実行OK。ただし編集はエディタを選ぶ
 →Linuxだと「./〇〇.py」でも「python3 〇〇.py」でも実行OK
・改行コードがCR+LF
 →Windowsだと「python3 〇〇.py」で実行OK
 →Linuxだと「./〇〇.py」は「bad interpreter」となる。「python3 〇〇.py」では実行OK
…となりますよね

いずれのOSでも必ず「python3 〇〇.py」として実行できますし、
改行コードの問題はshebangの問題なので
・ファイルの改行コードはCR+LF
・Linuxでの実行は「python3 〇〇.py」で行う。shebangは書かない、使わない
こうするのが最も無難な方針に思えますが、いかがでしょうか
それともshebangも活用すべき、文字コードはLFとすべき、なのでしょうか
0955デフォルトの名無しさん
垢版 |
2021/12/17(金) 10:09:24.99ID:Ufm8xgDf
世の中のWinアプリ以外のソースはほぼLFだし
コーディング用途にLF扱えないエディタの出番はなくない?
それかハマりどころあるけどGit管理でautocrlf活用するか
0957デフォルトの名無しさん
垢版 |
2021/12/17(金) 13:32:20.53ID:fkpshCq+
Windowsがメインだけど、シバンは使う、改行はLF
エディタ(NPP)でもアドオンつかって、保存時にLFで自動で保存(問い合わせ)できるようにしている
0958デフォルトの名無しさん
垢版 |
2021/12/17(金) 16:27:15.20ID:6e8bb+xR
LF以外の選択肢考えたことなかったわ
0959デフォルトの名無しさん
垢版 |
2021/12/17(金) 17:25:27.22ID:tWB5K5S1
漏れは、WSL2, Ubuntu 18.04 で、
日本人が作った、バージョンマネージャーのanyenv で、rbenv, nodenv を使っているけど、
たぶん、CR + LF だとバグる

#!/usr/bin/env ruby

echo -e "$RBENV_ROOT\n$NODENV_ROOT"
/home/ユーザー名/.anyenv/envs/rbenv
/home/ユーザー名/.anyenv/envs/nodenv
0962デフォルトの名無しさん
垢版 |
2021/12/18(土) 00:15:24.44ID:mxS9DQCX
pandasで、1つの列のデータからapply()を使って複数の値を戻り値として返してそれぞれ別々の列として追加したいです。
(列データxに対して、x*2, x/2 を返す等)

DataFrameのapply()には、result_type='expand'で複数戻り値を別々の列(Series)に格納できるものがありますが、Seriesのapply()にはresult_typeがありませんでした。result_type='expand'のようなシンプルなやり方をするにはDataFrameのapply()を使うしか無いですか?
できればSeriesを指定した上でapplyを呼び出したいです。

ちなみに、呼び出した関数でpd.Seriesを戻り値として返すやり方もWebで見つかりましたがものすごく処理が遅かったので正しいやり方では無さそうです。
0963デフォルトの名無しさん
垢版 |
2021/12/18(土) 00:37:48.68ID:mmV8s4af
applyを2回呼ぶのは?
0964デフォルトの名無しさん
垢版 |
2021/12/18(土) 01:52:04.79ID:mxS9DQCX
それが一番簡単ですが冗長な感じと思ったので…
でも、result_type='expand'も処理時間が遅いようなので、やはり複数回呼び出す方法にします。
0967デフォルトの名無しさん
垢版 |
2021/12/18(土) 23:23:56.96ID:rJsqD2PP
以下のようなファイル・ディレクトリ構成でツールを作ってます
mainscript.py
modules/
 __init__.py
 moduleA.py ← 実際のメイン処理
 moduleB.py ← 関数を別ファイル化

mainscript.pyの中でmoduleA.pyに書いた機能を使うので、mainscript.pyの中にて
from modules import moduleA
として読み込んでいます

ここで、moduleA.pyは、moduleB.pyに書いた機能を使ってます
この場合、moduleA.pyに
from modules import moduleB
と、「from modules import 〜」が無いと動作しないので、必要なのだと思ってます

しかしmoduleA.py、moduleB.pyを流用するとき、moduleA.pyは「from modules」を
流用先のディレクトリ構成にあわせて修正しなければならず、困ってます
また「modules」ディレクトリは、mainscript.pyから見てのものであり、
moduleA.pyに「from modules」文があると、moduleA.pyだけ見ていても
modulesディレクトリは親ディレクトリであることを読み取れず、それも困ってます

上記のような構成にしたとき、このような問題を解決する方法を教えてください
0969デフォルトの名無しさん
垢版 |
2021/12/18(土) 23:35:58.62ID:rJsqD2PP
>>968
回答ありがとうございます

moduleA.pyに相当するものが多数あるので全ての修正はこれからですが、
うまく動作しそうです

ありがとうございました
0971デフォルトの名無しさん
垢版 |
2021/12/20(月) 11:22:53.74ID:sxGOmJ2J
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

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

クソチョンw
クソチョンはウンコを食べる糞食人種w
朝鮮人はゲリ便をじゅるじゅると
うまそうに食うw
0972デフォルトの名無しさん
垢版 |
2021/12/23(木) 16:13:24.40ID:UaimnPqj
beautifulsoupで取得したページでth:-soup-containsというセレクターを使うと
NotImplementedError: ':-soup-contains' pseudo-class is not implemented at this time.
と出ます。

この原因は何でしょうか?必要な情報があれば載せます
0974デフォルトの名無しさん
垢版 |
2021/12/23(木) 22:05:30.20ID:Gg61L1jf
streamlinkってpythonで書かれてるんだよね。
python的な書き方ってないの?
subprocess使って
subprocess.call(['streamlink', url, 'best', '--hls-duration', time, '-o', out2])
ってやってるんだけど、python的な書き方は無いのかなって思って。
0976デフォルトの名無しさん
垢版 |
2021/12/23(木) 22:40:50.88ID:Gg61L1jf
>975
このページ、白バックに白文字になってるところが多くて読みづらいですね。
fd = stream.open()
data = fd.read( 00:30:00)
fd.output(filename)
みたいな書き方できないのかなって。
0977デフォルトの名無しさん
垢版 |
2021/12/23(木) 22:49:03.00ID:Gg61L1jf
read()でbyteじゃなて時間で指定したいし、readしたdataをoutputする方法が知りたいんです。
codec は copy で、生のまま ts とか mp4 にoutputしたい。
スクリプトのサンプル探してるんだけど、みんな ffmpeg に渡したり、subprocess 使ってる。
0978デフォルトの名無しさん
垢版 |
2021/12/23(木) 23:04:17.60ID:zCNeJPRa
取得後は単なるデータ列としてか扱えないぽいから
https://streamlink.github.io/api.html#streamlink.stream.HLSStream
コマンドライン同様どう取得するかを指定できるだけであまりうれしくなかった。
それでいいならI/Oとしては扱える。

MPEGコンテナ操作するプログラムを別途書けば加工もできるけど
どこまで制御したいかによる。
0979デフォルトの名無しさん
垢版 |
2021/12/23(木) 23:19:13.76ID:Gg61L1jf
取得したデータをffmpeg-pythonに渡してoutするしかないんですかね。
0980デフォルトの名無しさん
垢版 |
2021/12/24(金) 06:23:53.37ID:7mLGjij2
Visual Studio Code で python 3.9を使用していたのですが
python 3.10にアップデートしました
match文を使ってみたところ、インデントのエラーが表示されます
実行はできます
Visual Studio Codeで何か設定したりしなければいけないのでしょうか?
0982デフォルトの名無しさん
垢版 |
2021/12/24(金) 17:30:33.82ID:7mLGjij2
>>981
Python Language Server を jedi から pylance に変えたらエラーがでなくなりました
正しい対応かわかりませんが、しばらくこの設定でやってみます
0983デフォルトの名無しさん
垢版 |
2021/12/25(土) 14:28:37.83ID:O1DganTQ
vscは基本pylanceでええょ
0984デフォルトの名無しさん
垢版 |
2021/12/25(土) 15:00:20.62ID:f1xUz6ll
Pythonの拡張のデフォルトランゲージサーバーってpylanceにじゃなかった?
まだデフォルトになってないっけ
0985デフォルトの名無しさん
垢版 |
2021/12/25(土) 18:39:11.66ID:wLd1kjlZ
Jediに設定したことがあったらそっちが使われるからな
俺は今でもJediを使ってる
Pylanceだと、Python 2/3の互換性を維持しようとすると、
もう片方のインポートエラーとかが鬱陶しいんだよ
まぁ、黙らせる設定でもいいんだけど、Jediのほうが手っ取り早いので
0986デフォルトの名無しさん
垢版 |
2021/12/25(土) 23:26:55.99ID:4wn3W7Lt
10桁以上のint値を扱うと、自動で数字変換されてしまうのですが、どういう原理になってんでしょうか?
6631510311なら-1978424486に変換

ライブラリはNumpyとPandas
0987デフォルトの名無しさん
垢版 |
2021/12/26(日) 01:16:59.54ID:bjcghV5B
32ビットintだと21億までしか表現できないから適当な数(ルールはあるが面倒だからここでは触れない)に置き換えられてる
64ビットintにすれば置き換えされない
0988986
垢版 |
2021/12/26(日) 11:08:42.45ID:+UpYRQsi
解決しました。有難う
intにもビット指定があったんすね
0990デフォルトの名無しさん
垢版 |
2021/12/26(日) 15:33:50.15ID:ipgF0889
不等号を反転させ、逆の結果を得たいと思いました
a,bはint型ですが3や5には特に意味はありません
b>a(例 5>3)がTrueとなるような値を取ります
f=-1でその逆の結果になるのを想定しています

a=3
b=5
def hoge(f=1):
_if f*(b-a)>0:
__print("o")
_else:
__print("x")
hoge()
hoge(-1)

これでいいでしょうか?
例外があったり、こういうことをする場合の標準関数とかすでにあるのかなと思い質問しました
0992デフォルトの名無しさん
垢版 |
2021/12/26(日) 15:52:21.23ID:YaEmqJRZ
関数にするんだったらdef hoge(a,b)みたいにしたほうが分かりやすいと思う
符号を1、-1、0で返してくれるnumpy.sign()ってのもある
0993デフォルトの名無しさん
垢版 |
2021/12/26(日) 17:08:09.42ID:JuKsRG7c
すみません。ソースコードのディレクトリ、ファイル構成については以下を参照しているのですが、正しい情報でしょうか?
ttps://rinatz.github.io/python-book/ch04-07-project-structures/
また、上記ではライブラリとアプリケーションの区別が出来ない構成であることが問題とされています。
ライブラリを作成後、それをアプリケーションで使いたい場合、アプリケーションのソースコードの構成はどのようにするのが、定跡なのでしょうか?

よろしくお願いいたします。
0996デフォルトの名無しさん
垢版 |
2021/12/26(日) 17:54:42.34ID:JuKsRG7c
>>994
すみません。教えていただいた情報も基本的にパッケージに関する構成についての説明のようです。
パッケージを自作することは出来そうですが、それを呼び出すアプリ側をどうすればいいのかはよくわかりませんでした。
0997デフォルトの名無しさん
垢版 |
2021/12/26(日) 22:23:52.52ID:bjcghV5B
993のgithubの文章はアプリケーションとライブラリと両方の側面を持つプロジェクトの話をしてるけど、あなたのプロジェクトもそうなの?
そうなら文章の一番下に書いてある構成を取ればいい
そうじゃなくて他のプロジェクトからこのプロジェクトをパッケージとして参照したいということなら、それはsys.pathsの話であってプロジェクト構成はあまり関係ない
0998デフォルトの名無しさん
垢版 |
2021/12/26(日) 22:34:36.91ID:bjcghV5B
んでパッケージを他のプロジェクトから参照したいなら
利用される方のパッケージをpip installできるように作ってインストールするか
他のプロジェクトの方で起動前にPYTHONPATHを設定するか
他のプロジェクトの方でimportする前にsys.pathを追加するか
さしあたりはどれかをする必要がある

ここらはいいガイド文章を知らないので知ってる人に紹介してほしい
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 86日 7時間 49分 11秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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