Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ファイル操作 / Python File

kaityo256
November 08, 2022

ファイル操作 / Python File

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

kaityo256

November 08, 2022
Tweet

More Decks by kaityo256

Other Decks in Education

Transcript

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

    for k, v in dic.items(): print(k, v) 辞書のキーと要素一覧を表示するプログラム Apple 158 Banana 198 Orange 100
  2. 3 31 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`のタイポ
  3. 4 31 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)よ」 コロン「:」とセミコロン「;」を間違えていた
  4. 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文が作るブロック 関数が作るブロック
  5. 9 31 ストレージ 0 1 2 3 4 5 6

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

    exFAT Macで使われている USBメモリ等で使われている 今日はこれを説明します
  7. 13 31 inode ストレージ 0 1 2 3 4 5

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

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

    お調べしますので お待ちください ありがとう! 14番でおつなぎし ました ファイルシステム 内線番号14 (ファイルディスクリプタ) ファイルを開く:ファイルの場所を問い合わせて、回線をつなぐ ファイルを閉じる:回線を切る
  10. 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' バイナリモード
  11. 19 31 f = open("test.txt") for line in f: print(line)

    ファイルを読み込む方法はいくつかあるが ファイルオブジェクトにfor文を回すのが簡単 lineに一行ずつファイルの内容が渡されてくる
  12. 20 31 f = open("filename") # ファイルを開く f.close() # ファイルを閉じる

    openで開いたファイルは、closeで閉じることができる ※ 閉じ忘れてもプログラム終了時に閉じてくれるが、マメに閉じることが望ましい with構文を使うと、withブロックを抜ける際に自動で閉じる with open("test.txt") as f: for line in f: print(line) with構文はファイル操作だけでなく「後片付け」が必要なものに使われる
  13. 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のローカルで読み書き
  14. 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'] 改行が含まれることに注意
  15. 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 ...
  16. 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) 二つのデータには「都市コード」という共通の項目がある 方針: ・都市コードと人口の対応表を作る ・対応表を見ながら座標と人口を対にして出力する
  17. 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 市区町村の人口データ