Pythonのお勉強 Part54 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
A,B,C(改行) X,Y,Z(改行) CSV だと、列区切りにカンマ、行区切りに改行を使うから、 1行ずつしか読み書きできない 全部の行をまとめると、行区切りがなくなる。 A,B,CX,Y,Z Javaエンジニアです コード量少なく済むってまじですか? >>604 全部一気に読みこむと改行て消えるんか? >>603 json, pickle, sqlite3好きなの選べ ●●●宇宙の外側に何があるのか?●●● http://jbbs.livedoor.jp/bbs/read.cgi/stud ▲y/3729/1069922074/84-87 この掲示板(万▲有サロン)に優秀な書き▲込みをして、総額148万円の賞金をゲットしよう!(*^^)v http://jbbs.livedoor.jp/stu ▲dy/3729/ →リンクが不良なら、検▲索窓に入れる! >>608 改行はあるかも知れないけど、 その改行をすべて拾っていかないと、1行ずつ処理できない >>603 とりあえずCSV処理するときにsplitだのstrtokだの使うな。大人しくcsvモジュール使え。 エスケープシーケンスどころか空セルにすら対応できなくなるから。 なんでわざわざライブラリあるのに自分で書こうと思うのか分からん >>603 >>> csv_raw_data = """hoge,1,10,fuga apple,2,20,pineapple strawberry,3,30,mango""" >>> >>> print(csv_raw_data) hoge,1,10,fuga apple,2,20,pineapple strawberry,3,30,mango >>> >>> csv_data = [[int(col) if col.isdigit() else col for col in row.split(',')] for row in csv_raw_data.split('\n')] #数字の文字列はintに変換して2次元リスト化 >>> csv_data [['hoge', 1, 10, 'fuga'], ['apple', 2, 20, 'pineapple'], ['strawberry', 3, 30, 'mango']] >>> >>> [row[1] for row in csv_data] #2列目のデータ抜き出し [1, 2, 3] >>> >>> new_col_1 = [111,112,113] #2列目のNEWデータ >>> new_csv_data = [[new_col_1[row_idx] if col_idx==1 else col_data for col_idx, col_data in enumerate(row_data)] for row_idx, row_data in enumerate(csv_data)] >>> new_csv_data [['hoge', 111, 10, 'fuga'], ['apple', 112, 20, 'pineapple'], ['strawberry', 113, 30, 'mango']] >>> >>> new_csv_raw_data = '\n'.join([','.join([str(col) for col in row]) for row in new_csv_data]) #intはstrに変換して文字列化 >>> print(new_csv_raw_data) hoge,111,10,fuga apple,112,20,pineapple strawberry,113,30,mango >>> >>609 がすすめるjsonは癖があるし、pickleはバイナリデータだからdumpしないと読めないし編集できないし sqlite3はしらんけども・・、csvのデータを扱うなら>>613 の言うようにcsvモジュール使うのがベストだと思う しかし、>>603 の質問を考察するに特殊なcsvを扱うわけではなく 自分で作った2次元リストの保存にcsvにするというだけなのだから>>618 でいいと思う(csvモジュール勉強するのめんどいじゃん) さらに>>618 は自由にカスタマイズ可能、例えば各列の先頭をそろえるためにスペースを入れるとかなんとか うーん、>>618 がベストアンサーであると確定してしまったね strにカンマとタブとスペースと空文字と空白と改行が以下略 次に値域を尋ねるべきだった フォーマットについて話すのはそれからで良かった (自分が)使えない事を世間では「クセがある」と言うんやで 覚えとき csvモジュールの使い方覚えるのさえ面倒くさがる雑魚がpython、、、 雑魚にも難しいことができるように言語は進歩してきた もっと雑魚の言い分に耳を傾けろおら >>603 おいっ! すごい方法を思いついちまった、天才かもしれん 2次元リストをstr()で文字列化して、それをファイルに保存 データを復元するときは、exec("value_name " + "=" + "ファイルから読み込んだ文字列”) >>> data = [['hoge', 1, 10, 'fuga'], ['apple', 2, 20, 'pineapple'], ['strawberry', 3, 30, 'mango']] >>> >>> import re >>> save_data = re.sub(r'(\],)','],\n', str(data)) #ファイル直接見た時に見やすいように改行挿入 >>> print(save_data) [['hoge', 1, 10, 'fuga'], ['apple', 2, 20, 'pineapple'], ['strawberry', 3, 30, 'mango']] >>> >>> exec("value_name" + "=" + save_data) >>> print(value_name) [['hoge', 1, 10, 'fuga'], ['apple', 2, 20, 'pineapple'], ['strawberry', 3, 30, 'mango']] >>> execよりevalの方がいいわ安全だし >>> value_name = eval(save_data) >>> print(value_name) [['hoge', 1, 10, 'fuga'], ['apple', 2, 20, 'pineapple'], ['strawberry', 3, 30, 'mango']] >>> どんな言語を使ってプログラムできても所詮俺たちはコピペ職人に過ぎない そう卑下するな コピペでも職人の域に逹してるなら大したもんだ たくさんレスありがとさんです pickleとかpandasとか知らなかったので大変勉強になりました。今回はファイルを直接編集する道も残しておきたかったのでcsvにしました。リードもライトもfor文がなくなってすっきりしましたw Pythonは貴方にとって何? 1. 飯の種 2. 仕事の道具 3. 趣味のツール 4. 楽しいおもちゃ >>631 csvモジュール使ってみたけどコレなかなか良いよ 数字の文字列を自動でintに変換してくれるようなことはしてくれないみたいだけど、なかなか良いよ >>> import csv >>> csv_data = [['hoge', 1, 10, 'fuga'], ['apple', 2, 20, 'pineapple'], ['strawberry', 3, 30, 'mango']] >>> >>> with open('csv_test.csv', 'w', newline='') as csvfile: s = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONE) s.writerows(csv_data) >>> with open('csv_test.csv', newline='') as csvfile: s = csv.reader(csvfile, delimiter=',') read_csv_data = [[int(col) if col.isdigit() else col for col in row] for row in s] >>> read_csv_data [['hoge', 1, 10, 'fuga'], ['apple', 2, 20, 'pineapple'], ['strawberry', 3, 30, 'mango']] >>> ちょっと待って、ちょっと待ってぇ、>>618 と比較してみようか >>> csv_data = [['hoge', 1, 10, 'fuga'], ['apple', 2, 20, 'pineapple'], ['strawberry', 3, 30, 'mango']] >>> >>> with open('csv_test.csv', 'w') as f: f.write('\n'.join([','.join([str(col) for col in row]) for row in csv_data])) 57 >>> with open('csv_test.csv') as f: read_csv_data = [[int(col) if col.isdigit() else col for col in row.split(',')] for row in f.read().split('\n')] >>> read_csv_data [['hoge', 1, 10, 'fuga'], ['apple', 2, 20, 'pineapple'], ['strawberry', 3, 30, 'mango']] >>> うーん、こっちもナウイよね >>605 近寄るな 頭が悪くなる >>623 微妙に方言がある (方言は置いといても)CSVよりマシだと思う 方言つか、JSONの仕様に従わないものはそもそもJSONじゃない。 まあツールによっては読み込み時に末尾カンマを許容していたりする場合があるけど、 それも癖というほどのものでもないだろう。 bottleってなんでHTMLの拡張子が.tplなんだろう?pycharmでシンタックスハイライトできないじゃん Pythonチュートリアル読み終えたんだけど何作ればいい? >>631 オレオレcsvモジュールcsv_normal.py作ってみたよ(https://ideone.com/E2XicF ) フィールドはカンマで区切り、行は改行で分けるノーマルなcsvを扱うモジュールだよ ※フィールドの左右の空白は無視するよ(stripするよ) ・フィールドは見やすいように文字幅を揃えて保存するよ ・intに変換できる文字列フィールドはintに変換するよ ・floatに変換できる文字列フィールドはfloatに変換するよ ・列の追加関数と削除関数を用意しているよ そんなRFCにも対応できてないゴミをわざわざ作って公開してなにが楽しいのやら。 上にも書いたけど、それpandasで遥かに高度なことできるよ pd.read_csvのdtypeにフィールド名と型の組み合わせの辞書を渡すだけだしastypeメソッドで特定の要素だけ後から型変えれるし >>648 プログラマレベル1から2に上がったくらいだと 謎の全能感を持ってるから何でも楽しいのよ むしろ必要な機能だけを実装する低機能モジュールの試みなのでは まあ>>647 が役に立つかどうかは知らんけど批判しかできない>>648-649 よりマシ 肯定意見しか認めないのもどうかと それでも批判意見に反対するなら批判内容まで触れるべきと思います >>649 はともかく>>648 は批判意見でも何でもないただの難癖だろ >>653 例え無駄でもがんばった子を褒めるのは小学校の先生までで十分です。 公式に出てるcsvモジュールのサンプルコードをコピペ改変してデータを読み書きするまでどんなノロマでも5分もかからない作業なのに半端な独自実装を書く奴はただのアホです。 どんなに頑張ったって1%の天才と99%のコピペ達なんだ 虚勢を張ったコピペ職人 自覚を持ったコピペ職人 僕はね自覚を持ったコピペ職人になりたいんだ ふぅー 落ち着いたか、、大興奮のレスバトルだったね、見ててワクワクしましたわ さっきまでのワイの感想「今日はワイがスレの主役やでぇー、 キャッ、イケメンが擁護してくれてはるー、イケメン頑張れっ!」 あとは>>631 の感想があれば満足やで、あっちなみにワイは1%の天才側やでぇコピペしてへんから あと21行目とコメントがいまいちなのと、26行目のコメントが間違ってたから修正な 21行目 # #csv_dataのインデックス4の列に[1, 2, 3, 4, 5.9, 12, 15, 16]を追加 ↓ # #csv_dataのインデックス4に列[1, 2, 3, 4, 5.9, 12, 15, 16]を追加 26行目 # #csv_dataのインデックス4の列に[1, 2, 3, 4, 5.9, 12, 15, 16]を追加 ↓ # #csv_dataのインデックス1に列[1, 2, 3, 4, 5.9, 12, 15, 16]を追加 検索しても引っかかんないんだけどこのコピペどの板発祥なん? まぁ口だけよりは物作ってるやつの方が有能ではあるぞ 公式のCSVモジュールも最初はこんな感じだったんだろうか うぉおおコードがキモいよぅ…… 2次元配列を確保していじるあたりの雰囲気がC++っぽくてPython的ではない というかクラス使えと def _csvfield2str(csv_data): """ csvのフィールドを全て文字列に変える """ return [[str(field).strip() for field in row] for row in csv_data] この辺がキモすぎる コメント一行にしたいし二重for inを崩したいのと同じような関数が並んでいるのをどげんかしたい その原因はこの関数か? def _str2int(string): なんでcsv_readで重要そうな型の概念がこんな奥底にあるんだよ というかこの関数必要なのか >>667 おっ、コード見てくれるなんて有り難いね 状態は保持しないからクラスはいらないかな、デリミタをカンマ以外に 選べるようにする場合はデリミタ保持しないとアレだからクラスにするけど 関数のコメントは増えるかもしれないし”””が好みだね エディタの色分け表示の関係もあって”””使ってるけど、こだわりはそんなにない 内包表記の二重forは全然抵抗無いんだけど、csvは2次元配列だし、むしろ分かりやすいかと _str2int関数とかは内包表記で使うために用意した 文字列をintにする場合、isdigit()で変換可能かどうかチェックしてというのを三項演算子で書いてたけど 長くなるし分かりにくいし、’ 10 ’のような文字列だとisdigit()でFalseになるからisdigit()する前に 文字列をstrip()しないとだし、floatはどうすんの?というアレがアレでこうなったというわけです ’2e+3’とかもfloat変換に対応すると判定がわけわかめなんで、一度float変換してみてエラーならダメなのねって感じです まぁ、道具として使うなら、想定通りに動きゃいいけどな 業務に使わせてもらっていいですか?! あとコメント行で俺が作ったことにして書き換えたいのですが さすがに冗談だろ。 業務のコードにこんな独自実装なゴミ書いたら小一時間説教される。ていうか、俺はしたことある。 c++でstrtok使ってcsv読んでトラブル起こしたアホを。 ふぅー 落ち着いたか、、大興奮のレスバトルだったね、見ててワクワクしましたわ さっきまでのワイの感想「今日はワイがスレの主役やでぇー、エェ? 業務使用の話まで来てるぅ 出典元はワイにしとけやガハハハ」 >>678 ジーンズはリーバイス以外履くな 靴はPuma ここからだな >>677 ガハハじゃねーよ 朝一で新小岩駅で自殺しろゴミが 俺も書いてみた 実用性のない気持ち悪くいコードを書いたつもり import functools save=lambda data:'\n'.join(map(','.join,map(functools.partial(map,str),data))) def foo(s): try:return int(s) except ValueError:return s.strip() load=lambda s:[list(map(foo,s.split(',')))for s in s.splitlines()] >>647 csv_normal.pyがバージョンアップしたよ(https://ideone.com/78qd00 ) ・フィールドに日本語が混じっていても位置ズレしないよ ・csvファイルの読み書きにencoding指定できるようにしたよ pandasってフィールドに日本語混じってると列が位置ズレして表示されるでしょ? よく知らんけど、ある意味pandas超えたわガハハハ >>682 csv_normal.pyが更にバージョンアップしたよ(https://ideone.com/E3CpT8 ) ・クラス化したよ モジュール.関数でいちいち呼び出すのめんどくせーと感じ>>667 ご指摘の通りクラス化したよ、快適になったよ 十分楽しんだので、これで最後にするよ 自ら進化を止めるとき、それは己の負けを意味するのだ。 負けるな>>683 strtokは非スレッドセーフだったよな? マルチスレッド環境でアホやったのかな Excel のCSV でも、日本語UTF-8 を扱えないのに、 文字化けしないのは、Ruby 以外では初めてかも すごい技術力! 車輪を作る仕事は特殊性癖の人がやればいい 普通の人はそれをどう使うかに頭使った方がいい マはデータ管理しやすい様に隙間(行間)を無くすが、事務は見やすい様に適度に謎の改行を 入れるから、csvファイルは型を崩さずに計算して出力した方が良い。 クラスのプライベートなインスタンス変数定義するとき、アンダースコア1つか2つどっち使ってる? 今すごい悩んでる。 privateなら2つ protectedなら1つ kivyの質問いいかな? AsyncImageってので画像表示させてるんだけど、py側から渡すファイル名が同じだと画像の中身が変わっていても表示が変わらない。どうもcacheから読み込んでるらしい。kivyファイルの方に、 . AsyncImage: . nocache: True . source: root.file_name とかやってみたけどダメだった。わかる人いたら教えてくらさい 世界の株価URL (http://sekai-kabuka.com/ )から、 日経先物ミニの価格をスクレイピングしたいのだが、出来ない。 以下のコードで見ても価格が取れてない。 どうしたらいい? XPathや正規表現で取れるかな? 誰か分かる人、お願いしますm(__)m 開発者ツールで見ると、価格が変わるとspanタブが閉じてしまうことと関係あるのかな? import requests,bs4 from bs4 import BeautifulSoup URL = "http://sekai-kabuka.com/" ; res = requests.get(URL) print(res.status_code) r = res.content#html soup = BeautifulSoup(r, "html.parser") print(soup) ブラウザの右クリックメニューで、要素の検査をすれば、何のタグか分かる >>691 ヤッパリそうなるよね。 けど標準ライブラリのソース見たら2つ使ってるものがあまりなかったから質問してみた。 >>694 JavaScriptで後読みっぽいから、bs4じゃ無理 seleniumならいける >>683 csv_normal.pyがメジャーバージョンアップしたよ(https://ideone.com/mD1p2q ) ・関数がメッチャ増えたよ ・メソッドがメッチャ増えたよ 十分楽しんだので、これで最後にするよ 楽しんでもらえて本望じゃわい てか定期的なネタ投下も疲れる by 603 anaconda使ってるけどライブラリをcondaでインストしたりpipでインストしたりで混合してる 今は普通に動いてるけど多分後で困るよね? 質問です: anaconda/Jupyterで勉強していましたが、 どうしても理解できない文法とか調べるのがつらくてIDEに頼ろうと思います。 PyCharmをインストール実行できたのですが、 anacondaで作った環境との連携方法がどうしてもわかりません。 連携して使うんですよね? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる