# 文件及目錄操作
###### tags: `人生苦短,我學Python`
## 建立和打開文件
* 建立文件可以使用
```python=
file = open(filename[,mode[,buffering]])
# 默認打開mode => "r"
```
* 打開一個不存在的文件時,應該先建立文件
```python=
print("開始建立新文件")
file = open("newfile.txt", "w")
```
* 結果

* 以二進制的方式打開文件
```python=
file = open("test.jpg", "rb")
print(file)
```
* 打開文件的一般形式
```python=
file = open("test.txt", "rw", encoding = "utf-8")
```
## 關閉文件
* 使用close()
```python=
file.close()
# file => 文件名
```
## 打開文件時,使用with語句
* 使用with就可以處理忘記關閉文件的問題
```python=
with expression as target:
with-body
```
* 範例
```python=
with open("1.txt", "r", encoding = "utf-8") as file:
pass
```
## 寫入文件
* 使用write()方法
```python=
file.write("write SomeThing")
```
* 使用剛才的範例並追加
```python=
file = open("1.txt", "w+", encoding="utf-8")
file.write("我想寫入一些東西進去檔案裡")
file.close()
```
:::success
:warning: 寫入文件後,一定要關閉文件,否則寫入的內容不會保存到文件中。
:::
## 讀取文件
* 讀取指定字符
```python=
# file.read([size])
file.read()
# 全部印出
```
* 使用seek()語法
```python=
file.seek(offset,[,whence])
whence => 0表示從頭,1表示從當前位置開始計算,2表示從尾巴開始,默認為0
```
* 範例
```python=
with open("1.txt", "r") as file:
file.seek(5)
string = file.read(5)
print(string)
# offset => 漢字2字符,英文與其他1字符
```
* 讀取一行的情況
```python=
file.readline()
```
* 讀取全部
```python=
file.readlines()
```
## 目錄操作
:::success
又稱文件夾。用於分層保護文件。
:::
* 先導入os模組
```python=
import os
```
* 相對路徑
```python=
print(os.getcwd())
# 輸出當前目錄C:\Users\a9132\Desktop\python
```
:::success
在指令路徑時可以在路徑前加上r(R),這樣所有字符都會按原樣輸出。
:::
* 絕對路徑
```python=
# os.path.abspath(path)
print(os.path.abspath(r"1.txt"))
# C:\Users\a9132\Desktop\python\1.txt
```
* 拼接路徑
```python=
# os.path.join(path1[,path2...])
print(os.path.join(r"C:\Users\a9132\Desktop", "python\1.txt"))
# C:\Users\a9132\Desktop\python.txt
```
## 判斷目錄是否存在
* 使用exists()函數
```python=
# os.path.exists(path)
print(os.path.exists(r"C:\Users\a9132\Desktop"))
# True
```
## 建立目錄
* 建立資料夾
```python=
# os.mkdir(path, mode=0o777)
# 建立資料夾
os.mkdir(r"C:\Users\a9132\Desktop\python\test")
```
* 建立成功

* 如果存在...
```python=
if not os.path.exists(path):
os.mkdir(path)
else:
print("該資料夾已存在")
```
* 可以使用makedirs建立資料夾的次級資料夾
```python=
os.makedirs(name, mode)
```
## 刪除目錄
* 使用rmdir()函數
```python=
os.rmdir(path)
```
:::success
該函數只能刪除空目錄,如果想刪除非空目錄,就需要使用......
```python=
import shutil
shutil.rmtree(path)
```
:::
## 遍歷目錄
* 使用walk()函數
```python=
# os.walk(top[,topdown][,onerror][,followlinks])
# 返回(dirpath, dirnames, filenames)
# 只在UNIX、windows系統有效
import os
tup = os.walk(path)
for tup1 in tup:
print(tup1, "\n")
```
* 結果

## 刪除文件
* 使用remove()函數
```python=
# os.remove(path)
os.remove(1.txt)
```
## 文件重新命名
* 使用os.rename()函式
```python=
# os.rename("src", "dst")
os.rename("1.txt", "new.txt")
```
* 結果

## 獲取文件基本資訊
* 使用os.stat()函數
```python=
import os
fileinfo = os.stat("new.txt")
print("最後一次修改時間: ", fileinfo.st_mtime)
# 最後一次修改時間: 1628472453.0625432
```
* 同款資訊
```python=
st_mode: inode 保護模式
st_ino:inode節點號。
st_dev: inode 駐留的設備。
st_nlink: inode 的鏈接數。
st_uid: 所有者的用戶ID。
st_gid: 所有者的組ID。
st_size: 普通文件以字節為單位的大小;包含特定特定文件的數據。
st_atime: 上次訪問的時間。
st_mtime: 最後一次修改的時間。
st_ctime:由操作系統報告的“ctime”。在部分系統上(如Unix)是最新的元數據更改時間,在其他系統上(如Windows)是創建時間(詳細信息參見平台的文檔)。
# 取自菜鳥教程
```
{%hackmd S1DMFioCO %}