X

【まず1嫁】くだすれPython(超初心者用) その55

レス数が1000を超えています。これ以上書き込みはできません。
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 ###
2021/10/01(金) 15:51:56.85ID:131QCENJ
pythonの本この前かったわ
エロ画像収集するんだ
3デフォルトの名無しさん
垢版 |
2021/10/01(金) 16:14:27.26ID:xAAYN8E1
最近 youtube 側のクローラー対策アルゴリズムが変わったらしく
前に描いてた python スクリプトがエラー吐くようになった
適当に wait 入れてアクセス頻度落とすとエラー出ない訳だが
遅くなるのでぎりぎり最適の wait にしたいんだが肝心な google 側のアルゴリズムが不明
納得行く速度が出るまでごちゃごちゃ試すと BAN されちゃうかな?
2021/10/01(金) 16:20:44.94ID:PaEGpo5A
契約して、YouTube API を使えば?
2021/10/01(金) 16:57:41.48ID:xAAYN8E1
おにただ正論
2021/10/01(金) 18:22:34.09ID:1X70H7Xp
python関係無いしw
2021/10/01(金) 19:40:08.43ID:CQRkUSDD
うちもとあるサイト毎週引っこ抜いてたらいつもはない臨時メンテがあってその直後非同期だと接続エラーはくようになったな
非同期なくしたら大丈夫だったので今はおとなしく1倍速で落としてるけど。IPBANされなかっただけマシか
8デフォルトの名無しさん
垢版 |
2021/10/01(金) 19:59:28.33ID:XZxvwPE1
pypy(パイパイ)って発音しにくいよね、特に社内だと( ^ω^)・・・
2021/10/02(土) 11:36:25.91ID:rV5kYlEk
魑魑こそ正義
10デフォルトの名無しさん
垢版 |
2021/10/02(土) 15:09:37.96ID:yFRwYWli
pypiのクローラーねぇ
11デフォルトの名無しさん
垢版 |
2021/10/02(土) 23:18:51.11ID:zWqv5K6j
クソチョンw
2021/10/05(火) 14:54:46.13ID:eLBz+/wl
プライベートクラス変数にするメリットってどのようなときがあるのでしょうか・・
https://docs.python.org/ja/3/tutorial/classes.html#private-variables

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

それとは別にメリットとして、オブジェクトの中からしかアクセスしない変数
として使うなら、class外に書いた方がいいような?
13デフォルトの名無しさん
垢版 |
2021/10/05(火) 15:14:02.22ID:I18ZMSNA
>>12
神がコーディングするならどうでもいいけど
クラス外に置くとドキュメンテーションの点で劣る
識別子の置き換えが発生しないと意図しない副作用の可能性を残してしまう
ひとつでもそういう箇所があると疑心暗鬼になり生産性も落ちる
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)
で問題ないでしょうか?
もっと綺麗な書き方あったら教えてください。
2021/10/05(火) 15:58:59.57ID:UD2fraRe
>>12
その例は、Mappingクラスが、MappingSubclassのupdateメソッドではなくMappingクラスのupdateメソッドを呼び出したい場合の実装例。

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

サブクラスが__update変数自体をオーバーライドしようとしても、内部的に識別子を変えてるから大丈夫ですよ、そんなことできませんよ、と言っている
2021/10/05(火) 16:07:03.30ID:UD2fraRe
>>14
https://docs.python.org/3/library/os.path.html#os.path.splitext
2021/10/05(火) 16:13:46.71ID:gsPNBZV0
>>14
PurePath使え
2021/10/05(火) 16:16:39.53ID:+YzW1gaU
>>16
>>16
splitextを使うと、basenaname_without_extが""の場合うまくいかないんです
2021/10/05(火) 16:32:23.12ID:UD2fraRe
>>18
splitextの戻り値の第2要素が空文字列だったら第1要素と第2要素をひっくり返せばよいのでは?
2021/10/05(火) 16:35:35.19ID:+YzW1gaU
>>18
PurePath試してみました。
これもbasenaname_without_extが""の場合うまくいきません
2021/10/05(火) 16:38:24.45ID:+YzW1gaU
>>19
"..jpg"のようなファイル名の場合ひっくり返してもうまくいきません
22デフォルトの名無しさん
垢版 |
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)
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)
めんどいからもう_
2021/10/05(火) 17:31:21.64ID:+YzW1gaU
>>22
これもbasenaname_without_extが""の場合うまくいきません
2021/10/05(火) 17:36:31.51ID:+YzW1gaU
>>23
理解できない…ムズイ
検証もやりかた分からないです
何をやってるか理解出来たら後でコメントします
2021/10/05(火) 17:40:40.24ID:UD2fraRe
...のところにファイル名を入れて実行してください
basename = 'hoge.jpg'
2021/10/05(火) 18:00:15.70ID:yMBvIvKg
二重拡張子の場合はどうするの?
*.tar.zxとか
2021/10/05(火) 18:10:11.85ID:+YzW1gaU
>>26
拡張子がある場合正常に動きました
拡張子がない場合はうまくいきませんでした
拡張子がない場合を別処理すると14で書いた処理より長くなる・・・
正規表現勉強してみます
2021/10/05(火) 18:29:46.70ID:+YzW1gaU
>>27
二重拡張子は各アプリ毎に取り決めが違うので個別に考えるしかないかと
"abc.net.txt" とかを二重拡張子扱いしたらまずいですし
2021/10/05(火) 19:15:38.22ID:db3O09Qx
Python 3.10入れてみたけどIDLEのプロンプト表示が良くなってるね
最初違和感があったけど、これは見やすくて良いわ^^

新機能の構造的パターンマッチに注目ですな、これは使っていきたい
2021/10/05(火) 19:55:29.85ID:CsDVkN/q
当方でも、パッケージ管理ソフトChocolateyにPython 3.10が来たようでPython 3.9から自動更新された
困ったことに、pywin32がまだPython 3.10に対応してない
2021/10/05(火) 19:59:53.84ID:xYzI00Mc
vscodeでこのウィンドウどうやって出すの?

https://i.imgur.com/PK7erF2.jpg
33デフォルトの名無しさん
垢版 |
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)
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
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+"\"")
2021/10/05(火) 21:49:55.73ID:+YzW1gaU
>>34
"C:\\test\\.b"
の場合、うまくいきません
resolve() absolute() 等初めて見るものが多いので調べてみます
2021/10/05(火) 22:19:04.45ID:yMBvIvKg
3.8からのセイウチ構文は便利だと思うけど、見通し悪くなるしどうも好きになれない
先に変数にしたほうがわかりやすくないか?
if m := re.match(r'(.*)(\.([^.]+))|(.*)', basename):

m = re.match(r'(.*)(\.([^.]+))|(.*)', basename)
if m:
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
39デフォルトの名無しさん
垢版 |
2021/10/05(火) 22:36:52.31ID:JbR3YU6O
おまいらマジでポンコツだなω
2021/10/05(火) 22:46:47.72ID:+YzW1gaU
>>38
stem, ext = ext, stem[1:] ですね。
最初に覚えた書き方から少しずつpathlibに書き換えてるけどまだ慣れない
os.pathが頭にこびりついてる
41デフォルトの名無しさん
垢版 |
2021/10/05(火) 23:11:06.33ID:UD2fraRe
>>36
basenameって書いてるのだからbasenameを渡して
2021/10/05(火) 23:34:48.42ID:+YzW1gaU
>>41
??
>>35
basename = os.path.basename(file)
でbasename渡してますが、??
>>36>>34へのレスですが
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:]
2021/10/06(水) 00:26:22.25ID:63dnmtAL
ドットファイル名だから
".b"が返らないとダメなのでは?
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
2021/10/06(水) 00:38:36.79ID:uIHfQozZ
>>44
LinuxではそうでもWindowsは違うと思うんですが・・・
2021/10/06(水) 00:53:55.80ID:63dnmtAL
>>46
今のWindowsはエクスプローラー上でドットファイルの作成が出来るようになってるし
WSLなんかでも困ることになるので、ちゃんとドットファイルとして扱ったほうがいいと思うよ
2021/10/06(水) 01:06:01.53ID:uIHfQozZ
>>47
不特定多数からファイル受け取るんです
エクスプローラー上でドットファイルの作成が出来るからなおさらドットファイルとしては扱えないんです
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'
5045
垢版 |
2021/10/06(水) 01:18:15.89ID:sqxilgxU
隠しファイルか?

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

特殊ファイルを作らせたら、ダメ
2021/10/06(水) 01:22:00.09ID:uIHfQozZ
>>49
'.' txt'
'test' 'txt'
'test.tar' 'xz'
'test' ''
相対パスは扱わない、というか、basenameを処理
'test' 'txt'
basenameを処理
'' 'test'
'.test' 'txt'
'test' ''
2021/10/06(水) 01:27:53.38ID:uIHfQozZ
>>50
不特定多数にだめといってもしょうがないでしょう
受け取った後、問題ないファイル名にして、後続処理しますが
最初からドットファイル扱いすると処理抜けする
2021/10/06(水) 01:49:05.27ID:63dnmtAL
>>51
.test は ファイル名じゃなくて拡張子として扱うのかぁ
2021/10/06(水) 01:53:11.34ID:uIHfQozZ
>>53
そうです
windowsでは例えば、".jpg"は普通にjpegファイルとしてあつかわれるので
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')
5631
垢版 |
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 …」を追加インストール
レジストリ登録するらしく管理者権限も必要
57デフォルトの名無しさん
垢版 |
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}]
2021/10/06(水) 11:06:28.93ID:YjJCqwIe
アップする前にちゃんとデータ検証しとけよ。
ary=[{'dict':'test'},{'dict':'test2'}]
for itm in ary:
__print(itm)
59デフォルトの名無しさん
垢版 |
2021/10/06(水) 11:17:52.70ID:N2DvDSnL
>>58
ありがとうございます
早速試したみましたがそれっぽいことができました
printした結果、前後の[ ]がなくなっていてリストではなくなっているようにみえるんですがこいつをリストにはできないですか?
2021/10/06(水) 11:23:52.33ID:YjJCqwIe
各要素には[ ]はもともと付いてないからな。
その程度がわからんようなら基本的な知識が不足しすぎ。

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

最初の分解する前の状態でも渡せないことはないんですが全部一度に渡すと具合悪いので分割して一つずつ渡したい感じです
63デフォルトの名無しさん
垢版 |
2021/10/06(水) 11:48:29.59ID:IkoUshwC
あれipが変わってしまいました
64デフォルトの名無しさん
垢版 |
2021/10/06(水) 12:10:25.68ID:IkoUshwC
リストで渡す=json文字列で渡す
って意味なのかな?
そうならjson文字列で渡したいのです
2021/10/06(水) 12:23:59.95ID:YjJCqwIe
>>62
>うーん、よくわからんっす
[itm]がわからんてこと? 書いてあるママだが。
リストで渡せるならわざわざjsonにする必要はない。
その理解度でweb apiを触ろうとするのが逆にすごいな。
66デフォルトの名無しさん
垢版 |
2021/10/06(水) 12:28:38.78ID:IkoUshwC
for [itm] ってことですか?
エラーで返ってきますけど
2021/10/06(水) 12:31:24.23ID:YjJCqwIe
>>58
print([itm])だよ
もうちょい基本的なところから勉強したほうがいいよ
68デフォルトの名無しさん
垢版 |
2021/10/06(水) 12:40:42.74ID:IkoUshwC
なるほど!試してみますw
69デフォルトの名無しさん
垢版 |
2021/10/06(水) 12:49:00.18ID:IkoUshwC
できました!
すげえっす
めっちゃサンキューな
2021/10/06(水) 15:56:51.31ID:phrbWxHz
StreamlitからLiberoffice Base操作するってどうしたら良いですか?
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()がかぶる気がするのですが
2021/10/06(水) 21:26:27.63ID:xpgZiC6t
3.10来てるじゃねえか教えろよ


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

ドットで終わるファイル名・ディレクトリ名
attribute = win32api.GetFileAttributes(file) -> 例外
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

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

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

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

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

で例外が発生する場合、該当ファイルを読み飛ばして処理を行う方法はありますか?
自力で再帰読込はできればやりたくありません
2021/10/07(木) 22:28:17.75ID:xRnq/kAQ
最後がドッドのアクセスできないディレクトリに入ろうとして例外が出るのかな?
これは自力で再帰読込するしかないよ、再帰はそんな難しくないと思うよ! がんばって^^
2021/10/07(木) 23:35:06.59ID:vIJYcTdp
超レアケースなのでルートのディレクトリ毎エラー処理することにします
できればファイル単位でエラー処理したかったのですが
93デフォルトの名無しさん
垢版 |
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")
2021/10/07(木) 23:53:44.05ID:vIJYcTdp
>>93
ありがとうございます。
早速検証してみます
2021/10/08(金) 00:17:02.73ID:T4fYgd16
>>93
すごいです
完璧に動いてます
早くこのレベルのプログラムがしたい
本当にありがとうございました
96デフォルトの名無しさん
垢版 |
2021/10/08(金) 00:41:36.79ID:x4lgXBGS
Path.glob()いいね
いままでos.walk()で自前でフィルタしてたけど今度つかってみる
2021/10/08(金) 08:04:57.04ID:dABXXppr
ジェネレーターのスゴさを認識できた
98デフォルトの名無しさん
垢版 |
2021/10/08(金) 09:08:14.69ID:Pr4xGBUG
globって見に行かない名前のファイルかディレクトリなかったっけ?
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後毎に処理するような節とかテクニックや慣習はあるのでしょうか
2021/10/08(金) 09:56:28.31ID:3oVEDenR
イマイチ何言ってるかわからんけど、関数でいいんじゃないの?
2021/10/08(金) 10:14:00.03ID:LO45Vby3
if条件の中にはif条件1とif条件2で違う処理も入っているので
continueするときに必ず行う処理はべつのとこに書いた方が見やすいかな
と思ったのです
つまり、continue文の宣言自体がそれ(continueするときに必ず行う処理)を示すような書き方があれば
と思ったのですがなさそうですね
ありがとうございました
2021/10/08(金) 10:20:00.72ID:Q4k4Ultl
書いてる例だけ見るとcontinueを使うべきケースではなさそう
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
みたいにした方がいいのかもしれませんね
2021/10/08(金) 10:54:49.70ID:dABXXppr
for i in range(100):
____if i != 0:
________if 条件1:
____________関数A()
________if 条件2:
____________関数B()
________関数1("")
________continue
2021/10/08(金) 11:39:53.95ID:3oVEDenR
>>103
関数1でi==0で実行しない設定にしとけばいいだけだろ。
10645
垢版 |
2021/10/08(金) 12:38:00.40ID:EgdGtVHT
>>50
に書いたけど、

Ruby のglob では、. で始まる、隠し directory/file を除く
107デフォルトの名無しさん
垢版 |
2021/10/08(金) 14:27:43.17ID:hfI/PPIh
tkinterでrowconfigure([1, 2, 3], weight=1)とかすると
_GridIndexにlist[int]できねーよって怒られるんだけど実際はできる
どういう型指定したらいいんでしょうか
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")
2021/10/08(金) 22:49:21.67ID:T4fYgd16
ドットで終わるディレクトリがあっても例外が発生しない場合があるようです。
例外が発生しない場合、このコードで正常・異常分類できてます
例外が発生した場合、探索が打ち切られているような感じです。
解釈間違ってるかも
例外が発生した場合、全件エラーにした方がよさそうです。
2021/10/08(金) 23:04:50.88ID:T4fYgd16
例外が発生しない場合でも
ドットで終わるファイル・ディレクトリを検出したら全件エラーのほうが安全かな
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があるぞっていう意味合いのためなんでしょうか?
2021/10/09(土) 08:45:15.87ID:TxyuJC/9
>>111
>JapanesePersonとsuper()つかったJapanesePerson2って同じ意味っすよね?
違うよ、super()を使った方は基底クラスPersonの属性name,ageに値をセットするが
JapanesePersonの方は基底クラスの方にセットせずに重複したJapanesePersonの属性name,ageにセットしている
Personを継承している意味がナッシング
2021/10/09(土) 09:52:36.10ID:3hwdJKmG
>>112
そうなんですね
yamada.sample1() でself.name,self.ageが参照できてるので
なんのためにsuper().__init__でわざわざ値セットする必要があるんだろう??と気になったので。
def sample1(self):のselfってなんなんだ??みたいな
ありやした
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+'/*')]
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番挙動がまともでした
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が'/'と'\\'をどう使い分けてるかよくわからないです。
取得したパスが'/'と'\\'混在してたりするし・・・
2021/10/09(土) 13:20:34.47ID:A9QtIjdU
>>116
決め打ちじゃなく正規表現の書き方なのか?
急いで調べます
2021/10/09(土) 13:22:15.13ID:TxyuJC/9
>>116
どっち使ってもいいし混在してもいいみたいですよ

>>____except FileNotFoundError as e:
>>________print(e, file=sys.stderr)
これ有益な情報が得られないとあるけど、どのディレクトリかファイルで例外発生したかは分かったの?
分からなかったらpも表示させた方がいいんでない?
2021/10/09(土) 13:49:18.15ID:A9QtIjdU
>>118
例外発生したディレクトリの名前が信用できないんです
except FileNotFoundError as e: のところで分かるのは、発生したということだけです
恐らく発生したと思われるディレクトリ名は既にp_err_filesに入ってます
例外が発生したときのみ全件エラーにするなら何かフラグを立てたほうがいいと思います
今回はドットで終わるものを見つけたら、エラーログにp_err_filesを書き出して
全件処理しないのでこれで十分かと
その後、手作業でエラーログのすべてに対応すると思うので、例外発生個所の情報は使いません
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)):は危険です
2021/10/09(土) 14:45:18.21ID:A9QtIjdU
>>120
詳しく書きますね
最初ドットで終わるディレクトリに入れなくて例外すると考えていました。
テストしているとそうではないと思うようになってきました。
例外が発生原因はドットで終わるディレクトリです
でも必ず例外が発生するわけではありません
pathlib.globが最後に探索する箇所がドットで終わるディレクトリの場合、例外は発生しません
この状態でドットで終わるディレクトリのうしろに問題のないディレクトリを追加します
そうすると、ドットで終わるディレクトリではやはり例外は発生しません
例外が発生するのは次の問題のないディレクトリです
このとき、間違ったファイル名で処理をしようとしてFileNotFoundErrorが発生していると思われます
例外で取得できるのは問題のないディレクトリにアクセスするときの間違ったファイル名です
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では正常に動くようです
123デフォルトの名無しさん
垢版 |
2021/10/09(土) 15:30:28.23ID:Ngy1mnu3
printと書かない以外でなんか出力するのある?
124デフォルトの名無しさん
垢版 |
2021/10/09(土) 16:19:52.75ID:/xiMgjvY
sys.stdout.write()
125デフォルトの名無しさん
垢版 |
2021/10/09(土) 16:24:43.13ID:dPZPc1xL
WindowsというかDOSの頃から内部は/でもパス区切りできて
バックスラッシュ要求するのはシェルや一部のアプリ
単体プログラムなら/で書いたほうがポータビリティある
2021/10/09(土) 18:09:17.61ID:JVX7Q22F
>>121
Path.globでイテレータを作成した後に追加・削除されたファイルやディレクトリは
イテレーションに含まれるか含まれないかは不定なので
それでも困らないような使い方じゃなければ使い方が悪い

