標籤:學習筆記
檔案操作開啟操作
open的參數file
- 開啟或者要建立的檔案名稱。如果不指定路徑,預設是當前路徑
mode模式
| 參數 |
描述 |
| r |
預設的,表示唯讀開啟,如果調用write,會拋異常。如果檔案不存在,拋出FileNotFoundError異常 |
| w |
唯寫開啟,如果檔案不存在,則直接建立檔案,如果檔案存在,則清空檔案內容 |
| x |
建立並寫入一個新檔案,如果檔案存在,拋出FileExistsError異常 |
| a |
寫入開啟,如果檔案存在,則追加 |
| b |
二進位模式,與字元編碼無關,位元組操作使用bytes類型 |
| t |
預設的,文字模式,將檔案的位元組按照某種字元編碼理解,按照字元操作 |
| + |
讀寫開啟一個檔案。給原來唯讀、唯寫方式開啟提供缺失的讀或者寫能力,不能單獨使用。擷取檔案對象依舊按照r、w、a、x的特徵 |
r唯讀,wxa唯寫
wxa都可以產生新檔案
檔案指標
- 指向當前位元組位置
- mode=r 指標起始為0
- mode=a 指標起始在EOF
tell()
seek(offset[, whence])
- 移動指標位置,offset 移動位元組數,
- whence 文字模式與二進位模式下操作的表現形式可能有不同
文字模式下
- whence 0 預設值,表示從頭開始,offset只能正整數
- whence 1 表示從當前位置,offset只接受0
- whence 3 表示從EOF開始,offset只接受0
- 二進位模式下
- whence 0 預設值,表示從頭開始,offset只能正整數
- whence 1 表示從當前位置,offset可正可負
- whence 2 表示從EOF開始,offset可正可負
二進位模式支援任意起點的位移,從頭、從尾、從中間位置開始。
向後seek可以超界,但是向前seek的時候,不能超界,否則拋異常
buffering:緩衝區
- -1表示預設buffer大小
- 二進位模式: 使用io.DEFAULT_BUFFER_SIZE值控制
- 文字模式: 如果是終端裝置,使用行緩衝,否則與二進位模式相同
- 0 只在二進位模式使用,表示關buffer
- 1 只在文字模式使用,表示行緩衝 (見到分行符號就flush)
- 大於1 指定buffer大小
buffer緩衝區
- 一個記憶體空間,FIFO隊列,緩衝區滿或者達到閾值,就會flush到磁碟
flush()
- 將緩衝區資料寫入磁碟
- 調用close()時會先調用flush()
encoding:
- 僅文字模式使用
- 預設值None使用預設編碼(windows GBK,Linux UTF8)
errors
- None和strict 有錯誤將拋異常,ignore 忽略
newline
- 預設None ‘\n‘, ‘\r‘, ‘\r\n‘皆視為換行(都被轉換為/n)
- “表示不會自動轉換通用分行符號
- 其他合法字元表示指定字元為分行符號
- closefd
- 關閉檔案描述符,True 關閉,False 檔案關閉後保持描述符
read
- read(size=-1)
- size 讀取多少個字元或位元組 負數或None 讀取到EOF
行讀取
readline(size=-1)
- 每次讀取一行,size 控制每次讀取一行的幾個字元或位元組
- readlines(hint=-1)
write
- write(s) 返回寫入字元個數
- writelines(lines) 寫入字串列表
其他
- seekable()
- readable()
- writable()
- closed
上下文管理
由解譯器釋放對象
- 文法:with ... as
- 上下文管理的語句塊不會開啟新的範圍
- 語句塊執行完自動關閉檔案對象
記憶體IOStringIO
from io import StringIO
- 記憶體中開闢一個文字模式的buffer,可以像檔案對象一樣操作
當調用close後,buffer會被釋放
- 方法與檔案IO類似
getvalue()
- 優點
BytesIO
from io import BytesIO
file-like對象
- 類檔案對象:
- socket、stdin、stdout都是類檔案對象
路徑操作
- 建議使用pathlib模組,使用Path對象來操作
from pathlib import Path
路徑拼接與分解操作符 /
- 操作符重載
- Path對象 / Path對象
- Path對象 / 字串 或 字串 / Path對象
parts
output: (‘/‘, ‘data‘, ‘MyPythonObject‘)
joinpath
擷取路徑
父目錄
- parent 返回父目錄Path類對象
- parents 返回父目錄可迭代對象,索引0是當前直接的父目錄
其他
- name 目錄的最後一個部分
- suffix 目錄中最後一個部分的副檔名
- stem 目錄最後一個部分,沒有尾碼
- suffixes 返回多個副檔名列表
- with_suffix(suffix) 補充副檔名到路徑尾部,返回新的路徑,副檔名存在則無效
with_name(name) 替換目錄最後一個部分並返回一個新的路徑
- cwd() 返回當前工作目錄
home() 返回當前家目錄
- is_dir() 是否目錄
- is_file() 是否普通檔案
- is_symlink() 是否軟連結
- is_socket() 是否socket檔案
- is_block_device() 是否塊裝置
- is_char_device() 是否字元裝置
is_absolute() 是否絕對路徑
- resolve() 返回當前Path對象的絕對路徑,如果是軟連結則直接被解析
absolute() 返回絕對路徑,建議使用resolve
- exists() 目錄或檔案是否存在
- rmdir() 刪除空目錄。沒有提供判斷目錄為空白的方法
- touch(mode=0o666,exist_ok=True) 建立一個檔案
as_uri() 將路徑返回成URI,例如"file:///etc/passwd"
mkdir(mode=0o777,parents=False,exist_ok=False)
- parents 是否建立父目錄,True等同於mkdir -p False時,父目錄不存在,則拋FileNotFoundError
- exist_ok False時,路徑存在,拋出FileExistsError True時,忽略此異常
iterdir() 迭代目前的目錄
glob() 通配給定的模式
rglob() 通配給定的模式,遞迴目錄 返回一個產生器
match() 模式比對,成功返回True
stat() 查看檔案屬性
- lstat() 同stat 但如果時連結檔案,則顯示本身的檔案資訊
檔案操作
open(mdoe=‘r‘,buffering=-1,encoding=None,errors=None,newline=None)
read_bytes()
read_text(encoding=None,errors=None)
Path.write_bytes(data)
- write_text(data,encoding=None,errors=None)
os模組
os.name
os.uname()
sys.platform
- windos顯示win32 linux顯示linux
os.listdir(‘0:/temp‘)
os.stat(path, *, dir_fd=None, follow_symlinks=True)
- 本質上調用Linux的stat
- path:路徑的string或bytes,或fd檔案描述符
- follow_symlinks True返迴文件本身資訊,False 如果時軟鏈串連則顯示軟連結本身
os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True)
- os.chown(path, uid, gid, *, dir_fd=None, follow_symlinks=True)
- 參考Linux chown命令
shutil模組
copyfileobj(fsrc, fdst[, length])
copyfile(src, dst, *, follow_symlinks=True)
copymode(src, dst, *, follow_symlinks=True)
copystat(src, dst, *, follow_symlinks=True)
copy(src, dst, *, follow_symlinks=True)
copy2(src, dst, *, follow_symlinks=True)
copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)
rmtree(path, ignore_errors=False, onerror=None)
- move(src, dst, copy_function=copy2)
csv檔案
- Comma-Separated Values
- 被行分隔字元、資料行分隔符號劃分成行與列
csv不指定字元編碼
- 行分隔字元為\r\n
- 資料行分隔符號常為逗號或定位字元
如果欄位中含有雙引號、逗號、分行符號,必須使用雙引號括起來。
如果欄位本身包含雙引號,使用兩個雙引號表示一個轉義
csv模組
ini檔案
[DEFAULT]a = test[mysql]default-character-set=utf8a = 1000[mysqld]datadir =/dbserver/dataport = 33060character-set-server=utf8sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- 中括弧的內容稱為section
- 每個section中,都是key,value形式的索引值對,key稱為option
預設section DEFAULT必須大寫
configparser模組ConfigParserle類
from configparser import ConfigParsercfg = ConfigParser()
可將section當作key,其對應的值是儲存著option的索引值對字典,即ini檔案是一個嵌套字典。預設使用有序字典
read(filenames, encoding=None)
sections()
add_section(section_name)
has_section(section_name)
options(section)
- 返回一個section的options,包括預設section的options
has_option(section)
get(section, option, *, raw=False, vars=None[, fallback])
- 從指定的section的option取值,如未找到,去DEFAULT找
- getint(section, option, *, raw=False, vars=None[, fallback])
- getfloat(section, option, *, raw=False, vars=None[, fallback])
getboolean(section, option, *, raw=False, vars=None[, fallback])
items(raw=False, vars=None)
items(section, raw=False, vars=None)
- 返回指定section的option的索引值對二元組
set(section, option, value)
- 設定指定section的option=value(option,value必須為字串 ),section不存在則拋異常
remove_section(section)
remove_option(section, option)
- write(fileobject, space_around_delimiters=True)
- 將當前config的所有內容寫入fileobject中
序列化與還原序列化定義
serialization 序列化
- 將記憶體中Object Storage Service下來,把它變成一個個位元組 -> 二進位
deserialization 還原序列化
- 將檔案的一個個位元組恢複成記憶體中對象 <- 二進位
- 序列化儲存到檔案就是持久化
- 一般將資料序列化後持久化或進行網路傳輸或是從檔案、接受自網路的位元組序列還原序列化
pickle庫
dump(obj, protocol=None, *, fix_imports=True)
dump(obj, file, protocol=None, *, fix_imports=True)
loads(file, *, fix_imports=True, encoding="ASCII", errors="strict")
- load(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict")
序列化、還原序列化實驗序列化應用
- 一般使用在網路傳輸中,將資料序列化後通過網路傳輸到遠程節點,遠程伺服器上的服務將接收到的資料還原序列化使用
- 注意:遠程接收端還原序列化時必須有對應的資料類型,否則會報錯。尤其自訂類,必須遠程端有一致的定義
- 大多數項目都不是單機、單服務的。需要通過網路將資料傳送到其他節點,因此需要大量的序列化與還原序列化
- 但是如果跨平台、跨語言、跨協議之間通常使用XML、Json、Protocol Buffer等。不選擇pickle
Json模組
常用方法
import json
dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
- load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
MessagePack模組
安裝
- $ pip install msgpack-python
常用方法
import msgpack
packb(o, **kwargs) <=> dumps
- 序列化對象。提供了dumps來相容pickle和json
unpackb(packed, object_hook=None, list_hook=None, bool use_list=1, encoding=None, unicode_errors=‘strict‘, object_pairs_hook=None, ext_hook=ExtType, Py_ssize_t max_str_len=2147483647, Py_ssize_t max_bin_len=2147483647, Py_ssize_t max_array_len=2147483647, Py_ssize_t max_map_len=2147483647, Py_ssize_t max_ext_len=2147483647) <==> loads
pack(o, stream, **kwargs) <==> dump
- unpack(stream, object_hook=None, list_hook=None, bool use_list=1, encoding=None, unicode_errors=‘strict‘, object_pairs_hook=None, ext_hook=ExtType, Py_ssize_t max_str_len=2147483647, Py_ssize_t max_bin_len=2147483647, Py_ssize_t max_array_len=2147483647, Py_ssize_t max_map_len=2147483647, Py_ssize_t max_ext_len=2147483647) <==> load
- 還原序列化對像儲存到檔案對象。提供了load來相容
Python第六周 學習筆記(1)