文字列処理 / Python 06

A10e41b0a61d59f2258d7f6172c33479?s=47 kaityo256
November 05, 2019

文字列処理 / Python 06

プログラミング基礎同演習06

A10e41b0a61d59f2258d7f6172c33479?s=128

kaityo256

November 05, 2019
Tweet

Transcript

  1. 1 ファイル操作 プログラミング基礎同演習 慶應義塾大学理工学部物理情報工学科 渡辺 2019/11/5 #プロ同演習

  2. 2 dic = {"Apple": 158, "Banana": 198, "Orange": 100} for

    k, v in dic.items(): print(k, v) 辞書のキーと要素一覧を表示するプログラム Apple 158 Banana 198 Orange 100
  3. 3 dic = {"Apple": 158, "Banana": 198, "Orange": 100} for

    k, v in dic.item(): print(k, v) --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-1-84de43249ab3> in <module>() 1 dic = {"Apple": 158, "Banana": 198, "Orange": 100} ----> 2 for k, v in dic.item(): 3 print(k, v) AttributeError: 'dict' object has no attribute 'item' 間違っているコード エラーメッセージ どこでエラーが起きたか 何が起きたか 「dictというオブジェクトには`item`という属性(attribute)は無いよ」 `items`のタイポ
  4. 4 dic = {"Apple": 158, "Banana": 198, "Orange"; 100} for

    k, v in dic.items(): print(k, v) 間違っているコード File "<ipython-input-3-77fbab45f938>", line 1 dic = {"Apple": 158, "Banana": 198, "Orange"; 100} ^ SyntaxError: invalid syntax エラーメッセージ どこでエラーが起きたか 何が起きたか 「Python文法として間違っている(Invalid Syntax)よ」 コロン「:」とセミコロン「;」を間違えていた
  5. 5 "file0.dat"から"file9.dat"までの文字列リストを作る def makefilelist(): a = [] for i in

    range(10): filename = "file{}.dat".format(i) a.append(filename) return a ['file0.dat', 'file1.dat', 'file2.dat', 'file3.dat', 'file4.dat', 'file5.dat', 'file6.dat', 'file7.dat', 'file8.dat', 'file9.dat'] return文のインデントが間違っていると…… def makefilelist(): a = [] for i in range(10): filename = "file{}.dat".format(i) a.append(filename) return a ['file0.dat'] 関数が作るブロック for文が作るブロック for文が作るブロック 関数が作るブロック
  6. 6

  7. 7 ファイルシステム ファイルの読み書き CSVファイルの扱い

  8. 8 ファイルやフォルダ ストレージ ユーザ ファイルシステム ストレージにファイルやフォルダといった構造を与え、使いやすくするシステム

  9. 9 ストレージ 0 1 2 3 4 5 6 7

    8 9 ブロック番号 ストレージは「ブロック/クラスタ」という単位でデータの読み書きをする 4KB このまえの報告書は0番ブロックに保存してて、 スライドデータは2番と3番と5番に分けて保存してて、 いま16KBのファイルを保存したいから、 1,4,6,7の 4ブロック使って…… 「どのブロックに何があるか?」を人間が管理するのはとても大変 ブロックの使用状況を管理してくれるのがファイルシステム
  10. 10 ストレージ どのファイルがストレージのどこにあるか? ファイルサイズはどれくらいか ファイルは誰のものか? ファイルに最後にアクセスしたのはいつか? このような情報を メタデータと呼ぶ 管理領域 (メタデータ)

    データ領域 ファイルシステムは、管理領域とデータ領域に分かれている
  11. 11 ext4, xfs NTFS Windowsで使われている。 Linuxで使われている。 ※他にも多数のファイルシステムが存在する APFS FAT32, exFAT

    Macで使われている USBメモリ等で使われている 今日はこれを説明します
  12. 12 ext4 (Fource Extended File System) Linuxのファイルシステム ext→ext2→ext3→ext4と発展してきた ファイルやディレクトリをinodeという構造で管理する

  13. 13 inode ストレージ 0 1 2 3 4 5 6

    7 8 9 ブロック番号 inode番号 0 1 ファイルやディレクトリには「inode番号」という一意な番号が振られる 一つのinode番号にinodeが対応する inodeはファイルサイズやブロック番号を保持 inodeはファイル名情報を保持しない
  14. 14 ディレクトリのinode inode番号 ファイル名 10091 . (自分自身) 38467 .. (親ディレクトリ)

    3414 test.txt 5831 data.dat ファイル名とinode番号の対応は「ディレクトリ」が保持する なぜinodeではなくディレクトリがファイル名を持つか? 複数のファイル名が同じinode番号を共有できる(ハードリンク) (おそらく)ファイルリスト取得の高速化のため
  15. 15 OS プロセス ファイルシステム ファイル オープン要求 接続先検索 test.txtに書き込める ようにしてください お調べしますので

    お待ちください ありがとう! 14番でおつなぎし ました ファイルシステム 内線番号14 (ファイルディスクリプタ) ファイルを開く:ファイルの場所を問い合わせて、回線をつなぐ ファイルを閉じる:回線を切る
  16. 16 このファイルを 保存してください 書き込みが無事に 終わりました 待たされている間 何もできない ストレージ ストレージへの書き込みは一般に遅いので、書き込み完了を待つとストレスがたまる

  17. 17 このファイルを 保存してください 書き込み内容を 預かりました ストレージ 書き込み内容をいったんメモリに預かって、あとで書き込む ※「デバイスの安全な取り外し」が必要な理由

  18. 18 Pythonでファイルを開くにはopen関数を用いる f = open("filename") # テキストモードかつ読み込み用に開く f = open("filename","rt")

    # テキストモードかつ読み込み用に開く f = open("filename","w") # テキストモードかつ書き込み用に開く f = open("filename","a") # テキストモードかつ追記用に開く open(ファイル名, モード文字列) モード文字列 (以下の組み合わせ) 'r' 読み込み用に開く(デフォルト) 'w' 書き込み用に開く 'a' 追記用に開く 't' テキストモード(デフォルト) 'b' バイナリモード
  19. 19 f = open("test.txt") for line in f: print(line) ファイルを読み込む方法はいくつかあるが

    ファイルオブジェクトにfor文を回すのが簡単 lineに一行ずつファイルの内容が渡されてくる
  20. 20 f = open("filename") # ファイルを開く f.close() # ファイルを閉じる openで開いたファイルは、closeで閉じることができる

    ※ 閉じ忘れてもプログラム終了時に閉じてくれるが、マメに閉じることが望ましい with構文を使うと、withブロックを抜ける際に自動で閉じる with open("test.txt") as f: for line in f: print(line) with構文はファイル操作だけでなく「後片付け」が必要なものに使われる
  21. 21 !wget https://kaityo256.github.io/python_zero/file/colortv.csv Google Colab上でダウンロードを実行 GitHubのサーバ GitHubサーバに とってのローカル Google Colabのサーバ

    Google Colabサーバに とってのローカル GitHubから Google Colabに ダウンロード データファイル データファイル プログラム Google Colabのローカルで読み書き
  22. 22 CSVとは Comma-separated Valuesの略 コンマ「,」で値が区切られたテキストファイル タブ文字で区切られたファイルもCSVと呼ばれる 学籍番号,名前,成績 1, 成績太郎, B

    2, 成績花子,A 3, 落第次郎,D 4,出木杉英才,S ....
  23. 23 学籍番号,名前,成績 1, 成績太郎, B 2, 成績花子,A 3, 落第次郎,D 4,出木杉英才,S

    .... with open("data.csv") as f: for line in f: a = line.split(",") コンマ区切りを「バラす」のにはsplitを使う line line.split(",") ['2', '成績花子', 'B¥n'] 改行が含まれることに注意
  24. 24 どこにどれだけ人が住んでいるかを可視化したい 必要な情報の形は「経度, 緯度, 人口」 手に入るのは「人口データ」「位置データ」

  25. 25 我々が持っている情報 ... 01100,札幌市,1884939 01101,札幌市中央区,206252 01102,札幌市北区,273577 01103,札幌市東区,252688 01104,札幌市白石区,203579 ... 市区町村の人口データ

    市区町村の位置データ ... 01100,札幌市役所,43.06197200,141.35437400 01202,函館市役所,41.76871200,140.72910800 01203,小樽市役所,43.19075267,140.99460538 01204,旭川市役所,43.77079900,142.36479800 01205,室蘭市役所,42.31520400,140.97378400 ... 我々が欲しい情報 141.354374,43.061972,1884939 140.729108,41.768712,284910 140.994605,43.190752,135500 ...
  26. 26 ... 01100,札幌市,1884939 01101,札幌市中央区,206252 01102,札幌市北区,273577 01103,札幌市東区,252688 01104,札幌市白石区,203579 ... ... 01100,札幌市役所,43.06197200,141.35437400

    01202,函館市役所,41.76871200,140.72910800 01203,小樽市役所,43.19075267,140.99460538 01204,旭川市役所,43.77079900,142.36479800 01205,室蘭市役所,42.31520400,140.97378400 ... 都市コード(CITY CODE) 二つのデータには「都市コード」という共通の項目がある 方針: ・都市コードと人口の対応表を作る ・対応表を見ながら座標と人口を対にして出力する
  27. 27 d_pop = {} with open("population.csv") as f: for line

    in f: code, _, pop = line.split(",") d_pop[int(code)] = int(pop) ... 01100,札幌市,1884939 01101,札幌市中央区,206252 01102,札幌市北区,273577 01103,札幌市東区,252688 01104,札幌市白石区,203579 ... "01102,札幌市北区,273577" line ["01102","札幌市北区","273577"] split pop code 行毎にsplitでバラして、都市コードと人口を取得して辞書に突っ込む d_pop[code] = pop int 市区町村の人口データ
  28. 28 ... 01100,札幌市役所,43.06197200,141.35437400 01202,函館市役所,41.76871200,140.72910800 01203,小樽市役所,43.19075267,140.99460538 01204,旭川市役所,43.77079900,142.36479800 01205,室蘭市役所,42.31520400,140.97378400 ... "01100,札幌市役所,43.06197200,141.35437400" line

    ["01100","札幌市役所","43.06197200","141.35437400"] split int float code y x x, y, d_pop[code] 欲しい情報
  29. 29 年 カラーテレビの普及率 年 平均寿命 テレビの普及率 平均寿命

  30. 30 dfコマンドやstat、lsコマンドを使ってinode番号を実際に見てみる