>例外で取得できるのは問題のないディレクトリにアクセスするときの間違ったファイル名です
問題のないディレクトリなのに間違ったファイル名なのか・・・・
全部読んでないからかよくわからん
127デフォルトの名無しさん
垢版 |
2021/10/09(土) 19:07:55.16ID:Ngy1mnu3
統合環境?総合環境?
おすすめの教えて
winでもマックでもリヌクスでもいいです
128デフォルトの名無しさん
垢版 |
2021/10/09(土) 19:13:36.12ID:/xiMgjvY
eric4
2021/10/09(土) 19:19:03.79ID:A9QtIjdU
>>126
書き方があいまいでしたね
イテレータを作成する前に追加してます
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
131デフォルトの名無しさん
垢版 |
2021/10/09(土) 23:27:09.55ID:cIVnj/jm
>>130
ありがとう
参考にしてそれぞれ入れてみて稼働確認?動作軽いのか?とかやってみます。
132130
垢版 |
2021/10/10(日) 00:15:53.95ID:lB7MFpHR
プロ用では、anyenv から、Docker へ移行していくだろう
133デフォルトの名無しさん
垢版 |
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
にあるように、いくつかの属性にアクセスできるんだけど
この属性のそれぞれが何を意味してるのかっていうのは、どこに書いてあるんでしょうか
ドキュメント的なものを探してるんだけど、見当たらなくて
134デフォルトの名無しさん
垢版 |
2021/10/10(日) 08:00:27.46ID:kKlMir+m
>>133
https://www.ellogon.org/petasis/index.php/tcltk-projects/tkdnd/tkdnd-man-page#lbAI
TkinterDnD.pyは読んでる前提
135デフォルトの名無しさん
垢版 |
2021/10/10(日) 09:09:58.87ID:wTu2fZfo
>>134
おー助かりました
136デフォルトの名無しさん
垢版 |
2021/10/10(日) 09:10:27.91ID:YLnhElYI
>>127
統合開発環境ね
パイチャームかVisualStudioかインテリj
2021/10/10(日) 11:33:12.15ID:ykpYSE0z
私の開発環境はIDLEとGVIMだわ、大したことやってないし
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を引き継いだ
みたいなことでいいのでしょうか・・?
139デフォルトの名無しさん
垢版 |
2021/10/10(日) 13:16:40.64ID:kKlMir+m
>>138
そう
あちこちにあるimport sys他が都度走るのはいやだし

https://docs.python.org/ja/3/reference/import.html
他の動作も可能だけれどフレームワーク実装とか特殊なケースでなければ
モジュール側でうまく対応した方が良い。
2021/10/10(日) 13:24:05.94ID:H4xzBt6k
>>139
なるほど・・
どうもimportするたびに新規発行されるみたいなイメージが強くなってしまって・・
>あちこちにあるimport sys他が都度走る
たしかにそうですよね
ありがとうございました
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の内容によってどう変わるかわかりませんがかなり遅いです
綺麗な書き方だけにどうにかしたい
報告です。質問じゃないです
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いらないんじゃない? いや、私も昔混在しててエラーになった経験があるんだけども
それって文字列化してから自分でスラッシュを足して混在させてたような気がしてきた
今適当にやってみても混在しないし・・さ
2021/10/10(日) 16:01:08.25ID:PpP5FnLO
>>142
4秒になりました、内包表記早い
最近も混在してエラーになりました。詳しく調べてないです
気になるときは.replace("/", "\\")つけてます
2021/10/10(日) 16:15:29.74ID:PpP5FnLO
混在するのいやだから自分でつなぐときos.path.join使ってます
今ソース確認したけど"/"使ってない
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があるからそっちの方がいいかも
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)]
2021/10/10(日) 17:10:38.07ID:ykpYSE0z
>>146
う、美しい、、os.sepもエレガント
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秒

新コードがバグってないかよくテストしなければ
2021/10/10(日) 21:08:00.05ID:PpP5FnLO
最初のデータだと
新コード 14秒
最終形って書いたコード 4秒
件数が多いと新コードが早い
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()ができるのか知りませんが
2021/10/10(日) 22:14:56.87ID:PpP5FnLO
>>150
衝撃の結果 最初のデータ(件数の少ないやつ)
新コード 14秒
最終形って書いたコード 4秒
isdir 167秒
コードを見ると一見早そうに見えるんだけど
2021/10/10(日) 22:25:50.37ID:PpP5FnLO
件数の多いデータ loop回数減らしてます
新コード 2秒
最終形って書いたコード 11秒
isdir 60秒
153デフォルトの名無しさん
垢版 |
2021/10/10(日) 22:53:16.01ID:fsOtTZsl
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

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

クソチョンw
154デフォルトの名無しさん
垢版 |
2021/10/10(日) 23:14:16.55ID:kKlMir+m
is_dir()はos.stat(fstat)つかってそうだし遅いだろうね
事後処理多すぎるしos.walk()のが適当かも
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倍だぁああああ
2021/10/10(日) 23:36:40.30ID:ykpYSE0z
やっぱ>>155は無し
このp_err_files[:-1]やp_err_files[idx:]ってダメな気がする
途中でp_err_filesの要素抜くからバグる気がするんだけど・・
新コードと最終形の結果同じなんだよね?
2021/10/10(日) 23:50:06.43ID:PpP5FnLO
>>155
最初のデータ(件数の少ないやつ)
新コード 14秒
155のやつ 2秒

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


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

>________i = str(i) + os.sep #これは出した方が速いの?変わらない?
圧倒的に速いです
2021/10/10(日) 23:51:21.86ID:PpP5FnLO
>>156
新コードと最終形の結果は同じです
古いコードはバグってました
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()みたいに遅いかも? お疲れっした!
2021/10/11(月) 00:00:41.38ID:Z6IULiPa
>>155

155は結果がおかしいです
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秒台を叩き出すポテンシャルが伺えます
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]

測定結果は後ほど
163デフォルトの名無しさん
垢版 |
2021/10/11(月) 15:03:13.08ID:yoxInkMN
p_err_files_orgを含めてideoneあたりに貼ってくれんかな
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 ギブアップ
2021/10/11(月) 15:38:36.71ID:9gfKW03X
> ID:PpP5FnLO, ID:ykpYSE0z
そろそろやめてもらっていいですか
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)
2021/10/12(火) 00:09:42.22ID:QANgax+i
>>165
ガイジに話が通じると思ってる奴もガイジ
168デフォルトの名無しさん
垢版 |
2021/10/12(火) 13:14:04.41ID:Y4+OaxqJ
uuid含む辞書 のリストの検索って
やっぱ内包表記が一番早いですか?
item = [d for d in db if d[id] == _id][0]
169デフォルトの名無しさん
垢版 |
2021/10/12(火) 14:22:16.90ID:65IdcDyl
>>168
それだと遅延評価されずに全走査してから[0]を解決するから
リストが長いと不利
2021/10/12(火) 17:12:16.40ID:db3N35kL
>>169
こうですか?
item = next(filter(lambda d: d[id] == _id, db))
171デフォルトの名無しさん
垢版 |
2021/10/12(火) 18:55:46.32ID:rbfrUXN4
線形探索に変わりはないから本質的には変わらない
規模と目的にもよるが事前にハッシュテーブルを作成するなりしたらいいんじゃない?
172デフォルトの名無しさん
垢版 |
2021/10/12(火) 19:05:49.73ID:rbfrUXN4
>>170
最初の1つを取得したいなら素直にfor文で回して見つけ次第breakすればいいんじゃない?
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]
174デフォルトの名無しさん
垢版 |
2021/10/12(火) 19:48:08.27ID:Y4+OaxqJ
謎のなりすましw
175デフォルトの名無しさん
垢版 |
2021/10/12(火) 20:14:27.30ID:DOoMLgfj
tkinterとMVCを勉強中なんですが
view用のtkvarってmodel(db)に置くんですか?
view側が持つのですか?
2021/10/12(火) 20:38:17.90ID:db3N35kL
>>174
答えは見つかりましたか?
177デフォルトの名無しさん
垢版 |
2021/10/13(水) 00:27:53.69ID:zS1AsSBo
>>173
内包表記使わないと死ぬ病気なの?
いつ、何故内包表記が速くなるか勉強した方がいい
ネットに落ちているサンプルコードのように繰り返しappendする訳でもないのだから大して変わらん
178デフォルトの名無しさん
垢版 |
2021/10/13(水) 04:42:48.68ID:+txmauo5
>>175

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

model
変数(データ実体)

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

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

ハッシュテーブルって辞書のことですよね?
187デフォルトの名無しさん
垢版 |
2021/10/14(木) 08:52:02.98ID:tO9afOB/
>>178
Viewは簡単に生き死にするから、変数(データ実体) をtkvarにしてModelに持たせる方がいいと思うよ。
形式変換などが必要なときは、Modelにそれ用のアクセサを付ければいい。
ControllerがModelとViewのインスタンスを持ち、ViewはControllerだけを参照する。
Modelは基本的にController、Viewの参照をどっちも持たない。
188デフォルトの名無しさん
垢版 |
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
189デフォルトの名無しさん
垢版 |
2021/10/14(木) 09:42:03.64ID:tO9afOB/
確かに、tkinterのVarはデータバインディング(しかも双方向可能)の考え方そのものなので、
MVCに少しそぐわない(ViewModelっていうんだっけ?)。
どっちにしろ、データベースやネットワークサービスがデータソースになる場合は、Varは単なるバスみたいな使い方になるし。
190デフォルトの名無しさん
垢版 |
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()するやつ
191デフォルトの名無しさん
垢版 |
2021/10/15(金) 16:12:08.85ID:Tty/f66M
PythonでLZ4を使うと、lz4.frame,lz4.block,lz4.streamっていうのがあるみたいなのですが
それぞれ何がどう違うのでしょうか
検索すると英語の情報が多いのですが、アホなので分かりません
2021/10/15(金) 16:25:20.62ID:yvxpjjvp
質問ですが、defaultdictに対して.getを使った場合、値が存在しない場合でもメモリを使ってしまうのですか?
193デフォルトの名無しさん
垢版 |
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
同じことが書かれてる
2021/10/15(金) 19:07:39.63ID:4mSLIm8m
>>193
ありがとうございます。
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"
196デフォルトの名無しさん
垢版 |
2021/10/17(日) 14:11:08.72ID:7C23oe5i
Mike Python
197デフォルトの名無しさん
垢版 |
2021/10/17(日) 17:37:19.17ID:kbVq19bl
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

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

クソチョンw
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になってしまいました
これは何故なのでしょうか
199デフォルトの名無しさん
垢版 |
2021/10/17(日) 20:06:53.96ID:hODn77KL
sorted関係ないしエラーメッセージがまんま理由

>>> -'a'

TypeError: bad operand type for unary -: 'str'
2021/10/17(日) 20:42:04.88ID:t5hHOLNv
>>199
ありがとうございます

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

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

Effective Pythonからの受け売りなので立ち読みとかできるなら読んでみるといい
2021/10/17(日) 23:47:35.33ID:W3iDPsRK
モドリッチ
204デフォルトの名無しさん
垢版 |
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]
が得たいんだけど、どう書いたらいいですか?
なんか超低速か無限ループにはまってしまって…
205デフォルトの名無しさん
垢版 |
2021/10/18(月) 14:01:45.68ID:bl1s8YLW
あ valuesはランダムな整数のランダムな長さの配列(1〜10くらい)です
2021/10/18(月) 14:16:32.64ID:zNA2BH7N
なんで01432になるんだろ
01444じゃないの
2021/10/18(月) 14:17:00.26ID:N0fetjcl
>>204
仕様を自然言語で
もれなく、間違いなく、人に伝わるように書くことに力を注いでくれ
2021/10/18(月) 14:18:36.21ID:zNA2BH7N
つか問題文は自分の言葉で伝え直さないでコピペするべき
209デフォルトの名無しさん
垢版 |
2021/10/18(月) 15:32:14.49ID:r9t2S6+p
コピペばれると退学だから
それと判らないように質問してるんだろう
210デフォルトの名無しさん
垢版 |
2021/10/18(月) 20:16:41.07ID:2nbXAeQ6
言わんとしていることはわかる
ランク付けだろ
rank =[i for i in range(len(values))]
でdrop駆使していけるはずだ
2021/10/18(月) 21:39:27.07ID:jVCGujj+
>>3
機械学習で最適なクロール間隔を学習しろ
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を使うのが定石でしょうか?
2021/10/19(火) 10:27:13.40ID:K7fU3Cbr
そんな回りくどい処理が必要な状況が、
俺には全く想定できない。
2021/10/19(火) 10:41:06.36ID:LLvKMRJR
>>212
動的に引数名を指定しないのが定石
evalはユーザー入力でpythonの式を受け取りたい場合に使う

引数名だけを動的に指定したい理由は?
それ次第だけどeval以外の方法があると思うよ
215デフォルトの名無しさん
垢版 |
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)]
になりうる?
216デフォルトの名無しさん
垢版 |
2021/10/19(火) 11:43:32.81ID:z0N9htUT
>>215
https://docs.python.org/ja/3/howto/sorting.html#sort-stability-and-complex-sorts

python list.sort stable
とかでググる
2021/10/19(火) 11:47:54.98ID:10EXZk67
>>213,214
ありがとうございます
datetimeのtimedeltaを使いたいのですが
timedelta(seconds=3000)
な感じで、secondsの部分がminutesやdaysにしたいときがあるので
条件分岐していたのですが、他の方法があるのかなと思いまして
2021/10/19(火) 11:51:51.94ID:kFYLNe28
そもそもですがタプルってなんですか?
2021/10/19(火) 11:59:21.79ID:10EXZk67
自己解決?したかもです
daysやらminutesやらデフォルト値を0に設定して
timedelta(days=days・・・,seconds=seconds)
みたいに全部ぶっこめばいい気がしてきました
220デフォルトの名無しさん
垢版 |
2021/10/19(火) 12:01:28.19ID:DE2IVg3K
>>216
おー勉強になりました
ありがとう
2021/10/19(火) 12:11:27.56ID:LLvKMRJR
>>219
timedelta()の引数は全部任意でデフォルト値0が設定されてるから自分で指定する必要はないよ
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)
でもいいのかなぁと
2021/10/19(火) 12:25:04.75ID:K7fU3Cbr
a=minutes=3
timedelta(a)でいいんでない?
2021/10/19(火) 12:25:09.04ID:10EXZk67
さらに自己解決?したかもです
timedelta(**{"seconds":3000} )
でイケました
2021/10/19(火) 12:25:47.01ID:10EXZk67
>>223

なんと、それでできたんですね
ありがとうございました!
2021/10/19(火) 12:26:11.41ID:K7fU3Cbr
いや、できんかった。スマンw
2021/10/19(火) 12:26:52.98ID:10EXZk67
と、思いましたが>223だとdaysに入ってしまうようです?
連投すいません
2021/10/19(火) 12:27:10.83ID:K7fU3Cbr
dayとして扱われるわ
2021/10/19(火) 14:30:29.56ID:LLvKMRJR
>>222
それはdictionaryで渡して、アスタリスクx2でunpackingする

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

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

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

先程の書き込みにも書いてあったとおりなんですが、手順は簡単、次の3ステップです。
1身の回りにあるモノの写真をデジカメで撮りまくる
2写真に撮ったモノを徹底的に使い込む
3モノの使用感を自分の感じたままブログに書き殴る
2021/10/21(木) 05:44:05.86ID:2FnoPHWW
3万円なんてお小遣いにもならねえな
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]とかわらないよね?
2021/10/21(木) 08:45:58.03ID:POpI6QwK
>>202
大変遅くなりましてすみません
>>198です
丁寧に説明してくださりありがとうございます
とてもわかり易い

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

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

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

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

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

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

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



高報酬案件を求めるフリーランスエンジニアのための案件マッチングプラットフォーム
「Pro Connect Enginner(プロコネクトエンジニア)」正式版、2021年2月28日リリース!
2021/10/21(木) 16:18:34.28ID:yuVpO81C
"1×2.txt"のように"×"が文字列に入ったファイル名を処理しようとしています。
files = sys.argv[1]
で受け取って
print(files)
すると、×がなくなって
12.txt
に化けています。避ける方法はありませんか?
2021/10/21(木) 16:22:23.38ID:gR5+oZUI
>>241
試してないけど
sys.argvをやめてファイルから読み込むか、JSON使うか。
243デフォルトの名無しさん
垢版 |
2021/10/21(木) 16:26:13.82ID:s+STdMnX
https://docs.python.org/ja/3.10/library/decimal.html
https://pypi.org/project/gmpy/
https://code.google.com/archive/p/python-gmp/
244デフォルトの名無しさん
垢版 |
2021/10/21(木) 16:27:35.45ID:s+STdMnX
filesのbyte列を出力してみろ
2021/10/21(木) 18:35:03.76ID:yuVpO81C
>244
やってみました。
print(files.encode())
b'12.txt'
どこで消えてるんだろう…全角の×なので、普通に通ると思っていたのですが…
2021/10/21(木) 18:41:59.80ID:iSzsEmw9
>>241
再現しないね
環境(OS/シェル/Python)と呼び出す側のコードも書いて
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さん、なにかわかりますでしょうか? お願いします。
2021/10/21(木) 19:04:23.86ID:YezGVy7K
>>240
サンキュー!こんなとこで宣伝するなんてろくでもないとこだろうからローカルプロキシにNGブチこんどくわ!
2021/10/21(木) 19:10:04.13ID:wgFCmdkg
エラー吐かずにスルーする目的でtryを使うのは
行儀としてどうですか?
やめたほうがいいのでしょうか

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

