$30 off During Our Annual Pro Sale. View Details »

ファイル操作 / Python File

kaityo256
PRO
November 08, 2022

ファイル操作 / Python File

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

kaityo256
PRO

November 08, 2022
Tweet

More Decks by kaityo256

Other Decks in Education

Transcript

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

    View Slide

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

    View Slide

  3. 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`のタイポ

    View Slide

  4. 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)よ」
    コロン「:」とセミコロン「;」を間違えていた

    View Slide

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

    View Slide

  6. 6
    31

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. 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' バイナリモード

    View Slide

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

    View Slide

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

    View Slide

  21. 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のローカルで読み書き

    View Slide

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

    View Slide

  23. 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']
    改行が含まれることに注意

    View Slide

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

    View Slide

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

    View Slide

  26. 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
    ...

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  30. 30
    31

    カラーテレビの普及率

    平均寿命

    View Slide

  31. 31
    31

    カラーテレビの普及率

    平均寿命
    平均寿命

    View Slide