ITNEPPer来てくれ質問がある ID:pSuklbEZ

3以下、名無しにかわりましてVIPがお送りします:2018/11/17(土) 19:05:54.60 ID:pSuklbEZ

import urllib.request

urllib.request.urlopen("https://next2ch.net/")
 

7以下、名無しにかわりましてVIPがお送りします:2018/11/17(土) 19:15:31.26 ID:pSuklbEZ

with urllib.request.urlopen("https://next2ch.net/") as fin:
  array = [f"{line.split(":", 1)[-1].strip()}分" for line in fin]

for minute in array:
  print(minute)

9以下、名無しにかわりましてVIPがお送りします:2018/11/17(土) 19:23:30.04 ID:pSuklbEZ

訂正
with urllib.request.urlopen("https://next2ch.net/") as fin:
  text = fin.read().decode("utf-8")

array = [f"{line.split(':', 1)[-1].strip()}分" for line in text.strip().split("\n")]

12以下、名無しにかわりましてVIPがお送りします:2018/11/17(土) 19:44:46.66 ID:pSuklbEZ

urllib はモジュールで urllib.request はその中のサブモジュール (フォルダとファイルの関係)

Python における with は、「『with 節に入る際と抜ける際に必ず実行してくれ』とライブラリ側が指定したモノ」を実行させるしくみ
この使用例の場合 with から抜ける際に fin.close() が必ず実行されることが保証される

リスト内包の中身はまず in の後ろで text.strip() をした後に改行文字で分割してる
strip() しておかないと分割後の配列の末尾に空文字列が入るかもしれない

そのあと分割した各行 line を f"..." で好みの文字列に変換する
f"..." のうち {...} で囲まれた部分は普通のコードとして実行される

この例の場合 line.split(':', 1) によってまず行を ':' で分割する。ただし分割は 1 回しか行わない
で、分割した文字列たちのうち末尾の方 [-1] を選択する。

ここは [1] と書いてもいいけど行の中に ":" が仮に含まれなかった場合でも例外が飛ばないように [-1] にしてある
Errors should never pass silently. (例外は決して暗黙に見過ごされてはならない) に反しているかもしれない

14以下、名無しにかわりましてVIPがお送りします:2018/11/17(土) 19:50:48.16 ID:pSuklbEZ

Windows では python 3.7 あたりから ascii codec cant なんたらかんたらといううざいのは出なくなった、から非 Windows だと仮定して話をすると
python を実行する前に export LANG="ja_JP.UTF-8" と設定しておくといい

22以下、名無しにかわりましてVIPがお送りします:2018/11/17(土) 21:18:58.99 ID:pSuklbEZ

split("...") は "..." によって文字列を区切る
結果の配列に "..." は含まない

24以下、名無しにかわりましてVIPがお送りします:2018/11/17(土) 21:27:07.38 ID:pSuklbEZ

なお最近のグーグルはゴミサイトの検索対策に敗北してろくな検索結果を返さないが
Python は公式ドキュメントがやたらよくできてるので公式ドキュメントに行くと良い
https://docs.python.org/ja/3/library/stdtypes.html#str.split

行で分割したいときは "...".split("\n") ではなく "...".splitlines() を使うのがいいことを今知った

25以下、名無しにかわりましてVIPがお送りします:2018/11/17(土) 21:30:35.93 ID:pSuklbEZ

> ただし、text.strip().split("\n")とかは
> .split("\n")をした後、.strip()する順番だよね?


ドットで区切られた文は普通に左から右へ実行される

26以下、名無しにかわりましてVIPがお送りします:2018/11/17(土) 21:33:32.30 ID:pSuklbEZ

07:21 を "07", ":", "21" に区切りたいなら正規表現が良い

re.split(r"(:)", "07:21")

29以下、名無しにかわりましてVIPがお送りします:2018/11/17(土) 21:44:09.45 ID:pSuklbEZ

text.strip().split("\n") が単に text.split("\n") であってはいけないのは
なぜかというと
  "ちんこ\nまんこ\n".split("\n") => ["ちんこ", "まんこ", ""]
というふうに結果の配列の末尾が "" になってしまうから

text.strip() はテキストの両側から空白文字(改行文字も)を消してくれる

  "ちんこ\nまんこ\n"
    ↓ strip()
  "ちんこ\nまんこ"
    ↓ split("\n")
  ["ちんこ", "まんこ"]

ただここまでのことを全部忘れて text.splitlines() を使えばそれでよい

  "ちんこ\nまんこ\n"
    ↓ striplines()
  ["ちんこ", "まんこ"]

30以下、名無しにかわりましてVIPがお送りします:2018/11/17(土) 21:49:13.01 ID:pSuklbEZ

subject.txt はたぶん shift-jis なので decode("shift-jis") と書くべき
もしかすると decode("cp932") のほうが正確に変換されるかもしれない

32以下、名無しにかわりましてVIPがお送りします:2018/11/17(土) 22:12:07.96 ID:pSuklbEZ

Python3 の文字列はすべてユニコード、敢えていえば utf-32
文字列のエンコーディングを「使い分ける」ということはしない
すべてどれも utf-32 であってそれ以外の選択肢は存在しない

しかしそれは Python3 の中だけの話であって外部からデータを取ってくると
それは utf-8 だったり shift-jis だったりするので
Python3 の中で使用する前にそれらをデコードして utf-32 にしなければいけない


このIDをNGリストに追加する

今後このIDの書き込みやスレッドを表示したくない場合、以下のボタンをクリックしてください。
NGリストに追加

このスレッドは過去ログです。