みたいな感じです
2021/10/21(木) 19:54:31.39ID:yqrc4/Lg
>>247
ターミナルの引数の時点で×が消えてるからvscode側の問題かな
251デフォルトの名無しさん
垢版 |
2021/10/21(木) 20:02:45.41ID:T2C3Q12E
>>249
ぜんぜんいいけど
Exceptionじゃなくて想定している例外にしないと
想定外の問題が発生してもすり抜けるのでダメ

実際に例外だしてそれを指定してあげる
たとえば配列の範囲外ならIndexErrorなど
2021/10/21(木) 20:07:36.86ID:yuVpO81C
>250
切り分けありがとうございます。
vscodeのスレで聞いてみます。
2021/10/21(木) 21:35:10.28ID:iSzsEmw9
>>247
シェルのエンコーディングとフォント、ファイル名のエンコーディングを確認するといいんでないかな

UTF-8のファイルで文字列を受け取って、UTF-8のファイルに出力してみて
出力の中身をエディタで確認して問題ないか確認して切り分けしてみれば?
2021/10/21(木) 22:23:10.34ID:yuVpO81C
>253
1×2 とUTF-8で書いたtxtを openしてreadしたところ、×が表示されました。
シェルはUTF-8、jsonもUTF-8です。やはりvscodeがなにか悪さしてるのでしょうか?
255デフォルトの名無しさん
垢版 |
2021/10/21(木) 22:28:15.67ID:EiXMJcNZ
>>249
スルーしていいエラーならいいよ
256デフォルトの名無しさん
垢版 |
2021/10/22(金) 12:09:19.87ID:KhubwY06
>>241
そのファイルがある場所でlsしてみて
そして、その結果をそのままここに貼って
2021/10/22(金) 13:08:40.17ID:pSuh16SX
>256
-a--- 2021/10/21 22:08 8 1×2.txt
表示されます!
なんかvscodeのバグなのか仕様なのかのせいなんですかね…
2021/10/22(金) 13:09:12.13ID:pSuh16SX
vscodeでのデバッグのときだけみたいなんで、半分諦めです。
2021/10/22(金) 14:11:33.51ID:X7QNDBcm
PySimpleGUIをつかってスクレイピング用のスクリプトをGUIにしてpyinstallerでexe化(コンソール無し設定)しました。exeで起動するとなにかしらのアクションですぐにコードが強制終了します。調べたところ、スクレイピングに使っているクロームドライバーの自動更新ライブラリがサブプロセスを開始しようとするときにコンソールを封じられているために落ちるってことらしいのですが回避方法がわからないです。知っている方がいたら教えてください。
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やコマンドプロンプトに変更でも回避可能
2021/10/22(金) 16:28:01.92ID:pSuh16SX
>>260
すごい!!ありがとうございます!
無事、全角×が表示されました!!
これでdebug作業が進みます!
ありがとうございました!!
262デフォルトの名無しさん
垢版 |
2021/10/22(金) 16:46:07.04ID:DsjZYzXm
>>259
AllocConsole
2021/10/22(金) 17:23:28.01ID:X7QNDBcm
>>262
ごめん。調べたけどそれだけじゃわからんかった。OSにGUI用のコンソールを用意してもらうってことなんかな。だとしても実装方法が皆目見当つかん。
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になっとるやんけ
辞書のままソートする方法を普通書かないか?
2021/10/22(金) 20:08:47.66ID:5ieIGpLh
これ、元の辞書を並べ替える場合って

dic1.clear

dic2(実はリスト)を
dic1.update(dic2)
ってやるしかないの?
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での並び替えが出来るっぽいんだけど、これ以外に方法ある?
2021/10/22(金) 20:57:16.61ID:szev1NjN
どうしてdictionaryをsortしたいの?
268デフォルトの名無しさん
垢版 |
2021/10/22(金) 21:15:58.94ID:QiF9wMqh
dictがOrderedDict相当になったとき
順序に依存するコードが増えたら嫌だなとおもったけど
処理コスト変わらんのに便利さを選ばないのも偏狭なんだろうな

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

dic1 = {5: 'apple',3: 'pen'}
みたいなやつ
>>268
ありがとう
2021/10/22(金) 22:05:03.21ID:szev1NjN
お、おう。
2021/10/22(金) 22:32:57.50ID:0c+YzSoZ
アンチパターンってやつやな
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の部分
273デフォルトの名無しさん
垢版 |
2021/10/23(土) 01:41:10.93ID:L2XVMbSO
pilで複数の画像を1枚の背景に貼り付けたい
入力される画像の位置がランダムbbox(x1,y1,x2,y2)なんだけど
すべての座標を含む最小範囲の背景(0,0,x2,y2)ってどうやって計算したらいいのですか?
274デフォルトの名無しさん
垢版 |
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なので

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')

だったんだよ
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のキーが最後尾に追加されてなんかモヤったからキーを順序どおりの並びにするにはどうすんのかな、って思ったわけ
2021/10/23(土) 07:39:54.83ID:uHOK1QLC
1. str1 の長さ n がキーとして登録されていない場合は、追加
2. str1 の長さ n がキーとして登録されている場合は、更新

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

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

だから、順序よく並べたいなら、ソートする
2021/10/23(土) 11:44:43.09ID:Y/CMfyXG
https://lite.blogos.com/article/565782/
2021/10/23(土) 11:51:35.15ID:qhVW7VS5
>>275
お、おう、すまんかった
表示する時にきれいに並べたいだけならpretty printで

from pprint import pprint
pprint(dic)

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

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

「keyerrorがでるけどどこがだめなのかわからない」 https://teratail.com/questions/365802?sip=n0070000_019&;uid=199109 #teratail #python
2021/10/23(土) 12:32:34.22ID:n7GT2TeK
>>280
なるほど

いちいち関数の中で並び替えしてたら時間かかるとか実際に使う場面では必要ないとかそういう事なのかな
pprint()で出力すれば良いってのは参考になった
ありがとう
2021/10/23(土) 12:41:34.85ID:qhVW7VS5
>>281
KeyError: 'びわこ'
2021/10/23(土) 12:51:17.61ID:+0P0mc8U
>>281
dict_stadiumに'琵琶湖'はあっても'びわこ'はない
2021/10/23(土) 13:19:57.09ID:DsNdyrVS
テラタよりこっちのが回答早いのか
2021/10/23(土) 17:01:23.55ID:TEk5cWky
re.complie(パターン)
complie済みのパターンが複数ある場合
パターン同士を結合するのってどうやるのでしょうか?
2021/10/23(土) 18:18:18.96ID:skaucHgA
Djangoを始めました
view.pyの中にある変数の中身を確認したいですが方法が分かりません
デバッグ方法はちゃんと分かってませんが一応環境は作りました
見たいのはDjangoチュートリアルにもあるlatest_question_list = Question.objects.order_by('-pub_date')[:5]
の中身です

エディターはvscodeです
2021/10/23(土) 18:45:21.20ID:skaucHgA
>>287
すみませんこれ出来ました
ブレークポイントを次の行に作って見たい変数にカーソルホバーさせたら見れました
2021/10/23(土) 21:09:29.62ID:qhVW7VS5
>>286
.patternでパターン文字列に一度戻ってから
パターン同士を結合して再度コンパイル
直接結合するAPIは用意されてないと思う
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)/
291デフォルトの名無しさん
垢版 |
2021/10/23(土) 23:19:51.40ID:oBaQvszz
ルビキチってどこにでも涌くのな
2021/10/24(日) 09:17:16.16ID:ju8sH4Lg
この板の外にも湧いてるんだぞ
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$"
と同等?になってしまうので
2021/10/24(日) 13:06:47.73ID:nICPJrT1
改めてぐぐってみると
そもそもフラグの記述はいろいろあるみたいですね >>293
(?フラグ:パターン)
これなら基本は文字列でもcompile済でもどちらでもいい気がしました

ptns = ["\.gif$","(?i:\.jpg$|\.png$)"]
ptn = re.compile("|".join(ptns))
2021/10/24(日) 14:04:30.70ID:9GD27ADQ
>>293
> ptn2が
> "\.jpg$|\.JPG$|\.png$|\.PNG$"
> な感じだったらよかったんですけどね
それだと .Jpg とかがヒットしなくなる
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
2021/10/24(日) 16:09:48.63ID:nICPJrT1
>>295
たしかに
>>293は、大文字小文字区別つかないすべてのパターンの意味でした
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できない感じですか?
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とは別の何か引数を引き継ぎたくなったという場合
どう拡張していけばいいのかな、と思いました
2021/10/25(月) 18:13:43.66ID:YeRcjGgP
*argsとか**kwargsで可変長の引数を取るようにすればいい、とかそういう話か?
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]
使ってみたりの条件分岐です
2021/10/25(月) 20:51:56.35ID:LSRIz4jp
リスト内包表記で得られたリスト
[’金額¥150’,’金額¥222’,’’,’’,’金額¥0’,’金額¥465’]のうち、’’を’金額¥0’に置換するにはどのようにしたらいいですか?

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


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

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

クソチョンw

在日朝鮮人は強姦と窃盗してる犯罪者!
在日朝鮮人は皆殺しにすべし!
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では多いと思う
2021/10/26(火) 18:26:21.05ID:58PW1UcQ
javascriptに限った話じゃないんだけど、
Max Retry、っていったら純粋に"リトライ"の回数でカウントする?それとも総実行回数を指す?
MaxRetry=5なら
初回の1回含めて最大6回やるのか、5回なのか。
なんか気になって。
2021/10/26(火) 18:34:57.12ID:qzAOjqD0
そんな名前絶対につけないけど、その名前なら6回でしょ
2021/10/26(火) 19:14:57.68ID:BNqSw8pO
最初の試行は"Re"tryじゃないから6回だわな
2021/10/27(水) 13:56:39.52ID:0D9sPP+O
???????????????????
?????????????????????????????
310デフォルトの名無しさん
垢版 |
2021/10/27(水) 16:50:18.70ID:rwCBpLuv
pyodbcの接続時にスキーマまで指定する方法ありませんか
接続文字列に入れてもエラーになってしまいます
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)は変数名より短いじゃん?」とも思うし

練習問題やってるうちはぶっちゃけ何でも良いと思うんだが
後々を考えるとどうしたらいいんだろうな、と
312デフォルトの名無しさん
垢版 |
2021/10/27(水) 18:15:13.83ID:sQbCpqyG
>>310
DSN側で設定しておくんじゃない?

https://github.com/mkleehammer/pyodbc/wiki/Connecting-to-databases
ここのDB別の文書読んでみて
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でエラー引っかかっていて
気づくのに時間かかりました・・
2021/10/28(木) 04:45:57.20ID:Nbft1WLw
PythonやDjangoでオススメの本ありますか?
2021/10/28(木) 06:56:16.71ID:dSweiYMb
特殊メソッドは使わんほうが無難
ていうかPythonはクラス自体使わない方がいい
昔ながらの構造化言語としてシンプルに使うのがベスト
2021/10/28(木) 07:27:59.28ID:p07hGs8T
データを構造化するためにclassを使うだろ
2021/10/28(木) 07:52:44.16ID:xUl7Twuj
今どきクラス使うなとか言うアホは放置で
2021/10/28(木) 08:10:34.09ID:X05RtFia
関数間で状態を保持するときにのみクラスは有効
319デフォルトの名無しさん
垢版 |
2021/10/28(木) 10:18:44.69ID:MKFZM1zj
>>312
結果的にはファイルdnsで出来ますた
2021/10/28(木) 12:42:04.06ID:RV1LSDaq
PythonでマイクロソフトAccessをDBとして使う実例は多いけど、単にAccessをマクロ起動かける例が無いんです
誰か成功した人は居ますか?
321デフォルトの名無しさん
垢版 |
2021/10/28(木) 12:56:15.77ID:XVuwIiyB
Access側のマクロのエントリポイント用の関数を造っておく
pywin32でその関数を呼ぶ
2021/10/28(木) 13:09:38.96ID:XVuwIiyB
https://stackoverflow.com/questions/32653792/python-code-for-running-ms-access-module-subroutine
2021/10/28(木) 13:19:37.36ID:RV1LSDaq
>>321,322
ありがとうございました。
これで実行してみます。
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型に変換できたらいいのに
と思うのですが・・
2021/10/28(木) 14:17:08.33ID:Fr3tDLQH
>>324
ほれ
https://qiita.com/shibainurou/items/0b0f8b0233c45fc163cd
2021/10/28(木) 14:17:55.41ID:JRDKMzLv
datetime.fromisoformat
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

できました!!!
2021/10/28(木) 17:41:33.23ID:Nbft1WLw
>>314
これなんですけどvenvを推奨していてdjangoのことも書かれているpythonの本です
名前を忘れました
誰か分かりませんか?
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]]

こうなるのって結構罠じゃね?
2021/10/28(木) 17:54:29.27ID:Mv6YjZts
listのコピーはcopyでやれ定期やね
2021/10/28(木) 17:54:51.49ID:Nbft1WLw
>>329
この話題無限に出るな
それだけ分かりにくい所だし何度でもすればいいと思うけど
2021/10/28(木) 20:34:34.97ID:o6HAoERy
https://gist.github.com/srndpty/43c76d74188884f25716f25a44ef0818
だれか、これpythonに翻訳して。
333デフォルトの名無しさん
垢版 |
2021/10/28(木) 21:08:20.17ID:WnlLUDNQ
os.walkで一発だろ。
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となってます
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] ]
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では黒田努の本の方が、本格的
2021/10/29(金) 02:18:31.85ID:FnWw468S
>>334
これプロジェクト作り直したら解決しました
原因不明です
2021/10/29(金) 04:57:41.89ID:oTw6PnKg
vscodeのpylanceのauto importが機能してないんだけど皆は使えてるの?
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)
2021/10/29(金) 12:21:35.03ID:koELjqeu
Selenium内のコンソールログを確認
2021/10/29(金) 12:24:28.38ID:eVsBtFEb
コンソールログってどうやって確認するの?
2021/10/29(金) 12:32:43.97ID:9CukeuuL
>333
os.walk 勉強中。
すっごい便利機能だけど高機能すぎて、forループでサブフォルダーを回していくつもりだったから困惑。
どうすればいいんだ!
343デフォルトの名無しさん
垢版 |
2021/10/29(金) 17:17:25.29ID:d8BIZQAf
classの__init__()するclassmethodが使いたいんだけどできますか?

c = Class()
c.method()

を一行で書きたいだけです
Class.method()
344デフォルトの名無しさん
垢版 |
2021/10/29(金) 17:24:18.67ID:R4ZBjJpK
普通にやれば?
https://wandbox.org/permlink/Eus88wKZ8uf3Hihn
2021/10/29(金) 18:16:59.51ID:zHkN81gu
pythonの資格って難しいですか?
346デフォルトの名無しさん
垢版 |
2021/10/29(金) 20:26:40.87ID:/8Rm9/az
>>343
method()がselfをreturnすれば
c=Class().method()
とできる
2021/10/29(金) 20:36:40.03ID:1Pi4hxs1
>>343
import this
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クラスに特別な実装が行われたんですか?
2021/10/29(金) 23:15:06.20ID:krcALBmR
>>348
特別な実装はされてない
django/core/handlers/exception.pyで例外捕まえたときにインスタンス見て処理振り分けてるだけ
2021/10/29(金) 23:43:42.33ID:ZYpuK0cb
>>349
おお!
どうもです
後で見てみます
そのexeption.pyでviewなどでraiseされた例外を捕まえてフロントに適切なHttpResponseオブジェクトを送ってるんですかね?あとでそのモジュール見てみます
351デフォルトの名無しさん
垢版 |
2021/10/30(土) 01:26:36.60ID:fDTZDMBU
>>342
馬鹿には無理
352デフォルトの名無しさん
垢版 |
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()
2021/10/30(土) 11:36:54.55ID:a9WSKAoR
class Klass:
@classmethod
def method(c):
return Klass()

これじゃいかんの
2021/10/30(土) 12:49:58.82ID:xUY0JK8T
他クラスのインスタンスを生成するならともかく
自クラスなら__init__で対応したほうがいい
2021/10/30(土) 17:28:58.03ID:6LdaSTDR
>351
ありがとう。walkの使い方わかってきたよ。
フォルダの深さが1段ならできた。2段だと想定外の動きになるのでまだ検討が必要。
多層になるとforで回して掘っていった方が良いのかな?
2021/10/31(日) 02:00:51.68ID:hGI7wBpw
Ruby には、walk 無いから、glob でやってる

VB のコードでは、しょっちゅう再帰で、子の階層へ降りていく。
これが典型的な馬鹿の見本w
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
ってエラーがでました
条件分岐に入れることでそもそもエラーがでる
という今まで経験したことないエラーが出ました
こういう場合、どうやって条件分岐すればいいのでしょうか
2021/10/31(日) 04:35:13.37ID:oq4cmHqY
a is None
2021/10/31(日) 06:55:40.09ID:wNGz0WbD
関数Aからしか呼ばれないとわかっている関数Bがある場合、
BをAの内側に定義してしまうスタイルってありですかね
こうすれば見た目にも局所的であるとわかるし、
Aの外からBを呼ぶことはできないから安全と思うのですが

※関数内関数はクロージャっていう機能でも使うらしいんですが、
そっちはよくわからんので置いておくとして…
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
2021/10/31(日) 13:07:50.21ID:F/sAbtyW
>>356
だよな。VBやってるやつはrubyの次に馬鹿だわ
2021/10/31(日) 13:21:43.76ID:e6cnICXj
>>345
エンジニア基礎試験とデータ分析試験の話なら、油断していると落ちる程度に考えておけばいいよ。
python使いこなしているなら普段使わないような標準モジュールの問題を暗記すればいける
363デフォルトの名無しさん
垢版 |
2021/10/31(日) 14:21:08.43ID:a/o9PbUa
PILのimageオブジェクトを複数扱うとき
その画像固有の色々なデータをどこかに保管しといて使い回すんだけど
sizeとかのプロパティと同じじゃんと思ってimageオブジェクトごとにインスタンス変数としてぶちこんでたんです
im1.x_rate = yyy
みたいな。

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

プロパティのねじ込みは他の言語にもある。Javascriptはねじ込みと呼び出しがもっと自由度高い。
365デフォルトの名無しさん
垢版 |
2021/10/31(日) 15:21:43.12ID:Q9Xu5pvX
>>364
勉強になります
366デフォルトの名無しさん
垢版 |
2021/10/31(日) 17:14:53.49ID:Yc4PEJna
動的言語のいいところでもあり悪いところでもある。
当然こういうのを徹底的に嫌う人はいる。
367デフォルトの名無しさん
垢版 |
2021/10/31(日) 17:19:32.57ID:Q9Xu5pvX
まあ入れたかどうか分かりづらい
自分で全部把握してないとしんどいですね
あとpylanceがすげえ怒ってる
2021/10/31(日) 17:24:06.26ID:WrAvX4Kw
彼女によく言われます
> 入れたかどうか分かりづらい
2021/10/31(日) 17:34:27.39ID:sRnAlDBM
つづり間違いを許容する言語なら避けられない
370デフォルトの名無しさん
垢版 |
2021/10/31(日) 18:11:50.92ID:4KbMhR6u
バグの温床
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")
みたいにすれば「ここで条件分岐していますよ」というのがパット見で
どう分岐しているのかがわかります
しかし関数実行で一行で完結してるだけだと何してるかわからないし
関数名に「エラーかどうかチェックし、エラーがあるならエラーを吐く」的な名前を付けるにも
どういうのが適切なのかわかりません
372デフォルトの名無しさん
垢版 |
2021/11/01(月) 12:51:54.43ID:MaHd86e9
isはboolを返すようにする

if is_foo()
else

try:
check_foo()
except

あるいは

try_foo()
if try_foo()
else

が自然
2021/11/01(月) 12:53:04.27ID:1SV0gAru
>>371
何をしたいのかよくわからないけど
設計アドバイス有りのほうの命名スレで聞いてみれば?
374デフォルトの名無しさん
垢版 |
2021/11/01(月) 14:26:50.37ID:z/x9VzKb
文法以前に本人の頭が混乱してるな
病院池
2021/11/01(月) 16:23:27.64ID:SSiHi0ki
まずはPythonスレでインデントをアンダーバーで代替するのやめて全角空白「 」にしたらどうかな?
2021/11/01(月) 16:25:48.35ID:4nNYTPSv
>>375
それ
2021/11/01(月) 16:26:48.66ID:4nNYTPSv
と思ったら全角スペースかい
なんでやねん
2021/11/01(月) 16:50:34.49ID:SSiHi0ki
>>377
連続する半角スペースはスレ投稿時に1つに短縮されてしまうでしょ。
他にいい方法があれば教えてもらいたいくらい。挑発とかじゃなくて真面目に。
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()
2021/11/01(月) 17:11:37.02ID:+PGSxGGW
>>378
chmateだと大丈夫っぽい
2021/11/01(月) 17:17:16.17
テスト
連続全角スペース 2個
「  」
連続半角スペース 2個
「 」
連続アンダーバー 2個
「__」
2021/11/01(月) 17:19:02.31
続いてテスト
先頭空白の、

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

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


   あと>>379はパソコンで表示できねーのでやめとけ
2021/11/01(月) 17:46:32.90ID:bBJfHO04
コーディングでアンダーバーってあんま聞かない
2021/11/01(月) 17:48:52.19
ちなみに過去スレみても全角スペースインデント派が極端に少ないように思えるけどなぜ
2021/11/01(月) 17:50:38.30ID:SSiHi0ki
Pythonはインデントそのものに文法的な意味があるから、他言語スレのような雑なコピペ、やりにくい
2021/11/01(月) 17:51:32.34
専ブラによってはAA補正機能ONだと全角スペースはズレるから、とかかな
2021/11/01(月) 17:51:53.67ID:rjS1S2Zt
>>1も読めないのか
2021/11/01(月) 17:54:59.57ID:QIRv2mIK
意味があるからこそアンダーバーで表現してるんでしょ
5ch内では_が確実
コピペするなら^_*くらい置換しろよ
2021/11/01(月) 17:57:14.59ID:SSiHi0ki
>>390
__init__ とか __main__ みたいにアンダーバーで始まる予約キーワードがあるから厳しいかも
2021/11/01(月) 18:06:02.27
>>1
if エラーを解決したい場合:
 print('表示されたエラーの全文')
 print('実行環境')
else:
 if インデントが崩れてチヌ:
  コードうp用サイトに貼ってこいください()
 else:
  ご自由に()

#エラー解決が目的でなく、ただの質問なら自由でおk
2021/11/01(月) 18:21:31.02ID:lFi5lRVR
アンダバダバ
2021/11/01(月) 18:32:01.31ID:SSiHi0ki
お前の力はそんなものか
2021/11/01(月) 18:37:52.01ID:4nNYTPSv
さっさと掲示板の設定変えろよタコ管理人
2021/11/01(月) 18:38:19.50ID:4nNYTPSv
アンダーバーの代わりに全部🐙にするか
397デフォルトの名無しさん
垢版 |
2021/11/01(月) 20:11:25.62ID:nDDBE8sn
馬鹿に優しすぎるスレも考え物
2021/11/01(月) 20:47:47.51ID:b8DEaY2C
くだらない質問スレの略なんだから
くだらない人間も許容範囲だろう
2021/11/01(月) 20:56:53.14ID:+3mYHrQj
全角スペースでいい
行頭からの全角スペース連続なら簡単に置換できる
2021/11/01(月) 21:03:19.83ID:+3mYHrQj
&#32; でテスト
space(0)
space(1)
space(2)
space(3)
space(4)
2021/11/01(月) 21:05:46.67ID:+3mYHrQj
これ使えるじゃん
2021/11/01(月) 21:32:35.81ID:sInySGRJ
  少なくともwebブラウザでは使えてないですよ
2021/11/01(月) 21:39:19.38ID:SSiHi0ki
今一歩じゃったのう
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)
2021/11/01(月) 21:44:11.57ID:+3mYHrQj
はは、全滅w
2021/11/01(月) 21:46:15.35ID:SSiHi0ki
情けなや
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)
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)
409デフォルトの名無しさん
垢版 |
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)
2021/11/01(月) 22:11:42.44ID:SSiHi0ki
諸行無常よのう
2021/11/01(月) 22:23:30.61ID:b8DEaY2C
ババア100円くれてやるから大人しくゲームやってろ
2021/11/01(月) 22:38:15.86ID:SSiHi0ki
ありがたや
2021/11/01(月) 22:56:34.54ID:sInySGRJ
結局のところ専ブラによって半角スペースの扱いと同等とみなす文字違うから
トリッキーな事するくらいなら>>1のサイト使った方がいいかと
2021/11/02(火) 00:04:30.18ID:cL54tPf/
別サイトに散らすと、そちらのほうが消えれば集合知としての掲示板の意味がなくなる
415デフォルトの名無しさん
垢版 |
2021/11/02(火) 00:09:02.19ID:lNPw5frO
pythonどころか5ch初心者ですが質問いいですか?
anacondaでのライブラリのロードが出来ない事での質問です
416デフォルトの名無しさん
垢版 |
2021/11/02(火) 09:39:34.41ID:px0qcy1y
anaconda より pip
417デフォルトの名無しさん
垢版 |
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

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

PEP582が実現すればいずれPDMも選択肢に入るかもしれない
いずれにせよ現時点ではpoetry以外を使う理由はない
2021/11/02(火) 20:21:58.23ID:wdD0/4p6
俺はvenv一択だわ
2021/11/02(火) 20:59:02.62ID:28sKmwTr
標準使うのが一番、便利な流行り機能はどうせ標準に取り込まれるんだから
あちゃこちゃ手出すよりvenv一択!
2021/11/02(火) 21:20:27.32ID:cQGNBQWf
cpython + pipで困ったことねぇぞ
2021/11/02(火) 21:27:18.90ID:U4IKz2Wy
そういやエレキバンとかいう湿布薬あったよな
2021/11/02(火) 21:47:58.98ID:fH8EJWuw
>>428
p!p
2021/11/02(火) 22:59:40.27ID:AuiSCc2n
湿布じゃねぇ、磁石だよ
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
2021/11/02(火) 23:20:25.55ID:v7s6xs3o
この業界で日本人が作った、ってデバフでしかないが
433431
垢版 |
2021/11/03(水) 00:00:30.86ID:XfZZ+0lv
でも、有名な多言語のバージョンマネージャーは、asdf/anyenv しかないでしょ?
434431
垢版 |
2021/11/03(水) 00:09:48.64ID:XfZZ+0lv
特に、node.js では、ndenv がnodenv へ乗り換えるように言ってて、
他には、nvm, n を使う人もいる

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

仮想環境なんか使う必要ない
コンテナイメージ変える方がシンプルで取り回しがいい
441デフォルトの名無しさん
垢版 |
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)
2021/11/03(水) 10:11:10.96ID:ixyj7YWU
>>438
俺自身初心者だからな
Pythonという大海に翻弄される永遠の漂流者
443431
垢版 |
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

多言語をやる人は、操作が統一されているから良い
2021/11/03(水) 12:02:48.24ID:6fv+OhcH
https://stackoverflow.com/questions/53039551/selenium-webdriver-modifying-navigator-webdriver-flag-to-prevent-selenium-detec
2021/11/03(水) 12:29:05.33ID:sUOJ6x6J
>>443
お前のアップグレードはできないの?
元が欠陥品だと難しいのかな?
446デフォルトの名無しさん
垢版 |
2021/11/03(水) 13:02:51.65ID:RAebC74D
>>444
ありがとうございます
Google翻訳して読んで実装してみます!!!!
447デフォルトの名無しさん
垢版 |
2021/11/03(水) 13:58:05.52ID:RAebC74D
>>444
navigator.webdriverをFalseにできました!!
設定できてからしばらくはクローリングできてたんですけど、すぐにまたbot認定されてしまいました。
ほかに何をすればbot認定回避できるんだろう?
昨日まではnavigator.webdriverをFalseにしてなくても問題なくクローリングできてたのに。。。
2021/11/03(水) 14:02:36.28ID:YDDGMZzD
webdriverをFalseにしても駄目ならそのサイトがどういうbot対策してるか次第だろう
一般的な回答はない
2021/11/03(水) 14:09:18.92ID:t3xorxmT
https://stackoverflow.com/questions/56528631/is-there-a-version-of-selenium-webdriver-that-is-not-detectable
450デフォルトの名無しさん
垢版 |
2021/11/03(水) 15:29:02.45ID:RAebC74D
>>448
ログインせずにamazonをスクレイピングしてたんだ。
新品出品者一覧ページだけが今日からどうしても取れなくなった。
navigator.webdriverをFalseにしてもだめ。
useragentのクロームのバージョンをいじると少しの間はスクレイピングできるんだが、少しするとロボット対策ページがでるようになる
2021/11/03(水) 16:15:33.24ID:aF9H0I8F
Amazonみたいな大企業がマジメに対策してるんだから諦めて別の手段を考えろ
2021/11/03(水) 16:51:02.51ID:ge6GYHfK
>>442
venv一択
2021/11/03(水) 17:08:14.27ID:seSNXpAW
標準モジュールだしな
2021/11/03(水) 19:46:52.23ID:RAebC74D
>>449のundetected_chromedriverも試してみたけどだめそうだ
今日から急にできなくなったから他の人にも影響でて誰か解決策を見つけてくれることを祈ろう
455デフォルトの名無しさん
垢版 |
2021/11/03(水) 21:06:34.94ID:Q82Zq3XZ
ツイッターで見かけたんだけど
tkinterのentryで
選択範囲に何かすると検証可否に関わらず選択範囲と中身が消える挙動って
こんだけしないと回避できないの?

https://i.imgur.com/ldiCdw0.jpg
2021/11/03(水) 21:37:10.82ID:seSNXpAW
目的がAmazonの商品情報ならAPIつかえばいいのに
習作ならAmazonに固執する必要ないし
457デフォルトの名無しさん
垢版 |
2021/11/03(水) 22:14:34.64ID:nn1iuVsd
APIは無料じゃないので。
2021/11/04(木) 00:07:35.54ID:EUukbb+u
そりゃそうだ
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.と出て出来ません

どうすればいいですか?
2021/11/04(木) 03:18:07.61ID:vgkZPDuF
いやvnevの中だから--user要らないのか
解決しました
2021/11/04(木) 08:04:19.17ID:KwnMOXlw
>>427
pytorch とYolo5で学習データ
Onyx出力しようとしてから言ってみろ(T_T)v
462デフォルトの名無しさん
垢版 |
2021/11/04(木) 11:06:53.47ID:JyTL4wpj
>>450
UserAgentをランダムに変化させ続けるとか
cookieを毎回(必要最小限)リセットするとか

自分でスクリプト描いてるなら自由に戦えばよろし
463デフォルトの名無しさん
垢版 |
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
;

下記で実行してもうまくいきませんでした。
464デフォルトの名無しさん
垢版 |
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},
])
465デフォルトの名無しさん
垢版 |
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()
2021/11/05(金) 08:12:10.06ID:w3w9SeME
>>463
> 下記で実行してもうまくいきませんでした。
・実行したらどうなって
・どうなって欲しい
のかを書けよ…
2021/11/05(金) 08:26:19.63ID:UU4b+5ML
>>466
register_device = 1の場合だと、
device_name = 'PC'に置換される予定です。
468デフォルトの名無しさん
垢版 |
2021/11/05(金) 10:52:47.15ID:CgcDsDN+
会話が不自由なのは頭が不自由なのに起因
2021/11/05(金) 11:16:58.00ID:WAcm7u05
>>465
CASE式を書いてるSQLはSELECT文だからDBに保存されない
保存したければUPDATE文にして
2021/11/05(金) 12:45:07.02ID:bB3TtMEF
>>463
まず、DBってデータを永続化させるためのものだから
コメントにあるような「何回実行してもおなじになるように」(←べき等性、という)
のくだりの処理は一般的ではない

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

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

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

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

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

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

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

おすすめの本あれば教えてくだしあ
2021/11/05(金) 18:37:13.50ID:HmBcWh4U
>>477
グラス片手にデータベース設計
2021/11/05(金) 20:31:14.39ID:d5XheO1i
この分野は進歩が早いので
すぐに本が陳腐になる
公式サイトが読めるようになることが必要
2021/11/05(金) 22:12:47.65ID:u2OkzB/r
バックエンドのwebプログラマーになるのにhtml/cssの知識は必要ですか?
bootstrapなど面倒くさいです
それを覚える暇があればdbとかフレームワークとか覚えたいんですが駄目ですか?
2021/11/05(金) 22:20:35.18ID:m7NNpy+h
>>480
・フロントエンド
・AWSまたはGCP
・特定のDBMSに関する深い知識
最低どれか一つは欲しいかな
バックエンドは多かれ少なかれオールラウンダーとして動くことが期待されるんで、裏側のコーディングだけできますというのは厳しい
2021/11/05(金) 22:39:14.92ID:6Sctu/0G
>>481
なるほど
dbやawsの求められる知識って例えばどれぐらい?
2021/11/05(金) 23:35:32.62ID:s+xNbh4M
現場が分業体制でアサインされた分野以外まったく学ぶ気もないなら
都度専門家に聞けば仕事はなりたつだろうし、
そんなの嫌ならDBはRDBMSの説明書あれば困らないくらい
AWSはSAPの試験内容が理解できるくらい?
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 はミックの本。
最難関は、国家資格・データベーススペシャリスト
485484
垢版 |
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 を使っているような)モダンな企業で、新規案件をやるべき
2021/11/06(土) 00:43:22.10ID:HcnEcsru
>>478
glassなのかgrassなのかでちょっと変わってくるなw
487デフォルトの名無しさん
垢版 |
2021/11/06(土) 02:27:25.73ID:2JPnQnVe
5chってWEB屋さん多いよね
2021/11/06(土) 11:10:52.20ID:Y8IidGqg
webプログラミングは日本のIT系の技術業務の大半を占めるからな
後はゲームプログラミング

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

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

_ = [i for i in hoge if i in [x for x in fuga]]
2021/11/07(日) 00:04:10.88ID:1jV5IOeL
めっちゃ時間かかるやつ
2021/11/07(日) 00:12:43.59ID:1gRJ5IYK
range(10000000)とかやって試そう
2021/11/07(日) 00:28:09.38ID:Gc9uqLet
printや副作用ある操作したらわかるやろ
2021/11/07(日) 00:31:20.69ID:FiWKnTjM
>>490
そこまで書いたなら自分で試せると思うんだが
記憶されずに毎回内側の内包表記のリストを生成する
2021/11/07(日) 11:12:17.72ID:8634ItVT
xlwingsの良い参考になるサイトや使用例を知りたいです
何かありませんか?
2021/11/07(日) 13:56:48.14ID:KSL7hl+d
ありません
2021/11/07(日) 15:07:34.53ID:dPEzTB6K
c#とJavaしかやったことないけど初めてPython始める時に気をつけるべきことある?
セミコロンないってのと()がインデントになるってことくらいしか知らない
2021/11/07(日) 15:24:39.37ID:7u/wN+Bg
>>497
C#とJavaができるならぶっちゃけ楽勝だけど、それらに比べるとPythonはビチグソ遅いという点には注意が必要かな
まとまった量のデータを扱うときにはなるべくpandasやnumpyのような強力なライブラリを使用し、
処理の粒度を大きくしてPythonにできるだけ処理を戻さないことが重要になる
2021/11/07(日) 15:35:30.62ID:eUZdhF5f
変数のスコープくらいかな
2021/11/07(日) 16:15:42.23ID:f4OJt/oF
>>497
値渡しと参照渡しの違いとそれぞれのタイミング
2021/11/07(日) 16:36:23.47ID:sYF1hNAJ
Cは関数だけでなく if や for の中にもスコープがあるらしいね
Pythonは関数・クラス・クラス内関数にしかないから
腰を抜かすほど驚いた
2021/11/07(日) 17:05:25.39ID:zFG7xLKK
>>501
if や for にはスコープないよ
{ } で囲まれたブロックにスコープがあるだけ
2021/11/07(日) 17:47:04.33ID:f4OJt/oF
ひたすら中かっこ連打して同じ名前の変数を別の意味で使い続けることができちまうんだ
画期的だろ?w
504デフォルトの名無しさん
垢版 |
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]])
の結果が単位行列にならないのは何故?
2021/11/07(日) 19:47:09.06ID:ongGZWlK
>>504
正則じゃないから
506デフォルトの名無しさん
垢版 |
2021/11/07(日) 19:54:49.18ID:EGKzblaZ
解決しましたω
ありがとうωω
こんな例もあるんですねωωω
2021/11/07(日) 20:00:28.72ID:RgCygfEf
まさのりって何?
508デフォルトの名無しさん
垢版 |
2021/11/07(日) 20:11:28.00ID:e/2wOCv0
2021/11/07(日) 20:40:31.65ID:JmNYBczp
あとデフォルト引数の評価タイミングが関数の定義時
2021/11/07(日) 21:11:09.29ID:t/1xwUA+
>>509
それは普通じゃない?
2021/11/07(日) 21:12:42.76ID:VzSbYdr/
それだけ読むと特異性かんじないけど
結果ミュータブルなインスタンスでも使い回されるから
知らないとハマるかも
512デフォルトの名無しさん
垢版 |
2021/11/07(日) 21:28:16.74ID:zDn3yvq/
>>490
それだと内側が普通のlistになってるでしょ。
generatorにしないとパイプにはならないんじゃないかな?
2021/11/07(日) 22:09:20.33ID:t/1xwUA+
>>511
他の言語で確認したら普通じゃなかったわ
2021/11/08(月) 00:18:17.83ID:AFFY8UkB
>>513
いやC++とかC#みたいな静的言語だとデフォルト引数には定数など静的に決まっている値しか使えないのが普通なんで、それに似せてるんでしょ
別にそんなに普通じゃなくもない
2021/11/08(月) 02:33:37.44ID:J6d/ajGt
基本的に参照だから
関数呼ばれるときに再評価されるような錯覚しがち
516デフォルトの名無しさん
垢版 |
2021/11/08(月) 02:34:48.50ID:J6d/ajGt
>それに似せてる

いや
上から順に実行してるだけだからにせるも何も
2021/11/08(月) 02:52:44.14ID:pXoKYUcM
MDNのJavaScriptのデフォルト引数の説明で
Pythonが名指しで引き合いに出されるくらいには特異
2021/11/08(月) 03:38:41.76ID:jye9PFXO
>>509
うへぇ、これ知ってなきゃハマるやつだ…覚えとこ
2021/11/08(月) 08:16:14.51ID:mmSscFof
>>509
これないと関数を量産するときに困るんだよな
助けられてる
2021/11/08(月) 08:41:01.05ID:qDbA6fow
>>519
ふつうは別々に定義した関数には影響しないと思うんだが。どういう使い方?
2021/11/08(月) 09:15:44.50ID:QzkUvy+x
>>504-506
警告出れば良いのにな

>>520
デフォルト引数を =[] にしたときに問題が出るとかなんとかだったかな
522デフォルトの名無しさん
垢版 |
2021/11/08(月) 11:04:28.92ID:3dYPFnlP
"重要な警告: デフォルト値は 1 度だけしか評価されません。デフォルト値がリストや辞書のような変更可能なオブジェクトの時にはその影響がでます。例えば以下の関数は、後に続く関数呼び出しで関数に渡されている引数を累積します:"
https://docs.python.org/ja/3/tutorial/controlflow.html#default-argument-values
ここ見れ

設定を読み込む関数とかで、 if config == None: なんとか みたいな感じでよく使われてる
523デフォルトの名無しさん
垢版 |
2021/11/08(月) 11:10:57.60ID:3dYPFnlP
一応この話題もこのスレで見た記憶あるんだけど、はまる人が少ないからか、出てきたときは割と新鮮な感じで受け入れられるよね
2021/11/08(月) 11:28:47.99ID:pXoKYUcM
チュートリアルで重要な警告をしなければいけないことが「普通」ねえ…
525デフォルトの名無しさん
垢版 |
2021/11/08(月) 11:29:31.49ID:3dYPFnlP
あとあれ、デフォルト引数にlistじゃなくてtuple使う理由の一つもこれ
2021/11/08(月) 12:21:09.03ID:kxrCfTp4
そもそもデフォルト値とかいう一般的にconst期待するようなものに動的リストを指定する時点で
殆んどの現場でおいバカやめろってなるだろ
似たようなことするならデコレータ使ったりとかほかにやり方はいくつもあるはずだし
2021/11/08(月) 13:16:32.13ID:pTXzqRC7
へえ…
2021/11/08(月) 13:56:07.01ID:IUmN4sEn
>>520
気になったのはこの仕様で助かるって方。
529デフォルトの名無しさん
垢版 |
2021/11/08(月) 18:18:26.84ID:3dYPFnlP
>関数を量産
この言葉の方が気になるわ
530デフォルトの名無しさん
垢版 |
2021/11/08(月) 18:23:35.95ID:GDZdggMg
generator
2021/11/08(月) 19:53:38.72ID:rM583hbx
>>519 じゃないけど、これのことかな
https://docs.python.org/ja/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result
2021/11/09(火) 06:25:58.20ID:AjdA0gQv
恐いなあ
デフォルト引数は極力使わないようにしとこう
(幸い使ったことはないが)
自分が職場に残したコードが後々悲劇の元にらないように
2021/11/09(火) 06:58:51.77ID:UCZ76//B
>>498
>>500
情報ありがとう
いろんなアルゴリズム勉強してて次は数千万くらいループするようなことをPythonでやろうと思ってたけど厳しそう
2021/11/09(火) 12:06:27.97ID:AYw2Y4/N
__call__便利だなと思って使おうと思うのですが特に罠とかないですよね
2021/11/09(火) 12:58:39.67ID:68YeN4Dm
call -151
536デフォルトの名無しさん
垢版 |
2021/11/09(火) 17:51:14.43ID:gY1b2lRY
整数の1か2か3か4がランダムに入ってる可変長配列がある
すべての要素が奇数か偶数かを求める

算数できないマンなんだけど、これって各要素%2==0するしかない?
算数的に一発で判定できる?
537デフォルトの名無しさん
垢版 |
2021/11/09(火) 17:52:44.04ID:gY1b2lRY
可変長配列て意味不明ね
各要素が1から4のどれかの、長さランダムな配列の全奇偶判定がしたい
2021/11/09(火) 18:01:10.06ID:O2YAvgsT
一発なんてのはないんでない? 知らんけど
list(filter(lambda x: x % 2 == 0, l))
2021/11/09(火) 18:08:32.89ID:y4eH/Tjw
&1
2021/11/09(火) 18:09:48.35ID:WraEKl97
next((x for x in l if x % 2 == 0), None) is not None
2021/11/09(火) 18:22:49.04ID:h26zcWAQ
s = sum(i & 1 for i in L)
even = s == 0
odd = s == len(L)
2021/11/09(火) 18:37:52.32ID:8kpY2GOq
全部掛けて奇数なら奇数のみ
2021/11/09(火) 18:42:49.20ID:LNU/VeL4
ランダムなら先頭から1つずつ見てearly returnしたほうが効率いいよ
実際O(n)になるのはnが十分小さいときだけだから
2021/11/09(火) 19:45:19.14ID:DzPX9Zv+
全部の要素のANDをとって1bit目が1なら全部奇数
全部の要素のORをとって1bit目が0なら全部偶数
速いかどうかは知らん
545デフォルトの名無しさん
垢版 |
2021/11/09(火) 19:48:55.73ID:6aoIkSDY
all(i % 2 == 0 for i in l)
アルゴリズム的な話なら、>>542でいいのかな?
どっちが速くなるかはわからんけど。
546デフォルトの名無しさん
垢版 |
2021/11/09(火) 20:08:07.20ID:UQ//qCST
>>536
各要素の従う確率分布が独立なら全て調べるしかない
2021/11/09(火) 21:27:08.92ID:ge8vpxBP
割り算って計算コスト高いみたいなはなしなかったっけ
だとしたら割り算一回で済む>>542が優勝か?
2021/11/09(火) 22:25:49.93ID:QGVM/tnv
愚直に掛けたらオーバーフローする可能性があるから>>544じゃね?
549デフォルトの名無しさん
垢版 |
2021/11/09(火) 22:33:14.00ID:eryNNSUL
まあ現実的には長さランダムならearly returnでしょうな
2021/11/09(火) 22:37:04.39ID:LNU/VeL4
CPythonのほうで最適化されてるからか%2と&1で速度的に有意な差は見られないけどな
それより1つでも条件はずれたら処理を打ち切らないと
2021/11/09(火) 22:57:55.14ID:/aNe03Si
こういうのジェネレータ書いてnext()が常套だけど
イテレータに対してfind firstする分かりやすい書き方がないのがな
552デフォルトの名無しさん
垢版 |
2021/11/09(火) 23:22:12.36ID:8kpY2GOq
for else
2021/11/10(水) 01:11:59.13ID:MDwGZUB1
Pythonで書くときはバリバリ日本語で書くべきという主義を広めないか?
2021/11/10(水) 04:04:29.53ID:YQwPYBK4
>>536
xs.all?(&:odd?) または xs.all?(&:even?)
2021/11/10(水) 06:52:37.08ID:Mmr3oxKF
SJISのテキストファイルで、全角半角混在の行の長さを
バイト数で知るにはどうすればよいか
len関数は全角文字を1と判定するので、この目的には使えないようだ
2021/11/10(水) 09:21:40.34ID:morNzhKw
数学だけ知っててプログラミング下手な人は
論理的に正しくても実行にかかる時間を考慮しない傾向にあるな
2021/11/10(水) 09:23:24.08ID:morNzhKw
>>555
SJISで半角カタカナ混在は想定してる?除外?
2021/11/10(水) 09:25:16.07ID:morNzhKw
そもそも問題の設定が可笑しいな
行の長さをバイト数でってことなら
バイト列で\nから\nまでのバイト数を数えれば良いんじゃね
2021/11/10(水) 09:25:49.53ID:l5Ahtbnb
>>555
str.encode()
560デフォルトの名無しさん
垢版 |
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
2021/11/10(水) 11:00:38.81ID:pJeuK/iL
>>560
最終的な目的がわからんと、全く何がしたいのかわからんわ。
2021/11/10(水) 11:05:25.69ID:ABhSQgxq
cmdって名前の変数に数値が入ってるのはまだしも、それが条件判断に使われてるのはセンスが凄い
2021/11/10(水) 11:33:47.73ID:4NOC2kX2
pythonの三項演算子だけは許せない
見にくすぎる

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

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

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

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

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

> >>581のコード例も探索と出力を分離してない悪い例
さすがに例にそのツッコミはどうかと思うぞ
2021/11/11(木) 12:39:45.52ID:8NRWWnb2
古いバージョンとの互換性がないか、考慮する必要のない場合、
標準で使えるものは使っとくほうが楽
それに対して、別途導入が必要なものは使わないな
2021/11/11(木) 14:03:11.82ID:VFTg6I1W
でもループのあとにいきなりelse出て来て
これがどの条件でそこにいくのかすぐに分かるやつおらんのでは?
ループ内でbreakしたあとだよ、とかいえばそのまま信じる人多そう
結局、分岐条件をちゃんと真面目に書いたほうが誤認、誤読を防げてwysiwygみが出る
587デフォルトの名無しさん
垢版 |
2021/11/11(木) 14:11:28.15ID:1agSgarI
windowsのpoetryでキャッシュからパッケージをインストールするとエラーになるやつってまだ修正されてない?
2021/11/11(木) 18:08:48.51ID:JDtebxVn
辞書に"data"がある限り掘っていき
キー名と値をハイフン文字列で連結する
みたいなことをやりたくて自分で考えてみたのですが
https://ideone.com/o5VIjG
これで一応は出来た(期待する出力)のですが
最適化してもらえないでしょうか
2021/11/11(木) 19:32:31.66ID:M//5twRa
実質同じだけども
https://wandbox.org/permlink/9JBvGsnQj8FbPHci
2021/11/11(木) 19:57:35.31ID:R65WwKU7
https://ideone.com/vagFZJ

頑張れば変数削減できると思うけど面倒くさかったので
2021/11/11(木) 20:15:29.73ID:JDtebxVn
>>589-590
ありがとうございます
やってみます
2021/11/12(金) 05:11:14.29ID:nOrEz+co
>>586
> ループ内でbreakしたあとだよ、とかいえばそのまま信じる人多そう
バカに合わせろと?
まあ土方職場ならそうかもねw
2021/11/12(金) 05:44:51.77ID:69xCA6xu
forでelse使えるってしらんだし普通にインデントミスってたのかなと思ってifの所に直しておくかな
2021/11/12(金) 07:15:43.05ID:Wbl+f+tk
>>593
あり得るからマジで怖い
どうしても使うなら、「このelseはfor の一部で、
ここに処理が来る条件は〜」のような
詳細なコメントを残す必要がある
2021/11/12(金) 08:22:54.70ID:bzXu0SPl
ややこしくなるだけのものをわざわざ使うことないでしょう
596デフォルトの名無しさん
垢版 |
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
を入力すると以下の文がでます
597デフォルトの名無しさん
垢版 |
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] 指定されたファイルが見つかりません。
598デフォルトの名無しさん
垢版 |
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
599デフォルトの名無しさん
垢版 |
2021/11/12(金) 09:09:56.62ID:bLCSn2ms
長文失礼しました
スレチだったら申し訳ありません
よろしくお願いします
2021/11/12(金) 09:42:28.23ID:+FPwLl69
全然知らんのだが、インストールされてるのがselenium4なら
このあたりが怪しいかも
https://qiita.com/yagaodekawasu/items/5813a8cb4c3d73386e7a
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
2021/11/12(金) 10:33:02.94ID:zRf7Ym05
データ取得するのが目的ならソースのonclickにパスまんま書いてる
603デフォルトの名無しさん
垢版 |
2021/11/12(金) 10:37:35.81ID:0ShHeix+
>>600
selenium 3.14に変更してみましたが同様の文がでました
604デフォルトの名無しさん
垢版 |
2021/11/12(金) 10:38:15.67ID:0ShHeix+
>>601
試してみます
605デフォルトの名無しさん
垢版 |
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
と表示されます
606デフォルトの名無しさん
垢版 |
2021/11/12(金) 11:07:27.73ID:0ShHeix+
>>602
データ取得するのが目的です
ソースとは国土数値情報のサイトのほうですか?
2021/11/12(金) 11:18:39.40ID:+FPwLl69
関係無いけど、昨日Python知った割にはすんなりといろんなことがよくできるな。
もともとLinuxやってた人?
608デフォルトの名無しさん
垢版 |
2021/11/12(金) 11:21:32.57ID:0ShHeix+
>>607
プログラミング関係一切やったことないです
cd コマンドも昨日知りました
609デフォルトの名無しさん
垢版 |
2021/11/12(金) 11:21:59.16ID:du4vJvWd
わろたw
そっちの「ソース」をどうやっていじるんだよ。

ドライバのPATH通したなら、
executable_path=DRIVER_PATH,
を削除したらどうだ?
おそらく、上記を設定するとそっちが優先されるだろう。
610デフォルトの名無しさん
垢版 |
2021/11/12(金) 11:29:55.18ID:0ShHeix+
>>609
動きました!ありがとうございます!
こういうプログラムが機能するのって面白いですね!
拙い知識でご迷惑をおかけしましたが,レスくれた人たちありがとうございます
2021/11/12(金) 11:35:58.04ID:zRf7Ym05
>>606
そうサイトのHTMLソース
なのでDOM解析してもいいけど、ぶっちゃけ文字列検索で例えば
$ wget https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-L03-a.html
$ grep -oP '/ksj/gml/data/.+zip' KsjTmplt-L03-a.html | wget --base https://nlftp.mlit.go.jp -i -
でOK

スレ的には当初の手法で成功してよかった
612デフォルトの名無しさん
垢版 |
2021/11/12(金) 11:56:23.24ID:+D42agk2
やりたいことがあるのは良いことなので
この調子で色んなことに挑戦しよう
2021/11/12(金) 13:04:57.85ID:iYNtaU8H
OSのインストールのときの最後に、
カウンドダウンする表示が出てきて、
あと30秒で再起動する、今すぐのときはボタン押せ表示が出てくる。
ああいうのをpythonでやりたいんだが、参考になるものある?

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

こういうのって例外クラス作ってexceptでまとめて受けたほうがいいですか?
同じ内容のbar()が散乱するのって気になる?
2021/11/12(金) 15:12:27.59ID:a3j0d+bF
>>593-594
無能自慢乙w
2021/11/12(金) 15:56:02.93ID:GHgBaz6z
自分にしか読めないコード書いて悦に浸るとか20年前のコボラーかよ
2021/11/12(金) 18:01:39.54ID:FV3v58XB
('A')
2021/11/12(金) 18:16:04.90ID:1KWt8wEr
>>614
bar()の意味合い次第だと思うが
引数含めて全く同じ処理をするんならelse句でraiseしてまとめてしまったほうが理解しやすいと思う

それよりどこで発生する例外をexceptで受けてるのかが曖昧なのが気になる
x.has()なのかuse()なのかfoo()なのか
bar()でもValueError発生する可能性があるのかないのかみたいな
619デフォルトの名無しさん
垢版 |
2021/11/12(金) 18:29:01.39ID:JnXYuZWY
from ctypes import *
t = 30000
while(t -= 1):
windll.user32.MessageBoxW(None,"YYY","ABC",0)
2021/11/12(金) 18:55:33.33ID:a3j0d+bF
>>616
お前が読めないだけだろ…
言語仕様として公式に提供されてるのに老害はこれだからw
2021/11/12(金) 19:30:16.12ID:xRtlJ9/N
こういうのを見るたび「Zen of Python」ってなんだったんだろうなって思ってしまうw
622デフォルトの名無しさん
垢版 |
2021/11/12(金) 19:54:46.68ID:JnXYuZWY
>>621
Zenは原理主義じゃないから
623デフォルトの名無しさん
垢版 |
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()

