Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

3 31 dic = {"Apple": 158, "Banana": 198, "Orange": 100} for k, v in dic.item(): print(k, v) --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) in () 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`のタイポ

Slide 4

Slide 4 text

4 31 dic = {"Apple": 158, "Banana": 198, "Orange"; 100} for k, v in dic.items(): print(k, v) 間違っているコード File "", line 1 dic = {"Apple": 158, "Banana": 198, "Orange"; 100} ^ SyntaxError: invalid syntax エラーメッセージ どこでエラーが起きたか 何が起きたか 「Python文法として間違っている(Invalid Syntax)よ」 コロン「:」とセミコロン「;」を間違えていた

Slide 5

Slide 5 text

5 31 "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文が作るブロック 関数が作るブロック

Slide 6

Slide 6 text

6 31

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

10 31 ストレージ どのファイルがストレージのどこにあるか? ファイルサイズはどれくらいか ファイルは誰のものか? ファイルに最後にアクセスしたのはいつか? このような情報を メタデータと呼ぶ 管理領域 (メタデータ) データ領域 ファイルシステムは、管理領域とデータ領域に分かれている

Slide 11

Slide 11 text

11 31 ext4, xfs NTFS Windowsで使われている。 Linuxで使われている。 ※他にも多数のファイルシステムが存在する APFS FAT32, exFAT Macで使われている USBメモリ等で使われている 今日はこれを説明します

Slide 12

Slide 12 text

12 31 ext4 (Fourth Extended File System) Linuxのファイルシステム ext→ext2→ext3→ext4と発展してきた ファイルやディレクトリをinodeという構造で管理する

Slide 13

Slide 13 text

13 31 inode ストレージ 0 1 2 3 4 5 6 7 8 9 ブロック番号 inode番号 0 1 ファイルやディレクトリには「inode番号」という一意な番号が振られる 一つのinode番号にinodeが対応する inodeはファイルサイズやブロック番号を保持 inodeはファイル名情報を保持しない

Slide 14

Slide 14 text

14 31 ディレクトリのinode inode番号 ファイル名 10091 . (自分自身) 38467 .. (親ディレクトリ) 3414 test.txt 5831 data.dat ファイル名とinode番号の対応は「ディレクトリ」が保持する なぜinodeではなくディレクトリがファイル名を持つか? 複数のファイル名が同じinode番号を共有できる(ハードリンク) (おそらく)ファイルリスト取得の高速化のため

Slide 15

Slide 15 text

15 31 OS プロセス ファイルシステム ファイル オープン要求 接続先検索 test.txtに書き込める ようにしてください お調べしますので お待ちください ありがとう! 14番でおつなぎし ました ファイルシステム 内線番号14 (ファイルディスクリプタ) ファイルを開く:ファイルの場所を問い合わせて、回線をつなぐ ファイルを閉じる:回線を切る

Slide 16

Slide 16 text

16 31 このファイルを 保存してください 書き込みが無事に 終わりました 待たされている間 何もできない ストレージ ストレージへの書き込みは一般に遅いので、書き込み完了を待つとストレスがたまる

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

18 31 Pythonでファイルを開くにはopen関数を用いる f = open("filename") # テキストモードかつ読み込み用に開く f = open("filename","rt") # テキストモードかつ読み込み用に開く f = open("filename","w") # テキストモードかつ書き込み用に開く f = open("filename","a") # テキストモードかつ追記用に開く open(ファイル名, モード文字列) モード文字列 (以下の組み合わせ) 'r' 読み込み用に開く(デフォルト) 'w' 書き込み用に開く 'a' 追記用に開く 't' テキストモード(デフォルト) 'b' バイナリモード

Slide 19

Slide 19 text

19 31 f = open("test.txt") for line in f: print(line) ファイルを読み込む方法はいくつかあるが ファイルオブジェクトにfor文を回すのが簡単 lineに一行ずつファイルの内容が渡されてくる

Slide 20

Slide 20 text

20 31 f = open("filename") # ファイルを開く f.close() # ファイルを閉じる openで開いたファイルは、closeで閉じることができる ※ 閉じ忘れてもプログラム終了時に閉じてくれるが、マメに閉じることが望ましい with構文を使うと、withブロックを抜ける際に自動で閉じる with open("test.txt") as f: for line in f: print(line) with構文はファイル操作だけでなく「後片付け」が必要なものに使われる

Slide 21

Slide 21 text

21 31 !wget https://kaityo256.github.io/python_zero/file/colortv.csv Google Colab上でダウンロードを実行 GitHubのサーバ GitHubサーバに とってのローカル Google Colabのサーバ Google Colabサーバに とってのローカル GitHubから Google Colabに ダウンロード データファイル データファイル プログラム Google Colabのローカルで読み書き

Slide 22

Slide 22 text

22 31 CSVとは Comma-separated Valuesの略 コンマ「,」で値が区切られたテキストファイル タブ文字で区切られたファイルもCSVと呼ばれる 学籍番号,名前,成績 1, 成績太郎, B 2, 成績花子,A 3, 落第次郎,D 4,出木杉英才,S ....

Slide 23

Slide 23 text

23 31 学籍番号,名前,成績 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', '成績花子', 'A¥n'] 改行が含まれることに注意

Slide 24

Slide 24 text

24 31 • スクリプト言語が使えると圧倒的な 効率でテキスト処理ができる • 複数のテキストファイルを「まとめ る」するのに辞書が便利

Slide 25

Slide 25 text

25 31 どこにどれだけ人が住んでいるかを可視化したい 必要な情報の形は「経度, 緯度, 人口」 手に入るのは「人口データ」「位置データ」

Slide 26

Slide 26 text

26 31 我々が持っている情報 ... 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 ...

Slide 27

Slide 27 text

27 31 ... 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) 二つのデータには「都市コード」という共通の項目がある 方針: ・都市コードと人口の対応表を作る ・対応表を見ながら座標と人口を対にして出力する

Slide 28

Slide 28 text

28 31 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 市区町村の人口データ

Slide 29

Slide 29 text

29 31 ... 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] 欲しい情報

Slide 30

Slide 30 text

30 31 年 カラーテレビの普及率 年 平均寿命

Slide 31

Slide 31 text

31 31 年 カラーテレビの普及率 年 平均寿命 平均寿命