んーーーー
624デフォルトの名無しさん
垢版 |
2021/11/12(金) 20:32:02.95ID:+D42agk2
('A')が(´A`)に見えた
2021/11/12(金) 21:16:34.84ID:1KWt8wEr
>>623
has()が例外投げる代わりにFalseを返せばいいんでは?
2021/11/12(金) 21:25:29.92ID:1KWt8wEr
loopのelse句はGuidoも後悔してる機能
https://mail.python.org/pipermail/python-ideas/2009-October/006157.html
2021/11/13(土) 00:44:08.28ID:fE0qo4YR
>>621
グイドは禅を守る為に戦ってるんだよ
628デフォルトの名無しさん
垢版 |
2021/11/13(土) 01:57:43.67ID:PnBDGE+q
そりゃ後悔するわな
629デフォルトの名無しさん
垢版 |
2021/11/13(土) 04:38:52.17ID:qYaZF+ZS
Web Designing 2021年12月号
>入門〜上級まで本気で勉強したい人必携。Pythonの利点からWebビジネスで活きる仕組みまで丁寧に解説!
630デフォルトの名無しさん
垢版 |
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
)
""")
631デフォルトの名無しさん
垢版 |
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)
632デフォルトの名無しさん
垢版 |
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()
633デフォルトの名無しさん
垢版 |
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']になってしまいます。
2021/11/13(土) 17:56:44.89ID:vJfZgOKN
入ったかどうかを select で確認してるんだから
入ってたら除外すればいい
635デフォルトの名無しさん
垢版 |
2021/11/13(土) 18:09:47.53ID:kgYXWGHf
>>634
今回は練習で入ったかどうかを確認しているのですが、
最終的にはurlをどんどん目視確認なし重複なしで入れていくようにしたいです
2021/11/13(土) 18:13:41.77ID:Mehg38vB
url_nameを主キーにすればいいんじゃないの
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も知らないのはどうかと思うぞ
2021/11/13(土) 18:21:14.00ID:6FXvjqIK
pythonロジックでセレクトかけてインサートするかどうか決めたり或いは
インサート文にwhere条件入れてもいい
ただ設計的なはなしでいうなら、最初から重複すべきではないなら
テーブル定義の重複NGにキー制約かけたほうがベスト
その際、インサートで主キーだぶるとdbms側で例外吐くので、例外処理のpythonロジックを追加する必要がある

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

基本的に、セレクトででてくるデータは写像であって実体ではない
これをまず理解してないと、組み合わせ爆発まで考えが行き届かないことになりやすい
641デフォルトの名無しさん
垢版 |
2021/11/13(土) 18:42:45.91ID:kgYXWGHf
>>637の内容で入れてみます!!!
データベース勉強しはじめでよくわかってなくて申し訳ない。
upsertは調べてみたのですが、重複した場合、内容を更新するとなっていてやりたいことと違うのかと思いました
2021/11/13(土) 18:46:41.57ID:6FXvjqIK
>>641
マージ文でググればでてくるけど
じつはアレ、アップデート文書かなくてもちゃんと期待どおりに動くぞw
インサートやって、出来なければスルーしたいならOR UPDATEの部分だけ書かなければいい
643デフォルトの名無しさん
垢版 |
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
すまん、話してることが難しくてよくわからない
644デフォルトの名無しさん
垢版 |
2021/11/13(土) 18:58:26.95ID:kgYXWGHf
ぽまいらなんでこんなに詳しいんだ
挫折しながらもpythonちょっとできるようになってきて、
csv辞めてデータベースに入れてみたいってなって、
postgresqlの勉強始めたら挫折して、挫折しかしてねえぞ俺
645デフォルトの名無しさん
垢版 |
2021/11/13(土) 18:59:24.51ID:kgYXWGHf
>>642
これから637と642どっちも試してみるです!!
2021/11/13(土) 19:00:45.55ID:x1CN7sQN
>>641
> upsertは調べてみたのですが、重複した場合、内容を更新するとなっていてやりたいことと違うのかと思いました
upsertやmergeはDBMS毎に書き方違うから調べにくいよね
まあおいおい調べていけばいいと思うよ
あと、例外出してPython側で処理するとかPostgreSQLにないマージ文とか言ってるアホは無視でいい
2021/11/13(土) 19:08:25.74ID:6FXvjqIK
すまんw
postgresもどうせ普通にANSI規格やろと思ったら未実装やったんかい
648デフォルトの名無しさん
垢版 |
2021/11/13(土) 19:16:23.51ID:kgYXWGHf
637のやりかたでできたぞです!
ありがとう。

642も試してみる
2021/11/13(土) 19:27:37.20ID:6FXvjqIK
>>648
postgresでは使えなかったので試さんでいいです
ごめん
650デフォルトの名無しさん
垢版 |
2021/11/13(土) 19:54:50.55ID:kgYXWGHf
>>646,647
マージ文?ないってレスに今気づいたありがとう。
2021/11/13(土) 21:24:55.56ID:wUFaz/ce
辞書のキー名から動的に値を取得したいのですが
https://ideone.com/yTqdAv
これってforの内包表記とか即実行関数で
一行でかけないものでしょうか?
652デフォルトの名無しさん
垢版 |
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))
2021/11/13(土) 23:36:54.00ID:wUFaz/ce
>>652
なるほどそんな便利なものがあったんですね
ありがとうございました
654デフォルトの名無しさん
垢版 |
2021/11/14(日) 00:17:07.01ID:MXTEWU7A
静的にキーを定義してる時点で動的とは言えないのでは
2021/11/14(日) 01:36:39.78ID:ZInZl5Ie
ええもちろん実際は
>ary=["a","b","c","d"]
の部分は動的生成ですよ >>654
ちなみにどう書いてあると良かったでしょうか
今後質問するときに参考にします
656デフォルトの名無しさん
垢版 |
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使って頑張ればいける?無理かな
2021/11/14(日) 02:13:49.47
>>656
それ、目的が「111を取得する」ことになってね?
もしdが
d={"a":{"b":{"c":{"e":222,"d":111}}}}
とかだったら、222になっちゃうよ
2021/11/14(日) 04:27:10.93ID:PiYGiFgV
>>644
挫折と言うのは努力した人がするもんだ
2021/11/14(日) 08:05:21.74ID:8oLu5/jW
>>655
> ちなみにどう書いてあると良かったでしょうか
> 今後質問するときに参考にします
一部の変な人が無駄に絡んでるだけ
元の書き方で普通わかるから気にしなくていいよ
2021/11/14(日) 13:36:33.18ID:E00roTgy
そもそも日本語が不自由っぽくて
何をしたいのかが良く判らん
2021/11/14(日) 13:40:46.75ID:E00roTgy
と思ったが画像観てなかったわω
関数名 search_tree とか search_node の方が良いんじゃね
2021/11/14(日) 14:59:17.47
相手の日本語を疑う前にまず抽象化して考えた方が良いと思うわ
質問者の質問には、期待部分とコード部分が分かれてるわけで。
コード部分だけみて文字通りコードだけみて
「何したいかわからん」っていう人いるけど
全部同じ人だとしたら、ずっとネタでやってんのかと思ってたけど
返しがガチアスペっぽいんだよなぁ・・

例えば if True:とか書くと
「Trueだと当たり前じゃん、何がしたいかわからん」
みたいな返しの人いるじゃん
これまじでネタでやってんのかと思ってたけど
安定して登場してるんでどうもネタでやってないっぽい
2021/11/14(日) 15:01:10.51ID:ckxtWecQ
画像?
人の日本語にケチつけるレベルじゃないだろw
664デフォルトの名無しさん
垢版 |
2021/11/14(日) 15:06:35.08ID:L6aMQe6P
>>651
ここまでいくつか挙がってるが、そのコードが一番いいよ
無理やり1行にすると後で見た時に意味不明になるよ
コードゴルフが目的なら言うことはないが
2021/11/14(日) 15:38:37.79ID:vfrWY536
それあるわ
苦労して一行にまとめたコードだが、
何をしているのかを解説するコメントが10行くらい必要になって
これやらない方がよかったなって経験がある
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正規形まで入る

さらに、データベース技術者資格・ミックの本も読んだ方がよい
2021/11/14(日) 16:58:12.67ID:tkHjD9h1
>>657
例が悪い
2021/11/14(日) 18:18:34.52ID:XvRnuZG1
質問は割とまともでも
最初に付いたレスが頓珍漢だと
頓珍漢な質問者だということにされる好例
669デフォルトの名無しさん
垢版 |
2021/11/14(日) 18:40:23.82ID:+PJrsOCi
ただ絡みてえだけのバカが数人常駐しとるでな
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の順で検索するコード書けばいいじゃねえか!!」
とはならんだろ・・
だからアスペっぽいなぁと感じる所以
で、ネタならただの荒らしなんでそれはそれでいいが
ネタじゃないっぽいガチアスペっぽいやつがいるんだよな
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日本語を貼り付け可能にする方法

よろしくお願いいたします。
2021/11/14(日) 19:41:02.30ID:r+uJUw0M
最前面にあるのとフォーカスがあるのは一緒じゃない
673デフォルトの名無しさん
垢版 |
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
2021/11/14(日) 20:19:49.33ID:y/dqGNjn
コードが意訳でなくコピペなら引用の範疇かが気になるし有料ならそっちで聞いた方がよくない?
前後の流れもあるだろうし
2021/11/14(日) 20:23:34.90ID:sz2Sy1tN
そもそもpyperclip.paste()とpyperclip.copy()はクリップボードの中身をどうこうするために存在するのであって
なんかの画面に貼り付けるために存在するのではない
結論としてはpyautogui.hotkey()にctrlとv渡せ
2021/11/14(日) 20:26:13.01ID:6/4ZgoB5
>>672さん
ありがとうございます。
理解しました。そうですよね。よく考えれば当然でした。

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

で、メモ帳にフォーカスをあてるには、バーチャルマウスでクリック等はあったのですが、
直接指定してフォーカスする方法があればお教えください。
2021/11/14(日) 20:51:40.87ID:sz2Sy1tN
タスクバー上の配置を固定しておいてwin+数字キー
2021/11/14(日) 21:23:31.50ID:qmSPgrdk
>>673
説明の何がわからないのかもう少し細かく考えてみては?

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

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

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

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

っていう、超初心者スレが現状の>>681にできる最大限のアドバイス
受け取れ
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 も同じじゃないの?
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もシーケンスなのでリストや文字列と同じようにスライス可
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)を待ってしまいます
どうにか非同期的に処理できないものでしょうか
2021/11/15(月) 14:48:29.66ID:P/PCEOHq
>>689
sleep1/2を非同期処理で書けばいいやん
scheduleが機能持つと重複だし作法が縛られるからよろしくない
PyPIにいけばasyncioをラップしたスケジューラはありそうだけどね
691デフォルトの名無しさん
垢版 |
2021/11/15(月) 14:58:38.85ID:i/3H6iLT
threading
thread
2021/11/15(月) 16:08:12.68ID:2H0KJ/Z9
>>690,691
sleep12を非同期で処理するとスケジュールタイマーが機能せず
スケジュールタイマーを機能させるとsleep12が互いに処理を待つ
みたいな、こちらを立てればあちらが立たず状態です
2021/11/15(月) 16:35:56.57ID:P/PCEOHq
>>692
もし非同期処理のなかでtime.sleep()してるならストップ・ザ・ワールド
https://docs.python.org/ja/3/library/asyncio.html
とくにこだわりないなら今はasyncioで書くのがいいよ

https://docs.python.org/ja/3/glossary.html#term-global-interpreter-lock
あと処理のなかでGILつかんでるならプロセスベースにするのが単純な解決方法
2021/11/15(月) 16:41:25.31ID:nBoI3p59
>>692
「三秒おきに『10秒待つ』をループする処理」
と「一秒おきに『即時実行』をループする処理」
のふたつをアウェイタブルオブジェクトとしてつくって、せーので流す
が、ぱっと思い付いた

他にかっこいいやり方ありそうやけど
2021/11/15(月) 16:55:34.42ID:zyhNM4DJ
10秒待ちと1秒待ちを非同期にするだけなら簡単そうだけど
3秒待って10秒待ちの場合13秒待ちで非同期にすればええのか
最終的にどういう関数動かすかによるけど
3秒ごとに10秒待ちも非同期なん?
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を使いつつ非同期させるやり方がわかりませんでした
2021/11/15(月) 17:25:52.78ID:2H0KJ/Z9
訂正 >>659 → >>695
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','佐川急便']]

ヘッダーは価格、ストア名、配送者です。
スマホから手打ちしたのでズレてたらごめんなさい。
699デフォルトの名無しさん
垢版 |
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()
700デフォルトの名無しさん
垢版 |
2021/11/16(火) 00:25:14.03ID:2pODoVjh
yes/noはどうなって欲しいかよくわからん
2021/11/16(火) 02:34:34.04ID:Z03AZUuJ
>>700
yesのときはyesをストア名で置換して、noのときは佐川急便に置換したいです。
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
703デフォルトの名無しさん
垢版 |
2021/11/16(火) 09:54:19.33ID:OREEnQL3
windowsだと円マークとバックスラッシュに5Cを当ててるけど
Macなんかはちゃんと区別してるってことじゃないの
2021/11/16(火) 11:25:27.35ID:5D9mKY7b
>>679
末尾再帰とループは同値だとあれほど
2021/11/16(火) 11:28:28.42ID:5D9mKY7b
>>698-699
apply
2021/11/16(火) 11:35:50.32ID:mF3NnymR
>>704
いや、わかりにくいって話な
2021/11/16(火) 12:05:42.27ID:wraX66B2
Ruby有識者早くきてくれー!
2021/11/16(火) 17:14:17.96ID:jfdNp8v5
>>707に召喚されたので…

>>651
https://ideone.com/WA4rsx
709708
垢版 |
2021/11/16(火) 17:30:31.28ID:jfdNp8v5
いらぬおせっかいかもしれぬが、関数型プログラミングの正しい知識があれば、
Python でも標準ライブラリ関数 reduce を使って一行で書けるハズ
なお、内包表記は map/filter の構文糖だから、還元(あるいは畳み込み)機能の
実装である reduce の代替にはならない
これは Pyhthon の問題ではなく内包表記の限界だから、例えば Haskell でも同じ
2021/11/16(火) 18:30:31.88ID:2/DPJM9H
>>708
dig・・・
2021/11/16(火) 18:39:12.08ID:GJIVmbG1
スレタイに超初心者用って書いてあるやん
超初心者相手に知識マウント取って楽しいか?
2021/11/16(火) 18:44:06.19ID:ndL262TB
無駄無駄
Pythonって単語が入ってしまってる以上どうやっても好き勝手パイ雑談したがるやつが出るから。ルールってそんなもん
Pythonお勉強スレと両方見ててスレの流れだけ見てどっちのスレか区別もなくレスしてる奴がほとんどだろう
713デフォルトの名無しさん
垢版 |
2021/11/16(火) 19:04:24.15ID:2pODoVjh
関数型プログラミングのメリットって何ですか?
714デフォルトの名無しさん
垢版 |
2021/11/16(火) 22:37:11.33ID:iw6chFt8
パイ雑談て😅
715デフォルトの名無しさん
垢版 |
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)でページ遷移した状態で固まってると思います
716デフォルトの名無しさん
垢版 |
2021/11/17(水) 07:09:40.02ID:ytfPCTgK
同じurlで繰り返しためしてみても正常に処理できるときがほとんどで
極稀にdriver.get(url)でページ遷移した後の画面でフリーズするので原因がわかりません。
対応策とか分るかた入れ歯教えてください
717デフォルトの名無しさん
垢版 |
2021/11/17(水) 07:10:50.45ID:ytfPCTgK
あとはdriver.get(url)の次の処理が60秒間の間に始まらなければエラーを返すみたいな処理が可能でしたら教えてほしいです
2021/11/17(水) 07:34:30.83ID:CbT8HrOI
https://stackoverflow.com/questions/28131038/selenium-webdriver-driver-geturl-hangs-sometimes
2021/11/17(水) 07:53:08.82ID:k9NuPgD9
>>718
ありがとうございます。
家から出ちゃったので試すの夕方になりますがやってみます
2021/11/17(水) 08:00:22.67ID:k9NuPgD9
日本語翻訳して読みましたが
os.path.devnullってやつを起動時のオプションにいれるか、driver.set_page_load_timeout(15)をdriver.get(url)の次の行に入れればいい感じですかね?
2021/11/17(水) 08:20:17.64ID:uBgicjSp
>>718
PhantomJS って、まだ使われているのか?
722デフォルトの名無しさん
垢版 |
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みたいなのないですか?
723デフォルトの名無しさん
垢版 |
2021/11/17(水) 10:29:30.19ID:wlAtkNPK
A と WWW が変数でないならば文法エラー
変数であれば変数の中身次第だが
not in (0, 1):
で期待する動作にはならないだろう
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 |佐川急便|
+------+--------+--------+
2021/11/17(水) 10:37:50.75ID:GPq3lXDW
>>722
>>723が言う様に文法エラーだと思うが、文字列だとした場合は
re.search('[^01]',"".join(l))
re.search('[^0]',"".join(l))

一番速いかどうかは知らん
2021/11/17(水) 10:46:02.33ID:GPq3lXDW
こっちの方がいいかな?
set(l)=={'0', '1'}
set(l)=={'0'}
727デフォルトの名無しさん
垢版 |
2021/11/17(水) 11:55:11.92ID:B6bo55Im
失礼しました
全部strっすね。不定文字列もstr型
'0', '1', 'wooo'
i n ('0', '1')
728デフォルトの名無しさん
垢版 |
2021/11/17(水) 12:34:52.78ID:4tNSHn/X
in '01':
2021/11/17(水) 12:40:38.25ID:k9NuPgD9
>>724
すまん、丁寧にありがとう!!
帰ったらこれも試してみる
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
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
2021/11/17(水) 16:16:01.02ID:f/0NZNwK
>>729
csv_normalではデータ読み込みの際のデータ区切りはカンマ固定だったんですが
今回のようにデータにカンマがある例では不便なので、データ区切りを指定できるようにしました

最新Version3.2.4では以下のようにデータ区切りを空白にもできます
c = csv.load('hogehoge.csv', sep='\s+', encoding='utf8')
2021/11/17(水) 20:20:04.76ID:ytfPCTgK
>>718
driver.set_page_load_timeout(30)を入れて回してみましたが、フリーズしてから5分くらい待ってもエラーになりません。
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("エラー")

で試してもエラーが出ない感じです
735デフォルトの名無しさん
垢版 |
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て感じでテーブルを作っていきたいですがうまくいきません。
736デフォルトの名無しさん
垢版 |
2021/11/18(木) 10:52:34.99ID:/He/baLS
c.execute(f"""
CREATE TABLE IF NOT EXISTS testschema.{table_name}(
"code" text,
)
""")
2021/11/18(木) 11:31:32.62ID:IG65qiRj
psycopg2つかったことないけど
それpreparedステートメント透過的につかわれてるの?
2021/11/18(木) 16:23:01.48ID:176auHoD
Djangoで python manage.py runserverでサーバーを起動させたが全てのターミナルを消しても上記のサーバーのページにアクセス出来る
どうやったらサーバーを止められる?
2021/11/18(木) 16:27:27.07ID:176auHoD
lsof -i :8000でpid確認してkill -QUIT プロセスidで終わらせれました
2021/11/19(金) 11:20:04.92ID:eyeX0xyM
たぶんそれ人違いで殺してる
741デフォルトの名無しさん
垢版 |
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)]
2021/11/19(金) 19:37:02.12ID:FvmYZMBk
[tuple(x) for x in df.values]
743デフォルトの名無しさん
垢版 |
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()
調べたら上記でいけるかと思いましたがだめでした
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...』というのが使えるらしい事は調べたものの
文法がよく分からず何度やってもエラーが出てしまいました。
他の方法でもいいのでなにとぞ複数条件の除去が可能なコードなりを教えてもらえると助かります。
745デフォルトの名無しさん
垢版 |
2021/11/20(土) 04:49:44.14ID:w0sFPEUw
簡単なところから徐々にステップアップしていけよ
とりあえず超初心者本買って読め
今の調子じゃ一から十まで全部聞くハメになるぞ

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

これならわかるだろ
lambdaとかfilterは、まずこれが書ける人が次の段階で覚えろ
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]の部分はスライス
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"]
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でできますか?
749デフォルトの名無しさん
垢版 |
2021/11/20(土) 08:43:20.89ID:EeA4sZVq
rubyのアタマがバグってるやつはおいといて
今回の件は
news=[dat for dat in olds if '月' in dat]
だけでいいんじゃ〜
forの実直ループ覚えたら内包表記覚えて
そのあと高階関数とpandas行くのだぞ
やりたいことの範囲はopenpyxlぽいけど
2021/11/20(土) 09:12:28.20ID:MzN+MOHO
>>748
subprocessでできると思うけど、結局コマンドプロンプトのコマンドを実行するわけだから
zikkou.pyじゃなくてbatファイルで1.py, 2.py, 3.pyを呼び出した方がいいんじゃないかな?
2021/11/20(土) 09:22:38.89ID:MzN+MOHO
>>748
でけた!
for pyfile in ['1.py', '2.py', '3.py']:
____subprocess.call(f'python {pyfile}')
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しても最適化されてオーバーヘッドかからない言語もあるので
アルゴリズム的な考え方と特定言語での実装とを分けて捉えるようにしておくと後々役に立つ
753デフォルトの名無しさん
垢版 |
2021/11/20(土) 15:32:34.01ID:/G7VwRdk
>>750
ありがとう!
ちょっとやってみます
754デフォルトの名無しさん
垢版 |
2021/11/20(土) 15:34:29.98ID:/G7VwRdk
pandasの列のデータ型をnumpy.int64からpythonのintにするにはどうしたらいいんや?
列名["count"]の場合にdf["count"].astype(int)でいけるのかと思ったらできなかった
2021/11/20(土) 17:05:24.67ID:Pz0iKQrb
>>744です。
帰ってきたら想像してた以上に色んなやり方を書いてもらえててなんか感動してます。

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

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

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

・・・ちなみになんですが、こういう引数の知識は基礎の基礎と思うのですが、
その一通りが日本語でまとめてあるような本やサイトってあるんでしょうか?
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

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

スライスを使うと、もっと簡単に書けるのか?
2021/11/20(土) 18:32:51.76ID:7hjyIAPL
アルゴリズム系の問題は、図を描いて、考えた方がよい
2021/11/20(土) 19:11:39.87ID:IJPPTR8A
>>761
その図を書くってのを教えて欲しい
出来ればPCやスマホ上で出来るようなツールない?
763デフォルトの名無しさん
垢版 |
2021/11/20(土) 20:00:29.61ID:w0sFPEUw
俺はこれは問題のための問題
クソ問だと思う
特に-1返すとか、モジュールはともかく、文字列メソッド使用不可とかバカの極み
クイズは無視してやりたいことを追え
2021/11/20(土) 20:01:36.80ID:fQWlPv63
せっかくだからKMP法まで勉強しろ
2021/11/20(土) 20:17:33.74ID:72MXZSnK
>>762
一番メジャーの方法はUML
ググるといっぱいツールが出てくる
有料なのも多いけど
2021/11/20(土) 20:26:19.53ID:Kgb5xsxv
文字列をスライスするのって文字列のメソッド使ってるよね?
2021/11/20(土) 20:54:17.15ID:785tmrzC
> str2 が str1 を部分文字列として含むかどうか
> str2 を含む場合
逆転してね?
2021/11/20(土) 21:36:08.75ID:hT1QMP3Z
>>759
そりゃそうだろ
そもそも大半のプログラマーは競技プログラミングなんか興味ない
2021/11/20(土) 22:02:54.27ID:IJPPTR8A
>>768
いや、これ初心者向けの教材なんだよ
だからこの問いの答えがぱっと出て来なきゃいけないのかと思ったんだ
2021/11/20(土) 22:05:42.97ID:hT1QMP3Z
>>769
普通にググればいいよどうしても自力でやりたいなら組み込み関数のソースコード読んでパクればいいんじゃねやったことないけど
2021/11/20(土) 22:16:28.52ID:eO5P7jHp
>>756
自分でやるときどうする?
例えば location と cat なら

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

って言うようにずらしながら比較していくよね
って言うところからやればいいんじゃね
2021/11/20(土) 23:00:40.68ID:W0+y3mk4
>>766
それが文字列のメソッドに該当するならインデックスアクセスもできねえだろw
解なしになっちまうよ
2021/11/20(土) 23:03:09.18ID:W0+y3mk4
まあ、スライスがいい回答だとは思わないけど
小学校の教材ならたぶん0点つけてくる教師がいる回答
2021/11/21(日) 00:27:58.17ID:QD7EEWWT
構文などの書き方が分からないってなら仕方無いと思うけど
この程度のアルゴリズムを思い付けないってならヤバいだろ
池沼疑われるレベル
2021/11/21(日) 00:38:15.47ID:dCta8OJm
アルゴリズムとか使わないから
知能検査は別スレだろ
2021/11/21(日) 01:16:28.56ID:L8vXU9lo
KMP法とかsuffix arrayの話?
2021/11/21(日) 08:44:34.82ID:1b0LVSEh
>>772
そんなこと言っても文字列のメソッド使ってるじゃん
使っちゃダメだから
2021/11/21(日) 09:58:00.66ID:4YV1JWdz
アスペって生き辛そう…
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
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]
2021/11/21(日) 12:37:43.77ID:jllQNQOR
__getitem__も__iter__も文字列のメソッドなのでその回答だと0点ですね
2021/11/21(日) 12:40:01.89ID:jllQNQOR
__len__も使ってたか
783デフォルトの名無しさん
垢版 |
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)
784デフォルトの名無しさん
垢版 |
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')にすると行データを取れるのでどうしていいかわかりません
2021/11/21(日) 15:36:48.25ID:uiA0IfT6
a_codeを%sにすりゃいいだけちゃう
fと%sの使いどころの問題では
786デフォルトの名無しさん
垢版 |
2021/11/21(日) 15:43:34.67ID:BLVHorEN
>>785
今%sにしてみましたが、
not all arguments converted during string formatting
がでてきてしまいました
2021/11/21(日) 16:48:00.01ID:BwaLJwgU
>>754
df["count"].astype(long)
2021/11/21(日) 17:07:50.01ID:BwaLJwgU
"weight(g)"=None
になってる行があるから
insert に失敗してるんだろ
789デフォルトの名無しさん
垢版 |
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 米
790デフォルトの名無しさん
垢版 |
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標準ではシングルクォート。
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も同じこと
792デフォルトの名無しさん
垢版 |
2021/11/21(日) 18:22:31.92ID:BLVHorEN
>>790
できた!できました!!!
ありがとうございます!!!!!!
2021/11/21(日) 19:25:01.44ID:MSJBJTi1
>>791 をスルーするのが今日の流れっぽい
2021/11/21(日) 19:40:20.97ID:coVM5S7R
実験や習作だと思うけどprepared statement使うのが筋だし
f-stringで教えるアホは業界去った方がいい
795デフォルトの名無しさん
垢版 |
2021/11/21(日) 20:19:01.83ID:BLVHorEN
すまん、791はwarningって書いてあったからよくみてなかった。
初心者すぎてよくわからんのですが、f-stringとprepared statementってどっちがどっちですか?
@f"{a}"のやつ
A(%),aのやつ
結果が同じでも処理に違いがある感じですか?
796デフォルトの名無しさん
垢版 |
2021/11/21(日) 20:23:30.97ID:BLVHorEN
791google翻訳してみましたが、よくわからん。

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

(%),aではなくf"{a}"がいいですよってこと?
2021/11/21(日) 20:45:52.97ID:szj4saah
>>791はpsycopg2の公式ドキュメントから引用
https://www.psycopg.org/docs/usage.html#sql-injection
798デフォルトの名無しさん
垢版 |
2021/11/21(日) 20:48:25.93ID:BLVHorEN
>>797
ありがとう。
ブクマして少しずつ読んで見る
2021/11/21(日) 21:16:22.28ID:zYUtuXs9
基本、Ruby on Rails などのウェブ開発では、

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

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

フレームワークを使った、ウェブ開発の基本
2021/11/21(日) 21:21:08.30ID:coVM5S7R
>>795
@もAもprepared statementではないけどもAが正解
Aでpsycopg2が行っているような処理をRDBMS(PostgreSQL)側で行うのがprepared statements

https://www.psycopg.org/psycopg3/docs/advanced/prepare.html#prepared-statements
psycopg3になれば勝手にやってくれるみたい
801799
垢版 |
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 )
802デフォルトの名無しさん
垢版 |
2021/11/21(日) 21:46:31.38ID:BLVHorEN
調べてきたけど、プレースホルダーを使わないと攻撃されたとき危険ってのがわかったわ。

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

変数a ではなく、変数id
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
とか見るとダブルクォーテーションで囲ってないよね
2021/11/21(日) 21:51:23.16ID:BLVHorEN
大文字の時は括らなきゃいけないのかと思ってたわ
806デフォルトの名無しさん
垢版 |
2021/11/21(日) 22:20:00.67ID:EfkKXMOb
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

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

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

て書くのがバカらしいので
816デフォルトの名無しさん
垢版 |
2021/11/24(水) 03:25:37.66ID:Q5JPayEq
>>812
絶対壊れる未来しか観えない
2021/11/24(水) 03:27:08.47ID:Q5JPayEq
>>814
assert __AUTHOR__ != >>812
2021/11/24(水) 08:02:23.61ID:jO3RIx+f
1000行のプログラムって初心者からすると途方もない規模のプログラムに感じるけど、慣れた人からすると当たり前な規模なのかな
2021/11/24(水) 10:22:49.14ID:9k7x+oD0
一本の文脈でプログラム書こうとすると人間は必ずワーキングメモリの限界がくるから、そんなもんだよ
自分の場合、そうやって場当たり的に書けるのは1000行くらいが限界だな
大きなプログラムを書くには、プログラムというものをトップダウンに考えて、モジュールや関数に適宜分割していくことが必要
そうすることで枝葉の細かい部分を忘れてワーキングメモリを節約できる
特にPythonの場合はJupyter使って勉強する人が多いから、プログラムの分割が身に着きにくいんだよ
2021/11/24(水) 10:39:50.61ID:kXzWnsgO
>>818
こぴぺとか
そうじゃなくても
同じ処理つらつら描いて行増えたって喜ぶのが初心者
2021/11/24(水) 10:42:31.59ID:kXzWnsgO
>819
Jupyterは慣れた人が楽するためには良いけど
あれで勉強するのは限界もあるな
Jupyterが悪いとは言ってない
あれがPython世界の全てだと勘違い認識しないようにするのが大事
2021/11/24(水) 11:34:24.45ID:q9kQZP30
Jupyterなんか、ここ5年くらいてpythonはいった人の一部がつかってるだけで、python流行り出した2005年頃から利用してるpython使ってる組み合わせは今もあまり使ってないでしょ。
2021/11/24(水) 16:15:21.36ID:uoHN98GH
今日中にあるサイトのスクレイピングコードを書かないといけなくなりました
しかしスクレイピングはしたことがありません
どのように書くのがいいのでしょうか?
恐らくpostであろうformっぽい部分にデータを入れて検索すると色々と表示される感じです
djangoだろうと思います
インプット・アウトプットが特にイメージできません
2021/11/24(水) 16:59:36.29ID:SENfXVh3
今日中には無理だから期限延ばしてもらうしかないね
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に渡して表示する感じじゃなかたっけ
2021/11/24(水) 17:40:18.98
>management>commandsディレクトリに放り込んで終い。
コマンド使わないなら↑これは必要なかったわ
全部 views.pyに書いても分けても好きにしたらいいと思う
2021/11/24(水) 19:16:52.56ID:xsp2scS+
ぼくも3ヶ月くらい前からスクレイピングの勉強始めてようやくほしいデータを物怖じせず取れるようになりましたが、自分はseleniumとlxmlに落ち着きました。

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

サイトによってはpyppeteerやseleniumじゃないととりづらいとこもあるのでselenium+beautifulsoup or lxmlをおすすめしたい
2021/11/24(水) 20:53:24.72ID:ldCMVu13
私はrequestsとseleniumと正規表現ですね
2021/11/25(木) 01:42:23.64ID:nh0ZEMSE
Ruby では、Nokogiri, Selenium WebDriver, Capybara

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

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

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

後者は1秒とかでしょう
前者は1万回試行のレベルでも1分くらいかかるべ
2021/11/25(木) 13:40:02.87ID:bDvmxdn9
最近ピストグラム流行ってるな
2021/11/25(木) 15:31:05.54ID:fS0drys5
確率はscipy.stats.berniulli.rvs(p)で求めてたけど、確かにこれを100万回繰り返すのに時間かかってますね…
リストにappendは100万回でも一瞬でした

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

誤差じゃね?
845デフォルトの名無しさん
垢版 |
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つめの要素の時にエラーが発生するようにしたいのですが、
正規表現の書き方がよくわからないです
2021/11/25(木) 21:26:14.65ID:rnpiht7q
>>841
data URIにしてopen

tempfileとかファイルに書いたほうが素直かも
2021/11/25(木) 21:43:53.79ID:fTQ24d4a
re.match('^([x.\d]|cm)+$',
848デフォルトの名無しさん
垢版 |
2021/11/25(木) 21:58:41.55ID:yEJnYkB5
>>847
だと4つめの"Size:140型(14x14cm);Color:【No.01】2枚セット"がとれてしまいます。
849デフォルトの名無しさん
垢版 |
2021/11/25(木) 22:03:38.00ID:yEJnYkB5
すみません。matchからsearchにしたら行けました!!
2021/11/25(木) 23:05:36.84ID:37B47xca
>>843,841
レスサンクス

鯖を使わず直接やりたかったので、data URIでやってみた
プレーンのままだと、改行処理とか面倒くさいので、
base64でエンコードしてやってみたらうまくいった
ただ、webbrowserモジュールを使うとWindows OSがこのプロトコルで開くことを許可しないので、
subprocess.Popenを使ってブラウザ指定(Firefox)
そしたら、ブラウザ自体もこのプロトコルで開くことがデフォルトではできないので
設定を変更して、なんとか一時ファイル経由と同じ状態で開くことができた
文字化けさせないようにするのがけっこう大変だった
ただ、ブラウザの設定をいじってまで直接やりとりに拘る必要もないのかなとも思ったよ
2021/11/25(木) 23:06:38.41ID:37B47xca
>>846
アンカ間違えちゃった
ありがとね
2021/11/26(金) 00:31:18.70ID:o6j9/HV6
>>840
そういうときの並列処理
CPUをN個準備すれば
時間は1/Nになるよ
2021/11/26(金) 02:22:22.94ID:IsarZHns
細かいけど並列計算で最後に結合するのってちゃんどi.i.d.になるんかな?
2021/11/26(金) 03:43:17.12ID:o6j9/HV6
乱数のタネを乱数にしてペッ別に始めればばiid
どっちにしても疑似乱数を使うとiidは崩れる
「疑似」だけに
問題はそこまで厳密性を求めるかどうか
2021/11/26(金) 11:18:00.20ID:JcLIlhiK
文章が崩れてるどw
意味は分かるけど
2021/11/26(金) 11:34:14.13ID:TzeTaFZ5
シードを乱数にしたら重複する可能性あるから
UUID的なやつか同時実行しない前提で時刻から生成しないと
2021/11/26(金) 19:52:15.77ID:o6j9/HV6
>>856
そこまで気にするのなら
そもそも疑似乱数をあきらめないとダメ
2021/11/27(土) 15:05:57.62ID:x+qkOb0S
classて使ったほうがいいんですか?
2021/11/27(土) 16:00:53.09ID:Ys/oz9Wu
intもlistもclassだから使わずにPythonプログラム書けるならやってみろ
2021/11/27(土) 23:41:50.77ID:x+qkOb0S
自分でclassを作ると何が嬉しいんですか?
2021/11/28(日) 00:22:44.41ID:UCS6EEgA
プログラムが大きくなったとき
管理しやすくなる
再利用もしやすくなる
ちゃんとclassを設計すればだが
2021/11/28(日) 01:00:32.66ID:5wT8eQUv
>>861
サンクス(´・ω・`)
2021/11/28(日) 01:31:06.42ID:YY1hk1pY
>>862
似たようなメソッドで機能が違うもの作るとき
少し出すだけで作れるとか

敵と自機をキャラというクラスに持たせて
画面表示や移動という共通部分は一度に設定できてそうじゃない部分を
簡単に分けられる
んで全体的少しずつ変えたい時に
一箇所変えれば両方変えられる
みたいな
864デフォルトの名無しさん
垢版 |
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()あるかわがんね!!って怒るんですが
どこで辞書型の宣言をしたらいいですか?
2021/11/28(日) 08:44:01.49ID:ieKXg54N
isinstance(dict, samples)でガードすれば通るんでないか
2021/11/28(日) 08:46:26.48ID:TS21VHmH
>>858
極力使うな
クラスは設計した人しか理解できないブラックボックス
いじるのが自分だけならいいけど
他人がメンテする可能性のあるコードにクラスは使うな
2021/11/28(日) 08:51:01.10ID:Ll5PsJvS
関数間で状態を保持したいときだけクラスを使えばいい
868デフォルトの名無しさん
垢版 |
2021/11/28(日) 09:34:35.03ID:/NNHm8tx
令和のstaticおじさん現る
869デフォルトの名無しさん
垢版 |
2021/11/28(日) 12:45:20.85ID:nfhtQiKt
>>865
assert isinstance(samples,dict)
samples.keys()

いけました。多謝
ところで
assert type(samples) == dict
は型チェッカー通らなかったんだけど、なぜですか?継承的な理由?
2021/11/28(日) 14:02:56.10ID:/OsOh/FW
windowsで
python_ide.exe /run sample01.py
ってやるとIDE起動しつついきなり実行して結果を表示して
そのあとから編集なりデバッグなりが出来るIDEかエディタってありますか
いちいちプロジェクト作ってF5押してとかやらずにできるものがいいです
2021/11/28(日) 16:14:11.68ID:UCS6EEgA
>>870
google colaboratory か?
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」とか、
実行したいプログラム・スクリプトファイル名を、引数として渡せるかも知れない

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

formにどのような値を入れるかは状況によって異なるのでその部分をまずどうするか
クラスにして__init__に書くかそれとも他にいい手段があるか
2021/11/28(日) 23:43:03.05ID:bWBMruPI
あと初歩的な質問だけど__init__(self, test):でコンストラクターを定義して例えばself.test = testと書いた
これでそのクラス内でself.testでアクセスできると思ったがselfがないと出る
何故か分かる?
2021/11/29(月) 00:15:55.62ID:wv+/7oZZ
知らんけどそのクラスメソッドの最初の引数にselfって書いてないんじゃねーの(ハナホジ)
2021/11/29(月) 00:52:02.80ID:VzPxzWHt
違う
2021/11/29(月) 01:03:24.85ID:CM7Lq9QL
インスタンスメソッドじゃなくてクラスメソッドならそうやろね
2021/11/29(月) 03:22:32.97ID:rJXFzJiz
二次元配列を三次元配列に変換する方法が分かりません
どうすればできるのでしょう?

これがやりたいこと&できないことです
https://pastebin.com/KCY5WETQ
2021/11/29(月) 03:43:11.26ID:nPCo6JIx
np.stack((array1[:-1], array1[1:]), axis=1)
2021/11/29(月) 04:07:55.72ID:rJXFzJiz
ありがとう!!
まさか一行でできてしまうとは・・・

forで回しての変換もなんとかできました
https://pastebin.com/8K9mJcCn
2021/11/30(火) 09:45:02.69ID:1rSdL9RD
三項演算子を条件式を最初に書く方法はありますか?
2021/11/30(火) 11:38:22.32ID:+4eAilPB
>>874
self って仮の名前に過ぎないから
__init__(slef, test):
とかになってても
slef.test = test
だと通る
もちろん
self.test = test
が通らない
2021/11/30(火) 11:40:43.60ID:+4eAilPB
>>881
少なくともpythonでは
条件式を先に描いた時点で三項演算子ではなくなる
2021/11/30(火) 12:05:19.58ID:1ptP5nW8
>>882
へぇそうなんだ
俺の場合はクラスの中で自身のクラスをインスタンス化してたのが良くなかったっぽい
2021/11/30(火) 12:11:27.12ID:1rSdL9RD
>>883
if elseを一行で書く方法はありますか?
2021/11/30(火) 12:35:00.71ID:PosRcxUn
条件分岐用の関数をテキトーに作ったら?こんな風に使えるように
y = ifelsefunc(x > 0, -1, 1)
2021/11/30(火) 13:18:14.90ID:1rSdL9RD
>>886
ありがとうございます
888デフォルトの名無しさん
垢版 |
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
警告がでない書き方とか分る方教えてください
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'
2021/11/30(火) 23:36:58.51ID:EeXqZSw1
警告の下にあるリンク先はよんだん?
891デフォルトの名無しさん
垢版 |
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
892デフォルトの名無しさん
垢版 |
2021/12/01(水) 11:49:27.95ID:kM+Jjoc8
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

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

クソチョンw
クソチョンはウンコを食べる糞食人種w
朝鮮人はゲリ便をじゅるじゅると
うまそうに食うw
2021/12/02(木) 13:28:11.18ID:XKNm0UTJ
beautifulsoupで<div class="box_area">の下にあるpタグの下にある全ての<span class="link_pdf">タグの下にあるaタグを取得するには例えばどう書けばいいですか?
2021/12/02(木) 13:30:55.05ID:YlIFrtYh
順番に絞ってけば取れるだろ?
2021/12/02(木) 13:51:53.14ID:k2JFy+0I
セレクタの勉強をしろ
2021/12/02(木) 14:13:40.25ID:XKNm0UTJ
>>895
これか助かる
https://gammasoft.jp/support/css-selector-for-python-web-scraping/
2021/12/02(木) 22:47:46.92ID:ap4H6lSA
typing.List、Dictって非推奨らしいけど、代わりは一体どうしたら・・
898デフォルトの名無しさん
垢版 |
2021/12/03(金) 00:05:29.70ID:/aixTtEw
ビルトインのlist、dict使えってことなんじゃね?困ることあるん?
2021/12/03(金) 01:06:36.94ID:mlmp5wts
3.9から
list[int]
とか
dict[str, int]
とか書けるようになったから要らんだろってこと
この調子でイテレータもどうにかして欲しい
2021/12/03(金) 02:36:40.94ID:XIVj35HM
>>893
下と言う表現は、あいまい

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

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

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

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

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

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

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

何か間違えたのだと思うのですが、
解説ブログやドキュメントを読んでも全く解決策がわからず困り果てています
何かご存知の方がいらしたらお願いします
2021/12/06(月) 09:06:19.91ID:1pNPp5ri
すみません、書き間違えました
runまたはpopenでexeファイルを開くと、
VScodeの画面上で、「ターミナル」にCUIが表示されます
そこにキー入力するとそのまま動作します。
2021/12/06(月) 10:11:30.79ID:+xtv5Wsa
expect相当がほしいならpexpectとか
標準モジュールだけで解決するのは面倒なのでPyPIで探すのが吉
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が必要かも
2021/12/06(月) 17:45:57.66ID:eUQmGuZl
visual studioでkeras/tensorflowのデバッグ方法でつまっています
K.sigmoid()やtf.boolean_mask()のようなバックエンド処理ばかりなのでデバッグ中に変数の中身が分かりません
今はとりあえずnumpyや独自実装で移植しながら中を見てデバッグしています
しかし問題にぶつかったとき原因が移植作業なのか元々のソースなのか切り分けができず困っています

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

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

TUI、対話型という言葉を知らなかったのですが、検索したところどうもそれらに該当するように思えます。
pexceptを使ってみようと思います。
2021/12/06(月) 20:25:32.94ID:ZoRh0Nkj
ターミナルでfor命令を1行で実行する場合、両サイドを[]で囲むじゃないですか
>>> [i for i in range(10)]
のように。この[]は、一般的になんて呼ばれていますか?
2021/12/06(月) 20:28:37.11ID:q0abD6Vl
内包表記 >>915
2021/12/06(月) 20:42:34.30ID:1jgDkimx
List comprehensions
918デフォルトの名無しさん
垢版 |
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のはずなのに、
どうしてうまく取れなかったのでしょうか?
2021/12/06(月) 23:42:47.24ID:1jgDkimx
>>> '99.460' < '130.990'
False
>>> 99.460 < 130.990
True
920デフォルトの名無しさん
垢版 |
2021/12/06(月) 23:50:20.47ID:UpeudXBw
>>918
文字列だからだよ。
921デフォルトの名無しさん
垢版 |
2021/12/06(月) 23:51:25.10ID:fS/Lj56T
>>919
>>920
ありがとうございます、
floatで数字にしたつもりだったのですが、
何か間違えてますか?
2021/12/06(月) 23:53:49.67ID:1jgDkimx
max(float(x) for x in ordered_list_xrp)
2021/12/06(月) 23:56:05.27ID:1jgDkimx
max(ordered_list_xrp, key=float)
924デフォルトの名無しさん
垢版 |
2021/12/06(月) 23:58:55.21ID:fS/Lj56T
>>922
うぉありがとうございます!
これでやってみたらちゃんと正しい最大値とれました、
文字列のリストにこんな罠あるの知りませんでした、
数字に変換するのすごい、感動しました!
2021/12/07(火) 01:52:20.23ID:904hja4x
pythonのselfについて教えてくだしあ
selfはインスタンス自身を表すってのはわかったんですが、
自分のクラスのメソッドの中でselfを関数として呼ぶと何が起こるんですか?
つまりこんな感じです

class Testclass:
 def __init__(self):
  pass

 def kansuu(self):
  self("hikisu") #←これ何してるんですか?
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つってどういう順番で何が起きてんの?
927デフォルトの名無しさん
垢版 |
2021/12/07(火) 08:26:52.55ID:KRSgdo5l
>>925
self.__call__が実行される
2021/12/07(火) 13:28:56.27ID:mOcbYYmI
>>926
内包表記のとき、表記が感覚的に逆(慣れればそうでもないけど)に感じるが
一度理解すると簡単
https://colab.research.google.com/drive/199DCLDxHgvBc752ulWDueqC7cmt2iGbd
2021/12/07(火) 15:22:45.64ID:g74FV+wu
pythonは後出しだから慣れないな
python「ここにこれを代入して。ああ、もしもこの条件だったら代入するのはやっぱりこっちね。ああ、その代入はループでしてね」
ほかの言語「次の処理をループして。もしもこの条件だったら、ここにこれを代入、条件違ったらこっちを代入」
2021/12/07(火) 15:32:47.34ID:904hja4x
>>927
ありがとうございました!
931デフォルトの名無しさん
垢版 |
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側が悪いのかもしれませんが。。
2021/12/07(火) 18:47:54.90ID:g74FV+wu
csvの文字列にした方がいいよ。簡単にやるならこんな感じ
送信側はcsv文字列で送信
受信側は1文字ずつメモリに貯め込んで改行コード検出で、そこまで貯まった文字列が数値と区切り文字だけで構成されてて区切り数が正しかったら正規なデータとして処理
受信側テストはターミナルソフトで手入力したcsv送って処理できたらおk
933デフォルトの名無しさん
垢版 |
2021/12/07(火) 19:57:20.96ID:1b+mdTOc
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

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

クソチョンw
クソチョンはウンコを食べる糞食人種w
朝鮮人はゲリ便をじゅるじゅると
うまそうに食うw
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 となってしまいます

何かよい方法はありますか
2021/12/12(日) 02:28:54.11ID:LDYHaH+j
objA = None
と上のほうに書いておけ
2021/12/12(日) 02:58:35.01ID:neH/oCpw
>>935
回答どうもです

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

ありがとうございました
937デフォルトの名無しさん
垢版 |
2021/12/12(日) 03:00:27.68ID:lyarTocF
>>934
try: objA
except NameError:
objA = class.classA('nameclassA')
2021/12/12(日) 03:42:09.06ID:neH/oCpw
>>937
なるほど例外で対処する方法ですね
ありがとうございます
こちらでの対処も考えてみます
2021/12/12(日) 12:38:50.06ID:0NBntfzw
メタプログラミングするレベルでこんなのわからんのも変
十中八九設計がおかしい
2021/12/12(日) 14:44:59.69ID:qWcO2iK8
>>934
まあ正解は>>935だと思うが文字通り
> Pythonで「オブジェクトが存在しなかったら
と言うなら
if('objA' not in globals() and 'objA' not in locals()):
かな
2021/12/12(日) 16:17:39.25ID:GOu/cbbC
サーバー側のタイムゾーンはUTCという前提で、
それをフロントエンドで日本時間表示することになりました
しかしその表示に使うライブラリがawareを受け付けなくて
nativeでないといけないのです つまり
awareなUTC時間のdatetime型 → nativeなJST(Asian/Tokyo)時間のdatetime型
への変換をすることになったのですが
これを一発で変換するようなメソッドって
標準はもちろんpytzとかにも用意されてませんよね?
一度timestampに変換してtimedeltaにして演算
という認識で良いのでしょうか?
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だけを抜き出す方法が分かりません
2021/12/12(日) 17:34:26.79ID:0NBntfzw
>>941
dt.replace(tzinfo=None) + dt.utcoffset()
力技なのはかわらず
2021/12/12(日) 17:35:49.84ID:a4cuZ/Mw
1. scriptエレメントを全部取得する
2. ↑で取得したscriptエレメントのsrcを読み取る
3. ↑で読み取ったsrcにua〜が含まれてるかチェックする
って流れで考えれば分かりやすいんじゃない?
2021/12/12(日) 17:42:52.14ID:I5fuTkfi
>>942
1:BeautifulSoupを使ってURL全体を取得する
2:urllib.parseを使って解析
3:今回の場合はquery部分で入ってくるので、それを取得する
https://docs.python.org/ja/3/library/urllib.parse.html

そのURLの形式で固定ならこれで行けるんじゃない?
https://ideone.com/yoHzOG
2021/12/12(日) 17:43:33.09ID:Hsntocf/
URLのクエリ文字列(クエリパラメータ)を取得。
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)
2021/12/12(日) 22:55:58.59ID:+1Oq/K+R
res.queryが存在するならprintするっていう風にすればいいんじゃね
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)
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のバグではありませんか・・?
仕様であれば何かメリットとかあるのでしょうか?
2021/12/14(火) 21:04:19.38ID:70QYvgE2
a1[0]は(int32の)1でしょ?そしてa2[0]も(intの)1
int32とintぐらいの差でfalseになると色々困る
2021/12/14(火) 21:30:31.61ID:lu87KQQd
コード追ってはないけどnumpy側でそういう風に__eq__実装してるだけ
なんなら
>>> a1 == a2
array([ True])
になるしうれしいけど変だわな
2021/12/15(水) 11:10:32.17
>>951-952
なるほど
pandasもnumpy int64なので
dataframeを何かしらのAPIに投げるときに
そのままjson.dumps使えたらなぁと思いましたが
とりあえずはint32変換して成型した方がよさそうですねありやした
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とすべき、なのでしょうか
2021/12/17(金) 10:09:24.99ID:Ufm8xgDf
世の中のWinアプリ以外のソースはほぼLFだし
コーディング用途にLF扱えないエディタの出番はなくない?
それかハマりどころあるけどGit管理でautocrlf活用するか
2021/12/17(金) 11:03:16.89ID:AcAuqy7R
基本的はLFで揃えとくべき
それで困る状況がある場合だけautocrlfで対処
2021/12/17(金) 13:32:20.53ID:fkpshCq+
Windowsがメインだけど、シバンは使う、改行はLF
エディタ(NPP)でもアドオンつかって、保存時にLFで自動で保存(問い合わせ)できるようにしている
958デフォルトの名無しさん
垢版 |
2021/12/17(金) 16:27:15.20ID:6e8bb+xR
LF以外の選択肢考えたことなかったわ
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
2021/12/17(金) 23:25:03.55ID:87jtAeRP
>>958
os/9とかMac osがcrだよ
2021/12/17(金) 23:45:19.54ID:Ufm8xgDf
初心者スレにそんな現役じゃない例あげてなにがしたいん
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で見つかりましたがものすごく処理が遅かったので正しいやり方では無さそうです。
963デフォルトの名無しさん
垢版 |
2021/12/18(土) 00:37:48.68ID:mmV8s4af
applyを2回呼ぶのは?
2021/12/18(土) 01:52:04.79ID:mxS9DQCX
それが一番簡単ですが冗長な感じと思ったので…
でも、result_type='expand'も処理時間が遅いようなので、やはり複数回呼び出す方法にします。
2021/12/18(土) 02:01:17.24ID:iUN/Cy1s
df[‘B’], df[‘C’] = zip(*df['A'].apply(lambda x: ( x * 2, x / 2)))
2021/12/18(土) 02:09:06.48ID:iUN/Cy1s
df[[‘B’, ‘C’]]= df['A'].apply(lambda x: (x * 2, x / 2)).to_list()
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ディレクトリは親ディレクトリであることを読み取れず、それも困ってます

上記のような構成にしたとき、このような問題を解決する方法を教えてください
2021/12/18(土) 23:32:07.96ID:/Zq/GLbL
from . import moduleB
2021/12/18(土) 23:35:58.62ID:rJsqD2PP
>>968
回答ありがとうございます

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

ありがとうございました
2021/12/19(日) 02:23:46.60ID:xFmqbcza
>>962
applyを使わないけど、
df['B'] = df['A'] *2
じゃダメ?
971デフォルトの名無しさん
垢版 |
2021/12/20(月) 11:22:53.74ID:sxGOmJ2J
> お前は毎朝起きるたびに俺に負けたことを思い出すよ^^

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

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

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

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

ライブラリはNumpyとPandas
2021/12/26(日) 01:16:59.54ID:bjcghV5B
32ビットintだと21億までしか表現できないから適当な数(ルールはあるが面倒だからここでは触れない)に置き換えられてる
64ビットintにすれば置き換えされない
988986
垢版 |
2021/12/26(日) 11:08:42.45ID:+UpYRQsi
解決しました。有難う
intにもビット指定があったんすね
2021/12/26(日) 13:37:12.67ID:0SXvw2xa
>>972これなんですけど>>973をやって最新にしても駄目でした。
beautifulsoupは難しいですね
困った
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)

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

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

ここらはいいガイド文章を知らないので知ってる人に紹介してほしい
2021/12/26(日) 23:35:43.44ID:kGCGxR6+
うめ
2021/12/26(日) 23:35:58.11ID:kGCGxR6+
pass
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を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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