免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Python文件操作:os、pathlib與shutil的分工與實(shí)戰(zhàn)指南

Python文件操作:os、pathlib與shutil的分工與實(shí)戰(zhàn)指南 說(shuō)實(shí)話很多人學(xué)了Python基礎(chǔ)語(yǔ)法之后第一個(gè)感覺自己會(huì)寫腳本了的時(shí)刻往往就是從文件操作開始的——批量改名、整理下載目錄、按日期歸檔日志。但也是從這一刻開始才真正體會(huì)到Python文檔里那三個(gè)庫(kù)的分家有多讓人迷惑操作文件用os處理路徑用os.path高級(jí)復(fù)制刪除又跳出來(lái)一個(gè)shutil到了Python 3.4之后還得加上pathlib。剛上手的時(shí)候我也是一頓混用同一個(gè)腳本里同時(shí)出現(xiàn)os.path.join和Path的情況比比皆是。這個(gè)主題看起來(lái)基礎(chǔ)實(shí)際上是幾乎所有自動(dòng)化腳本的地基。如果你能把os、pathlib、shutil這三者的分工和配合摸透后面寫爬蟲存數(shù)據(jù)、寫數(shù)據(jù)處理腳本、寫自動(dòng)部署工具都會(huì)非常順手。這篇文章我會(huì)直接按實(shí)際開發(fā)場(chǎng)景來(lái)拆不按文檔順序念重點(diǎn)講那些文檔里沒寫清楚、但你在真實(shí)工程里一定會(huì)撞上的問題。1. 三個(gè)庫(kù)三個(gè)脾氣先分清os、pathlib和shutil誰(shuí)負(fù)責(zé)哪攤活1.1 剛上手時(shí)最容易犯的錯(cuò)把所有文件操作都塞進(jìn)os里os模塊是Python和操作系統(tǒng)交互的最底層接口它的定位非常廣環(huán)境變量、進(jìn)程管理、工作目錄、文件描述符什么都有。正因?yàn)樗裁炊脊苣阒苯佑胦s去操作文件時(shí)寫出來(lái)的代碼往往很啰嗦。比如判斷一個(gè)路徑是不是文件、再拿到它的文件名最傳統(tǒng)的寫法是import os path /home/user/project/data/report_2024.csv if os.path.isfile(path): filename os.path.basename(path) dirname os.path.dirname(path) name, ext os.path.splitext(filename)這套API是早年C語(yǔ)言風(fēng)格的延續(xù)函數(shù)式、參數(shù)是字符串、返回也是字符串。你拼接路徑時(shí)得用os.path.join而且拼完之后得到的還是字符串后續(xù)想再取父目錄、改后綴名又得再調(diào)一層函數(shù)。邏輯一旦復(fù)雜起來(lái)滿屏的os.path.xxx嵌套讀起來(lái)非常累。1.2 pathlib的面向?qū)ο蟮降赘纳屏耸裁礀|西pathlib在Python 3.4引入它的核心思路很簡(jiǎn)單把路徑從字符串升級(jí)成對(duì)象。路徑不再是你要反復(fù)解析的原材料而是一個(gè)有方法、有屬性的實(shí)體。同樣是上面那段邏輯用pathlib寫是這樣from pathlib import Path path Path(/home/user/project/data/report_2024.csv) if path.is_file(): filename path.name dirname path.parent name path.stem ext path.suffix一眼就能看出差別path.name、path.parent、path.stem、path.suffix都是屬性不需要函數(shù)套函數(shù)。更關(guān)鍵的是Path對(duì)象重載了/運(yùn)算符拼接路徑可以寫成data_dir Path(project) / data / report_2024.csv這比os.path.join(project, data, report_2024.csv)直觀得多。而且Path對(duì)象在Windows和Linux上都能正確處理分隔符你不需要關(guān)心當(dāng)前系統(tǒng)是反斜杠還是正斜杠。1.3 shutil是真正干重活的那個(gè)os負(fù)責(zé)指出文件在哪、是什么pathlib負(fù)責(zé)優(yōu)雅地描述路徑而真正執(zhí)行把文件從一個(gè)地方搬到另一個(gè)地方把整個(gè)目錄樹復(fù)制走刪除整個(gè)目錄這類重體力活的是shutil。它全稱是shell utilities設(shè)計(jì)目標(biāo)就是補(bǔ)齊os模塊在文件級(jí)操作上的短板。舉幾個(gè)最常見的對(duì)比操作os系列shutil刪除單個(gè)文件os.remove(path)os.remove本身夠了刪除非空目錄os.rmdir只支持空目錄shutil.rmtree可以遞歸刪除復(fù)制單個(gè)文件os.system(cp ...)這種不推薦shutil.copy2(src, dst)復(fù)制整個(gè)目錄樹基本要自己寫遞歸shutil.copytree(src, dst)移動(dòng)文件os.rename跨目錄經(jīng)常報(bào)錯(cuò)shutil.move(src, dst)用多了你就會(huì)發(fā)現(xiàn)凡是涉及目錄樹級(jí)別或者跨文件系統(tǒng)的操作直接找shutil準(zhǔn)沒錯(cuò)。它內(nèi)部已經(jīng)把很多邊緣情況處理好了比如跨設(shè)備移動(dòng)會(huì)先復(fù)制再刪除不會(huì)像os.rename那樣直接拋OSError。1.4 為什么現(xiàn)在新代碼推薦你用pathlib而不是os.pathpathlib是Python 3.6以后官方文檔推薦的首選路徑處理方式原因不只是語(yǔ)法好看。它在設(shè)計(jì)上解決了一個(gè)很實(shí)際的問題路徑操作的組合性。字符串方式的os.path每一步函數(shù)返回的都是一個(gè)新的字符串你沒有一個(gè)穩(wěn)定的中間載體而Path對(duì)象本身就是一個(gè)載體你可以反復(fù)基于它做.parent、.joinpath()、.with_suffix()等操作代碼流程是連續(xù)的。當(dāng)然這不代表os沒用了。你要拿環(huán)境變量、要設(shè)置進(jìn)程工作目錄、要遍歷目錄樹拿底層文件描述符還是得用它。我的習(xí)慣是路徑描述和基本判斷用pathlib系統(tǒng)級(jí)交互用os文件批量操作用shutil。2. 路徑操作是最容易翻車的地方相對(duì)路徑、當(dāng)前目錄依賴病和不同操作系統(tǒng)的分隔符2.1 剛寫腳本時(shí)都犯過的病腳本一挪地方就找不到文件很多人寫腳本時(shí)圖省事直接用相對(duì)路徑with open(data/config.json, r) as f: config json.load(f)這段代碼能不能跑通完全取決于你運(yùn)行腳本時(shí)的工作目錄。如果你在項(xiàng)目根目錄運(yùn)行data/config.json能找到但如果你用IDE的調(diào)試功能、或者注冊(cè)成定時(shí)任務(wù)、或者從別的目錄調(diào)用這個(gè)腳本Python的當(dāng)前工作目錄變了這個(gè)相對(duì)路徑就立刻失效。報(bào)錯(cuò)往往是FileNotFoundError但你明明看到文件就在那里。正確的做法是基于腳本文件自身的位置來(lái)定位資源。pathlib提供了非常簡(jiǎn)單的方法from pathlib import Path BASE_DIR Path(__file__).resolve().parent config_path BASE_DIR / data / config.json__file__是當(dāng)前腳本文件的路徑.resolve()會(huì)把相對(duì)路徑轉(zhuǎn)成絕對(duì)路徑還能解析掉..和符號(hào)鏈接。之后無(wú)論你在哪個(gè)目錄下運(yùn)行這個(gè)腳本它都能找到自己旁邊的資源文件。這個(gè)習(xí)慣我從第二年開始就一直保持再也沒有被文件找不到這種低級(jí)問題坑過。2.2 相對(duì)路徑、絕對(duì)路徑和., ..這些隱藏陷阱Path(..)這類路徑看起來(lái)簡(jiǎn)單實(shí)際使用中很容易出問題。比如你想找項(xiàng)目根目錄下的某個(gè)文件從子目錄往上一級(jí)兩級(jí)path Path(__file__).resolve().parent.parent / config.yaml這里連續(xù)兩個(gè).parent取決于你的目錄層級(jí)。一旦中間目錄結(jié)構(gòu)調(diào)整這個(gè)路徑就失效了。更穩(wěn)妥的辦法是從項(xiàng)目根開始往下找# 假設(shè)倉(cāng)庫(kù)結(jié)構(gòu)repo/src/tools/gen_report.py # 要找 repo/config.yaml ROOT Path(__file__).resolve().parent.parent # 回到repo config_path ROOT / config.yaml另一個(gè)常見問題是.resolve()和.absolute()的區(qū)別。雖然兩者絕大多數(shù)時(shí)候結(jié)果相同但.resolve()會(huì)額外解析符號(hào)鏈接和..把路徑洗成最直接的形式.absolute()則不會(huì)處理符號(hào)鏈接只是單純把相對(duì)路徑補(bǔ)全成絕對(duì)路徑。在大多數(shù)場(chǎng)景下直接用.resolve()更可靠。2.3 Windows路徑分隔符反斜杠那些反直覺的事Windows的路徑是用反斜杠分隔的比如C:\Users\name\Documents\file.txt。在Python字符串里反斜杠是轉(zhuǎn)義符所以你寫Windows路徑時(shí)要么寫成C:\\Users\\name要么寫原始字符串rC:\Users\name。用os.path.join或者pathlib的/運(yùn)算符本質(zhì)上是讓庫(kù)去處理分隔符差異。這里有個(gè)很坑的細(xì)節(jié)你用pathlib在Windows上拼路徑時(shí)得到的Path對(duì)象打印出來(lái)默認(rèn)是反斜杠樣式但如果你把它轉(zhuǎn)成字符串傳給其他程序某些程序只認(rèn)正斜杠。一個(gè)常見的處理是path_str str(Path(data) / file.txt).replace(\\, /)還有一個(gè)更隱蔽的問題路徑中帶有空格??崭裨诖蠖鄶?shù)情況下沒問題但一旦你把路徑拼進(jìn)命令字符串比如用subprocess調(diào)用外部命令就必須加引號(hào)否則命令會(huì)斷掉。用pathlib的resolve()通常能拿到絕對(duì)路徑但在拼命令時(shí)還是得手動(dòng)處理空格。2.4 中文文件名和Unicode規(guī)范化問題中文文件名在現(xiàn)代Python 3中基本沒有障礙路徑可以直接用中文字符串。但如果你處理的文件是別人上傳的文件名來(lái)源五花八門可能會(huì)出現(xiàn)Linux的UTF-8編碼和macOS的NFC/NFD規(guī)范化不一致的問題。具體表現(xiàn)是你用Path(報(bào)告.pdf)去匹配明明文件存在但if path.exists()返回False。這是因?yàn)閙acOS的文件系統(tǒng)用NFD分解形式存儲(chǔ)文件名而很多其他系統(tǒng)用NFC組合形式兩者從視覺上看一模一樣但編碼字節(jié)不同。如果你需要處理這類場(chǎng)景可以考慮用第三方庫(kù)unicodedata做規(guī)范化對(duì)齊或者干脆用模糊匹配。不過說(shuō)實(shí)話我自己遇到最多的還是Windows共享文件夾里的中文路徑這時(shí)基本上直接用pathlib也能搞定真正麻煩的是跨系統(tǒng)共享時(shí)編碼不一致。3. 目錄遍歷與文件篩選不靠記憶寫遞歸靠這三招掃目錄3.1 os.walk是全能但啰嗦的老牌選手批量處理文件時(shí)最常做的事就是把目錄樹整個(gè)逛一遍。os.walk是Python里最傳統(tǒng)的做法它會(huì)遞歸遍歷目錄每到一個(gè)目錄都返回三個(gè)值當(dāng)前目錄路徑、子目錄列表、文件列表。經(jīng)典用法import os for root, dirs, files in os.walk(/home/user/project): for name in files: if name.endswith(.log): full_path os.path.join(root, name) print(full_path)這套寫法本身沒問題但你可以看到root、dirs、files是三組平行的數(shù)據(jù)結(jié)構(gòu)你需要自己去os.path.join拼完整路徑。遍歷過程中如果想改變dirs的值來(lái)控制要不要進(jìn)入某個(gè)子目錄也容易出錯(cuò)。3.2 pathlib的glob和rglob讓遍歷變得優(yōu)雅很多pathlib自帶的glob和rglob是替代方案。我最常用的是rglob它的意思是遞歸地匹配glob模式from pathlib import Path base Path(/home/user/project) for path in base.rglob(*.log): print(path)注意rglob(*.log)匹配的是文件名以.log結(jié)尾的所有層級(jí)的文件返回的直接就是Path對(duì)象不需要手動(dòng)拼接。如果想匹配任意子目錄下的特定文件還可以寫# 匹配所有子目錄下的data.txt for path in base.rglob(data.txt): pass # 匹配兩層以內(nèi)的目錄結(jié)構(gòu) for path in base.glob(*/*/*.log): pass # 匹配所有文件不管擴(kuò)展名 for path in base.rglob(*): if path.is_file(): pass3.3 glob模式里那些微妙語(yǔ)法*、**、?和字符集glob模式本質(zhì)上是一種簡(jiǎn)化版的正則表達(dá)式不是完整的正則。最容易混淆的是*和***.log匹配當(dāng)前目錄下所有以.log結(jié)尾的文件*不跨目錄層級(jí)**/*.log在glob方法里可以跨層級(jí)匹配在rglob里寫**/*.log和直接寫*.log效果其實(shí)相同因?yàn)閞glob本身就是遞歸的?匹配單個(gè)任意字符比如report_?.csv能匹配report_1.csv但匹配不到report_10.csv[0-9]字符集匹配比如file_[0-9].txt我個(gè)人在實(shí)際項(xiàng)目中更傾向于用rglob加寬泛的匹配條件然后在循環(huán)里用Path對(duì)象的屬性做二次篩選。這樣比精心編寫glob模式更易讀也更好維護(hù)。3.4 按擴(kuò)展名、修改時(shí)間、文件大小篩文件的完整套路真正篩選文件時(shí)很少只靠擴(kuò)展名一種條件。比如清理超過30天的日志文件保留最近3天的備份找出大于100MB的臨時(shí)文件。pathlib做這類組合篩選非常順手import time from pathlib import Path base Path(/var/logs) cutoff time.time() - 30 * 24 * 60 * 60 # 30天前的時(shí)間戳 for path in base.rglob(*.log): if not path.is_file(): continue mtime path.stat().st_mtime if mtime cutoff: print(f可以清理: {path}大小: {path.stat().st_size / 1024:.1f} KB)path.stat()拿到的st_mtime是最后修改時(shí)間戳st_size是字節(jié)數(shù)。如果文件很多可以按大小倒序排優(yōu)先處理大文件files [p for p in base.rglob(*) if p.is_file()] files.sort(keylambda p: p.stat().st_size, reverseTrue) for p in files[:10]: print(f{p} ({p.stat().st_size / 1024 / 1024:.2f} MB))這里要注意的是p.stat()每次都會(huì)發(fā)起一次系統(tǒng)調(diào)用如果文件列表特別長(zhǎng)性能會(huì)明顯下降。對(duì)于幾千個(gè)文件這個(gè)量級(jí)沒什么問題但如果上百萬(wàn)文件建議先os.scandir拿底層數(shù)據(jù)再篩。4. 復(fù)制、移動(dòng)、重命名、刪除shutil高頻操作里的異?,F(xiàn)場(chǎng)4.1 拒絕訪問os error 5到底哪來(lái)的這個(gè)錯(cuò)誤基本是Windows環(huán)境專屬但它出現(xiàn)的原因五花八門。最常見的是目標(biāo)文件被另一個(gè)進(jìn)程鎖住了。比如你用Excel打開了某個(gè)xlsx文件然后腳本要去覆蓋它Windows會(huì)直接拒絕報(bào)PermissionError: [Errno 13] Permission denied有時(shí)候錯(cuò)誤信息里會(huì)帶os error 5。Linux下對(duì)應(yīng)的是權(quán)限位不足但Windows下更多是文件占用。還有一種情況是目標(biāo)目錄沒有寫權(quán)限。比如把文件復(fù)制到C:\Program Files這種系統(tǒng)受保護(hù)目錄普通權(quán)限下會(huì)被拒絕。解決辦法有兩種思路如果是文件被占用先找到占用進(jìn)程并關(guān)閉它或者讓腳本自動(dòng)重試如果是權(quán)限不足需要以管理員身份運(yùn)行或者修改目標(biāo)目錄的ACL我給個(gè)實(shí)用的重試封裝import shutil import time from pathlib import Path def copy_with_retry(src: Path, dst: Path, retries: int 5, delay: float 1.0): for i in range(retries): try: shutil.copy2(src, dst) return except PermissionError: if i retries - 1: raise time.sleep(delay) print(f目標(biāo)文件被占用第{i2}次嘗試復(fù)制...)這個(gè)函數(shù)在文件被Excel或其他程序短暫占用時(shí)很管用比如從共享目錄批量拉取文件時(shí)Office套件常常短暫鎖定文件。4.2 shutil.copy、copy2、copyfile三兄弟的區(qū)別shutil提供三個(gè)復(fù)制函數(shù)很多人不清楚差異直接導(dǎo)致復(fù)制出來(lái)的文件缺失元數(shù)據(jù)。它們的區(qū)別如下函數(shù)復(fù)制內(nèi)容是否保留權(quán)限是否保留時(shí)間戳目標(biāo)可以是目錄shutil.copyfile只復(fù)制文件內(nèi)容否否否shutil.copy文件內(nèi)容 權(quán)限部分否是shutil.copy2文件內(nèi)容 權(quán)限 元數(shù)據(jù)是是是我的經(jīng)驗(yàn)是絕大多數(shù)場(chǎng)景直接用copy2因?yàn)樗M量保留文件的修改時(shí)間和訪問時(shí)間在備份、歸檔類腳本里非常重要。如果備份后還需要用類似rsync的思路對(duì)比文件差異時(shí)間戳的存在能省去很多麻煩。copyfile適合那種只要內(nèi)容、別的都不管的極端場(chǎng)景。還要注意copy2和copy都允許dst參數(shù)是一個(gè)目錄這時(shí)會(huì)保留原始文件名而copyfile要求dst必須是完整的文件路徑。4.3 shutil.move跨目錄和跨文件系統(tǒng)時(shí)的行為差異shutil.move是移動(dòng)文件的推薦函數(shù)但它內(nèi)部邏輯會(huì)讓很多人困惑文件在同一個(gè)文件系統(tǒng)內(nèi)時(shí)它直接調(diào)用os.rename速度快但跨文件系統(tǒng)時(shí)它會(huì)先復(fù)制再刪除速度慢而且需要臨時(shí)空間。一個(gè)容易踩的坑是shutil.move的dst參數(shù)如果是已存在的目錄文件會(huì)被移進(jìn)這個(gè)目錄如果是一個(gè)文件路徑那就是重命名。寫代碼時(shí)最好明確意圖from pathlib import Path import shutil src Path(/tmp/data/report.csv) target_dir Path(/backup/2024/) target_dir.mkdir(parentsTrue, exist_okTrue) # 明確要移動(dòng)到目錄中 shutil.move(str(src), str(target_dir / src.name))另一個(gè)常見問題是目標(biāo)目錄不存在。shutil.move不會(huì)自動(dòng)創(chuàng)建目標(biāo)目錄如果目標(biāo)路徑的父目錄不存在它會(huì)拋FileNotFoundError。所以移動(dòng)之前一定要先mkdir(parentsTrue, exist_okTrue)。4.4 批量重命名時(shí)如何保住文件安全先演練再動(dòng)手批量重命名是文件操作腳本里最容易翻車的場(chǎng)景。我吃過最大的虧是重命名時(shí)新舊文件名有交叉處理到一半文件已經(jīng)改名了后續(xù)的源文件路徑失效。核心原則有兩條先把所有操作列成計(jì)劃再統(tǒng)一執(zhí)行執(zhí)行前檢查是否有重名沖突代碼可以這樣寫from pathlib import Path base Path(/home/user/photos) rename_plan [] for path in base.glob(IMG_*.jpg): # 假設(shè)要把 IMG_00123.jpg 改成 2024_00123.jpg new_name 2024_ path.name[4:] new_path path.with_name(new_name) if new_path.exists(): print(f跳過目標(biāo)已存在: {new_path}) continue rename_plan.append((path, new_path)) # 統(tǒng)一執(zhí)行 for old_path, new_path in rename_plan: old_path.rename(new_path) print(f{old_path.name} - {new_path.name})這里的關(guān)鍵是用path.with_name()生成同名目錄下的新文件名比手動(dòng)拼接父路徑靠譜得多。另外建議在重命名前先打印所有計(jì)劃給自己一個(gè)最后檢查的機(jī)會(huì)。搞批量操作時(shí)寧可慢一點(diǎn)也別一股腦跑完再發(fā)現(xiàn)全亂了。4.5 刪除操作的后悔藥別直接rmtree大多數(shù)人刪除文件時(shí)直接os.remove或shutil.rmtree這當(dāng)然沒問題但我在處理重要數(shù)據(jù)時(shí)習(xí)慣先做一個(gè)軟刪除把文件移動(dòng)到臨時(shí)回收目錄而不是直接刪。這樣萬(wàn)一手滑刪錯(cuò)了還能救回來(lái)。import shutil from pathlib import Path TRASH_DIR Path(/home/user/.trash) TRASH_DIR.mkdir(exist_okTrue) def safe_delete(path: Path): dst TRASH_DIR / path.name # 如果回收站已有同名文件加時(shí)間戳避免覆蓋 if dst.exists(): dst TRASH_DIR / f{path.stem}_{path.stat().st_mtime}{path.suffix} shutil.move(str(path), str(dst))這個(gè)軟刪除策略配合定時(shí)清理腳本既安全又不會(huì)讓回收站無(wú)限膨脹。特別是批量清理日志、臨時(shí)文件時(shí)強(qiáng)烈建議先軟刪除觀察幾天確認(rèn)沒問題再物理清除。5. 讀寫文件時(shí)的編碼與內(nèi)容處理亂碼不只是加個(gè)encoding那么直白5.1 用Path.open還是open以及with語(yǔ)句的必要性讀寫文件最簡(jiǎn)單的方式是內(nèi)置的open()但如果你已經(jīng)在用pathlib處理路徑直接用Path.open()會(huì)更統(tǒng)一from pathlib import Path path Path(report.txt) # 寫法一open函數(shù)字符串路徑 with open(report.txt, r, encodingutf-8) as f: content f.read() # 寫法二Path.open with path.open(r, encodingutf-8) as f: content f.read()兩者其實(shí)沒本質(zhì)區(qū)別Path.open就是幫你把路徑轉(zhuǎn)成字符串再調(diào)內(nèi)置open。真正要強(qiáng)調(diào)的是with語(yǔ)句。忘了with會(huì)導(dǎo)致文件句柄不釋放Windows上最直接的后果就是文件被占用、后面想刪都刪不掉。這也是很多os error 5的根源之一腳本運(yùn)行完進(jìn)程還在文件句柄還占著后續(xù)操作全失敗。5.2 Python 3的open默認(rèn)編碼為何會(huì)坑你Python 3里open()打開文本文件時(shí)默認(rèn)編碼取決于系統(tǒng)區(qū)域設(shè)置。Windows中文系統(tǒng)通常是gbkLinux通常是utf-8。這意味著同樣一段代碼在Windows上可以正常讀中文文件但部署到Linux上可能直接拋UnicodeDecodeError。最穩(wěn)妥的做法是每次打開文本文件都顯式指定encodingutf-8除非你能確定文件確實(shí)不是UTF-8。對(duì)中文環(huán)境來(lái)說(shuō)老系統(tǒng)傳下來(lái)的txt文件經(jīng)常會(huì)帶著GBK編碼處理這些文件時(shí)需要格外小心可能在讀取時(shí)就得指定encodinggbk。判斷文件實(shí)際編碼推薦用chardet庫(kù)做個(gè)初步猜測(cè)import chardet def detect_encoding(path): raw path.read_bytes()[:4096] result chardet.detect(raw) return result[encoding] or utf-8注意chardet不是百分百準(zhǔn)確尤其是對(duì)短文本。我的做法是先嘗試utf-8失敗后回退到gbk再不行才用chardet。5.3 BOMUTF-8文件里藏著的三個(gè)不可見字符另一個(gè)高頻坑是UTF-8 BOM。某些Windows程序特別是老版記事本保存UTF-8文件時(shí)會(huì)在文件開頭寫入一個(gè)\xef\xbb\xbf的BOM標(biāo)記。Python讀取時(shí)如果不處理字符串開頭會(huì)包含這個(gè)不可見字符導(dǎo)致if content.startswith(---)這種判斷失效。修復(fù)方法很簡(jiǎn)單用utf-8-sig編碼讀取with path.open(r, encodingutf-8-sig) as f: content f.read()utf-8-sig讀取時(shí)會(huì)自動(dòng)跳過開頭的BOM。但要注意寫入時(shí)用不用utf-8-sig要看你的下游工具。如果文件是給新程序用的用utf-8就行別主動(dòng)加BOM如果是給老Windows程序用加BOM反而保險(xiǎn)。5.4 大文件別用read()一次性讀完搞懂緩沖區(qū)新手最容易犯的錯(cuò)是讀大文件時(shí)直接read()一個(gè)幾GB的日志文件能把內(nèi)存撐爆。正確的做法是逐行迭代with path.open(r, encodingutf-8) as f: for line in f: # 處理每一行 process_line(line)如果文件不是按行組織、需要按固定塊讀可以用read(size)with path.open(rb) as f: # 二進(jìn)制模式 while chunk : f.read(8192): process_chunk(chunk)這里8192是經(jīng)典的緩沖區(qū)大小。如果你的腳本頻繁讀寫大量小文件還有一個(gè)性能優(yōu)化點(diǎn)把多個(gè)文件的讀寫邏輯合并減少系統(tǒng)調(diào)用次數(shù)。比如需要批量改文件內(nèi)容時(shí)不要每改一個(gè)就開關(guān)一次文件句柄先全部讀取到內(nèi)存中處理完再一次寫回。6. 生產(chǎn)環(huán)境里的防御式文件操作異常層次、競(jìng)態(tài)與健壯代碼風(fēng)格6.1 異常金字塔FileNotFoundError、PermissionError和OSError的家族關(guān)系文件操作最常見的異常有三個(gè)FileNotFoundError、PermissionError、IsADirectoryError。它們都是OSError的子類這是理解異常捕獲邏輯的關(guān)鍵。try: shutil.copy2(src, dst) except FileNotFoundError: print(f源文件不存在: {src}) except PermissionError: print(f沒有權(quán)限訪問: {src} 或 {dst}) except OSError as e: print(f其他操作系統(tǒng)級(jí)錯(cuò)誤: {e})捕獲順序是從具體到一般。如果你先寫except OSError后面的FileNotFoundError分支永遠(yuǎn)走不到。我見過不少同事在這個(gè)順序上栽跟頭。6.2 先檢查再操作的競(jìng)態(tài)問題文件在兩次調(diào)用之間可能消失很多新手習(xí)慣這樣寫if path.exists(): path.unlink()這個(gè)寫法有一個(gè)微妙的競(jìng)態(tài)問題exists()和unlink()之間文件可能被其他進(jìn)程刪掉或者新建。如果文件在這兩步之間消失unlink()會(huì)拋FileNotFoundError。生產(chǎn)環(huán)境下的文件操作永遠(yuǎn)要假設(shè)文件系統(tǒng)是動(dòng)態(tài)的。更好的做法是直接操作捕獲異常這就是Python提倡的EAFP風(fēng)格Easier to Ask for Forgiveness than Permissiontry: path.unlink() except FileNotFoundError: pass # 文件本來(lái)就不存在目的已達(dá)到這種風(fēng)格寫起來(lái)更健壯也減少了系統(tǒng)調(diào)用次數(shù)。同理創(chuàng)建目錄時(shí)用mkdir(parentsTrue, exist_okTrue)而不是先判斷exists()再?zèng)Q定要不要?jiǎng)?chuàng)建。6.3 冪等操作設(shè)計(jì)讓腳本可以放心跑第二次所謂冪等是指執(zhí)行一次和執(zhí)行兩次效果相同。日志清理腳本、備份腳本、臨時(shí)文件整理腳本都應(yīng)該設(shè)計(jì)成冪等的否則你第二次運(yùn)行時(shí)會(huì)因?yàn)槲募呀?jīng)不存在而出錯(cuò)。以清理超過30天的緩存文件為例import shutil import time from pathlib import Path CACHE_DIR Path(/tmp/myapp_cache) CLEAN_BEFORE time.time() - 30 * 24 * 60 * 60 if not CACHE_DIR.exists(): exit(0) for path in CACHE_DIR.rglob(*): try: if path.is_file() and path.stat().st_mtime CLEAN_BEFORE: path.unlink() print(f清理: {path}) elif path.is_dir() and path.stat().st_mtime CLEAN_BEFORE: shutil.rmtree(path, ignore_errorsTrue) except FileNotFoundError: # 如果在判斷和刪除之間文件被別人清了直接忽略 pass注意ignore_errorsTrue這個(gè)參數(shù)它會(huì)讓rmtree忽略文件不存在、權(quán)限不足等問題非常適合冪等清理場(chǎng)景。當(dāng)然也要注意別因?yàn)閕gnore_errors掩蓋了真正的問題在重要操作里還是顯式處理異常比較好。6.4 網(wǎng)絡(luò)共享目錄那些讓人抓狂的延遲和占用處理Windows共享目錄或NAS掛載點(diǎn)時(shí)文件操作會(huì)表現(xiàn)出一些本地目錄沒有的問題網(wǎng)絡(luò)延遲導(dǎo)致操作超時(shí)、文件被其他用戶鎖定、路徑訪問時(shí)斷時(shí)續(xù)。我的經(jīng)驗(yàn)是對(duì)網(wǎng)絡(luò)路徑的操作要合理地重試但絕不能無(wú)限重試。上面那個(gè)copy_with_retry模式再擴(kuò)展一下加上超時(shí)上限和日志輸出就能變成可靠的生產(chǎn)代碼。另外網(wǎng)絡(luò)路徑上盡量別用shutil.rmtree文件太多時(shí)可能異常緩慢優(yōu)先考慮分批刪除。6.5 實(shí)操收尾我個(gè)人的文件操作代碼習(xí)慣寫了這么多年文件操作腳本總結(jié)了幾條自己一直堅(jiān)持的習(xí)慣第一所有腳本開頭都用Path(__file__).resolve().parent定位基準(zhǔn)目錄絕不依賴運(yùn)行時(shí)的當(dāng)前工作目錄。第二所有文本讀寫都顯式指定編碼utf-8為默認(rèn)特殊情況再說(shuō)。第三所有批量操作先打印計(jì)劃再執(zhí)行寧可多花五秒看輸出也不要一失手刪掉一堆文件。第四所有刪除操作都先軟刪除到回收目錄觀察幾天再物理清除。這幾條習(xí)慣沒有一條是高級(jí)技巧但每一條都幫我在真實(shí)項(xiàng)目里避免過災(zāi)難性的故障。文件操作這活看著簡(jiǎn)單出的問題往往是最隱蔽、最難以恢復(fù)的——文件刪了可以重新下載但配置覆蓋錯(cuò)了可能直接讓服務(wù)起不來(lái)。拿捏好os、pathlib、shutil這三個(gè)庫(kù)的分工再把這些防御式的習(xí)慣融入代碼里你寫的文件處理腳本就能從本地跑通升級(jí)成生產(chǎn)可靠。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
激情综合网五月| 婷婷五月天成人| 久久色五月天| 久久久久9久无码视频| 激情深爱五月| 丁香 婷婷 激情 综合 五月| 国产精自产拍久久久久久蜜 | 99r这里只有精品哦| 日韩一本操| 五月天亭亭俺也| 天天爽天天爽天天爽天天爽天天爽| 99亚洲视频| 五月丁香久久久日婷婷久久婷婷日| 26uuu亚洲| 久热播这里只有精品| 日本一级特黄大片AAAAA级| 六月丁香五月婷婷| 综合网天天| 五月丁香六月情| 天天摸.天天mo| 92久久久| 国产综合A片| 九九热精品视频在线观看| 亚洲另类噜噜| 五月色天情| 亚洲精99| 五月 丁香 欧美| 成人国产综合| 大香蕉久久久| 婷婷五月激情网| 伊人久久综合| 亚洲婷婷激情综合激情999精品| 97人人操人人爽| 丁香六月伊人| 五月天狠狠网| WWW.桔色成人.COM| 爆乳熟妇一区二区三区爆乳照片| 久久视频这里99| 午夜 外网 精品 在线| 久久九区| www.99热国产| 丁香五月激情视频在线| 严洲天天插| 婷婷色无码| 综合久久婷婷| 中文不卡一二三区| 色区域网站视频| 五月天成人手机在线视频| 亚洲综合色网站| 色婷婷综合网站| 操久久网| 99色视频在线观看| 另类小说激情五月天| 欧美激情-区二区三区| 激情都市五月天| 婷婷色五月情| 激情综合网五月| 超碰A V在线| 伊人久久婷婷五月综合97色| 亚洲在线成人| 九九热欧美| 婷婷丁香熟妇综合网| 99色色爰| 九九热这里只有国产精品| 久久婷婷丁香六月天| 99成人免费视频| 日韩在线五月天婷婷| 人人草人人爱手机视频看看 | AV在线免费播放| 操比激情五月综合| 99热99日…..| 欧美狠狠色| 天天日天天操心| 国产成人av在线播放| 色五月激情网| 伊人大香蕉综合在线| 五月丁香婷婷啪啪网| 操操精品| 激情五月天啪啪| 五月婷婷福利| 五月丁香网站| 色播色丁香五月| AV操逼网| 深爱激情网综合| 日本九婷婷| 超碰成人电影| 亚洲韩国日产综合AV| 激情啪啪五月天| 成人av在线网址| 五月开心婷婷中文字幕| 久久99热这里只有精品| 日本天天操| 超碰人妻公开在线| 国产激情久久久| 99热久久最新地址| 五月婷婷丁香在线| 亚洲AV免费国产电影| 大香蕉AV在线| 五月婷婷激情中文字幕| 熟女色色一区二区| 久久性爱视频免费| 九九人人操| 成人美女网| 91xxxx九色| 96丁香六月婷婷蜜桃综合久久| 91视频精品99| 激情美女五月天激情在线| 丁香六月婷婷一区二区三区| 狠狠干狠狠色| 97人人超| 激情亚洲婷婷| 丁香五月色色婷| 99色婷婷视频| 91日视频| 人人看人人97| 色婷婷五月中文字幕在线dvd| 日日夜夜噜噜爽爽| 夜夜撸夜夜骑| 国产韩日亚洲美州欧亚综合在线| 夜夜操少妇| 玖玖在线| 亚洲区视频| 精品国产va久久久| 超碰色热| 一本综合丁香日日狠狠色| 丁香色婷婷| 中文字幕性爱视频| 99re思思久久| 99在线播放| 南京搡BBBB搡BBBB| 五月天色综合| 丁香五月天色综合| 婷婷五月天小说| 超碰在线免费| 色墦五月丁香| 婷婷五月天中文字幕.| 天天干天天做| 涩五月婷婷| 国产真人做爰视频免费| 蜜臀A∨在线水帘洞| 97久久超碰| 色色婷婷色色| www.henhenl| a片在线免费观看一区| 日韩一级一片内射视频4K| 九六五月天婷婷| 日日天天干| jiujiujiuwuyuetian| 五月天婷婷视频30| 亚洲五月天色色| 亚洲成人乱码av网站| 婷婷丁香五月综合| 婷婷色日本| 国产,欧美,学生妹,视频| 欧日韩AV| 97碰碰草| 亚洲精品99| 91日在线视频| A级毛片高清免费不卡播放谢谢谢谢| 91狠狠综合久久久| 99 色色吧| 亚洲婷婷五月天| 一级片sese片.COM| 色99视频| 成人做爰A片免费看视频| 亚洲色精彩| 激情四射五月天| 99热r| 色丁香五月| 色婷婷基地在线| 人妻久久久久久久| 亚洲激情区| 欧美日韩国产一二区| 99色在线观看视频| 日韩在线观看亚洲| 婷婷五月花| 日日射天天射| 五月婷婷人人人操| 久久久天堂国产精品女人| 久久久五月四色| 亚洲在线成人| 99色视频| 婷婷五月激情丁香| 亚洲VA在线| 青青草性爱视频| 超碰人妻在线| 婷婷深爱五月| 五月天开心成人网| 亚洲一区二区无遮挡A片| 婷婷深爱五月亚洲综合| 亚洲性视频| 亚洲AV成人精品日韩在线播放| 男女久久婷婷五月天| 五月丁香久久激情综合| 久久人人看| 欧美成人无码一区二区三区| av最新在线| 成人va在线播放| 亚洲综合色丁香婷婷六月| 五月婷婷影视| 色婷婷中文在线| 超PEN精品在线| 午夜免费试看| 午夜日日| 91人久| 五月婷婷天天| 欧美综合激情五月| 欧美婷婷六月丁香综合色| 五月桃花网综合| 午夜成人AV在线| 天天日天天做天天操| 欧美乱码国产一级A片| 亚洲精品无码一区二区| 色欲婷婷五月天| 99久久综合精品五月天| 在线观看熟女少妇| 婷婷99| 96精品国产综合久久久久久| 精品久久久久成人码免费动漫| 色婷视频| 久久人妻精品| 五月天婷婷在线观看| 亚洲俩性性爱图片久久第六页| 人妻中文在线| 色色色99| 色婷婷先锋| 日日夜夜天天爽| 天天射综合网站| www.1024久久| 99热伊人综合| 丁香五月婷婷五月基地| 亚洲AV影片在线观看| 婷婷五月大香蕉| 久久人妻www| 五月花综合网| 五月在线婷色| 26UUU欧美激情一区二区| 久久亚洲婷婷| 日日肏夜夜干| xfplayav在线| 五月丁香六月停停| 狠狠五月综合在线 | www.99视频| 无码色色| 久久精典| 26uuu另类| 色综合色综合网| 天天做天天爱天天摸| 先锋男人91资源| 欧美婷婷丁香五月| 97精品自拍视频| 99综合在线| 黄网在线免费| 五月婷婷激情啪啪| 九九成年视频| 99热精品10| 免费观看日韩成人av| 天天躁日日躁狠狠躁日日躁2022年5月9日| 五月色 亚洲| 精热在线综合网| 久久激情综合| 99热这只有| 婷婷五月激情的图片| 九色91国产| 2015超碰| 五月丁香婷婷爱激情综合网| 五月丁香怕怕综合| 天天日婷婷| 激情深爱五月| 大香蕉五月丁香| 在线中文av| 五月丁香色| 丁香五月成人| 五月天婷婷色小说| 99精品国产乱码久久久人妻| 人妻VideOssS人妻高清| 影音先锋高清无码资源网| 激情综合网激情五月天| 丁香六月啪啪| 天天干天天日蜜臀av| 超碰cap| Y11111111111少妇电影院| 丁香六月婷婷久久亚洲天堂| www.超碰在线| 26UUU精品一区二区c〇m| 大香蕉院线| 五月婷亚洲精品| 五月天开心网| 禁欲电影完整版在线播放| 欧美色男人网站| 婷婷色无码| 玖操97| 婷婷五月在线播放| 夜夜干天天操| 丁香五月婷婷天堂大香蕉| 超碰在线人人| 日日舔夜夜操| 九九香蕉网| 婷婷五月娱乐在线| 热久久成人| 99re这里只有精品视频了| 97人人搞| 天天久久婷婷| 久久婷婷五月综合啪| 婷婷色网站| 99亚洲综合| 99热免费看| 丁香桃色网| 国产无套精品一区二区| 婷婷色五月在线视频| 精品人妻一区| 色综合久久无码| 婷婷五月天堂| 日日操夜夜骑| 久久99综合网| www.久热| 99免费| 少妇人妻人伦A片| 99这里只有| 99爱在线| 少妇激情五月婷婷| 26uuu欧美日本| 久久性都花花世界成人免费视频| 国产亚洲在线| 成人AV免费观看| 九九色热视频| 人妻熟人中文字幕一区二区| 91chinese在线| 国产综合网在线| 婷婷久久综合| 色综合色婷婷色伊人| 可以看的av网站| www.超碰97| 99操逼| 思思热在线播放| 亚洲亚洲人成综合网络| 色综天天综合| 色爱五月天| www.色九月| 色性日本| 狠狠操狠狠色| 五月婷婷六月奇米网丁香| 色色色综合色| 色五月婷婷狠狠撸| 亚洲天堂久久| 五五月五月| 久久伊人大香蕉| 美日韩成人| 玖玖在线视| 五月天之色情综合网| 五月WWW| www,999日本色| 99久久黄色顶级视频| 操碰91| 亚洲成人AV在线观看| 99精品无码| 久久久九九九 99| 六月婷婷久久大全| 丁香 亚洲 久久| 激情五月婷婷六月丁香| 69色婷婷| 色999亚洲人成色| 久久婷婷综合网| 丁香五月婷婷色情综合| 激情另类综合| 成人无码髙潮喷水A片| VA日本视频| 日本精品99| 色五月激情网| 日韩AV中文在线观看| 玖玖资源天天无码| 色婷婷九月综合| 99视频在线观看视频| 极品少妇高潮啪啪AV无码| 婷婷.com| 色婷丁香| 99热 在线观看| 色五月综合网| xxx综合在线| 国产小精品| 久久婷婷欧美| 9l视频自拍九色9l视频在线观看| 久久超级碰视频| 91视频一起草| 狠狠色综合无线观看| 26UUU亚洲欧美| 精品爱欲五| 婷婷开心激情五月激情网| 墨西哥毛片内射精| 色色色免费视频| 婷婷瑟五月天久久综合| 人人操超碰| 97婷婷狠狠久久综合9色| 深爱激情小说五月婷婷| 亚洲无码99| 色九月婷婷综合| 人妻久久久久久| 五月天五月色| 五月婷婷与六月丁香图片激情| 先锋av性爱成人电影| 色欲AVV| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 天天操比比| 只有精品视频在线观看| 色色综合网。| 久久五月天综合| 99热只有这里才是精品| 大香蕉av在线| 99超碰在线免费| 欧美婷婷五月丁香| 色色欧美色色| 日本在线免费中文com.| 99婷婷国产最新视频| 久久久久人妻| 日日插日日干| 五月丁香大香蕉| 另类图片色五月| 色域五月丁香| 九九热精品| www,天天干| 久久黄A片| 精品五月花| 五月丁香偷拍| 操日视频| 亚洲六月色| 亚洲午夜精品久久久久久人妖| 99热在线中文字幕| 日本熟女二区| 丁香五月亚洲婷婷| 婷婷久久久久久久| 色噜噜狠狠色综合日日| 91九色无码日韩| 淫视馆av三区| 五月综合激情婷婷六月色窝| 丁香花色色网| 色综合九九色综合88| 色性五月天| 日日操夜夜操狠狠操| 欧美在线视频免费播放| 婷婷新网址| 熟妇人妻中文字幕无码老熟妇| 色五月婷婷激情五月| 91综合国免费久入| 色婷婷五月天偷拍| www.99热这里精品| 成人网站高清无码| 96色婷婷| 九九Y精品热播| 九九热在线观看6| se婷97| 国产69久久久欧美黑人A片| 亚洲人妻av| 色婷六月| 五月停亭六月,六月停亭的英语| 2025最新亚洲激情在线| 综合激情五月综合激情五月激情1| 97超级碰人人| 91a片爽| 夜精品无码A片一区二区蜜桃| 婷婷丁香五月在线播放| 亚洲丁香五月天视频| 国产精品成人av在线观看春天| 五月激情射| 狠狠情色| 亚洲AV成人片无码网站| 色噜噜狠狠色综合无码久久欧美| 青青操丝袜美腿| 亚洲电影中文字幕| 九九热精品在线| 99热精品无码| 欧洲亚洲欧洲99久久| 99成人精品六| anquye伊人| 日本人妻伦在线中文字幕| 亚洲综合99| 日本三级大片| www.99色| 在线18av | 婷婷亚洲在线| 97色操| 99碰碰视频| 色亚洲无码| 久1色色| 丁香五月天激情AV| 欧美性爱五月天| 久热黄色| 中文成人在线| 日韩黄色电影| 六月婷婷网| 色情免费视频播放| 97精品自拍视频| 精品人妻伦一二三区久| 天天射天天操天天干| 丁香五月婷婷亚洲激情四射| 色婷婷影院| 天天操夜夜夜拍拍拍| 天天xxxxxx天天日| 亚洲欧美成人在线| 欧美熟女乱又伦| 综合五月天婷婷色| 色欲婷婷五月天| 亚洲乱码日产精品BD| 欧美日韩一区二区三区四区| 91一起艹| 婷婷五月丁香综合人妻| 色色五月婷婷| 国产操逼视频网站| 亚洲综合色网站| 26uuu精品一区二区| 五月花免费视频| 亚洲丁香婷婷| 婷婷丁香五月天综合AV| 色播播五月| 无码人妻丰满熟妇奶水区码| 亚洲综合五月天综合| 婷婷永久在线| 久99| 日本大逼91| 色五月丁香总合网| 超碰九九热| 色色色激情网| 丁香婷婷五月天校园春色| 色99欧洲色19| 国产亚洲精品久久久久久郑州| 色婷婷久久| 夜色五月天| www.色婷婷| 婷婷五月丁香基地| 婷婷色色欧美综合网| 婷婷在线精品| 丁香 久久| 91丨九色丨国产| 婷婷五月小说色综合| 欧美色色色色色| 一本大道伊人AV久久综合| 丁香六月激情四射| 天天爽夜夜操| 超碰在线观看caop| 久久色这里只有精品| 夜夜穞天天穞狠狠穞AV美女按摩| wwww.9免费视频| 五月丁香视频在线观看| 高清无码入口| 五月天综合在线| www.久久爱.com| 大香伊人婷婷影院| http://www.sd-xiangsu.com/| 丁香激情五月少妇| 五月丁香婷庭在线| 国产性av| 新激情五月天色播| 久久婷综| 深爱五月最新网址| 极品五月天| 婷婷五月色丁香在线看| 欧洲电影在线观看免费版英语版 | 密视AV综合在线| 激情五月六月丁香| 丰满少妇猛烈A片免费看观看| 欧美在线| 九九热这里都是精品6| 免费黄色片子| 99九九精品| 亚洲不卡| 91色婷婷综合久久中文字幕二区| 婷婷五月天首页| 亚洲精品久久久久AV无码| 天天做天天爱高潮片| 毛片新网地| 综合网狠狠| 月婷婷婷婷五月| 一区无码| 日本九九网| 婷婷伊人五月丁香天堂网| 人妻精品久久久久久久| 色爱综合五月| www.99精品在线| 五月丁香另类网| 裸体美女丁香五月天。| 亚洲AVwwwwwww| 最新va在线播放| 在线看av| 久久色天堂| 久久久久久久五月婷婷六月丁香综合,开心激情综合网 | 亚洲狠狠干| 欧美成人AAA片一区国产精品| 性生活视频98791| 99久在线| 《》【无码】想被搞到爽AV应募而来的超M素人 西纯子 10musume-011723-01 | CAoub青青超碰| 五月天播播中文字幕| 日本97久久久精品| 日韩aaaaa| 婷婷久久五月| AV成人在线网站| 亚洲色情网站| 99在线视频精品| 亚洲黄色影视| 五月丁香六月婷婷玖玖| 婷婷亚洲久久| 一起草AV| 五月婷亚洲精品| 97色干| 丁香九月婷婷| 婷婷婷婷婷婷婷五月丁香| 五月婷婷与六月丁香图片激情| 狠狠五月综合在线| 高清av在线国产| 丁香婷婷色色| 99热精在线九九久久保| 九九热99精品| XX色综合| 无码人妻一区| yazhou seshipin| 色五月婷婷丁香凹凸| 久草五月| 久热播这里只有精品| 大香AV| 荡乳尤物3HP1V5| 五月丁香六月婷婷在线| a69在线视频| 亚洲天堂有码| 激情综合网激情五月天| 色欧美影院| 色婷婷欧美在线| 第四色五月婷婷| 五月天婷婷色色| 婷婷无码五月天| 天天做天天干天天综合网| sewuyuetingtingiii| 九九热最新地址| 丁香五月天成人网站| 99噜噜噜在线播放| 婷婷综合亚洲| 久久丁香婷婷色情综合| 日韩aaaaa| 91超级碰在线| 99亚洲无码| 五月激情精品视频| www.91.com黄| 自拍视频99| 性爱网五月婷婷| 超碰二区| 五月丁香网站| 天天爽天天做| 色欲婷婷五月天| 97婷婷狠狠久久综合9色| 国产乱妇无乱码大黄AA片| 色九区| 26uuu国产| 天天操天天操综合| 九九热只有这里精品| 五月天婷婷色情| 99碰碰视频| 99婷婷色| 色约约视频一区二区三区四区五区| 就爱啪啪婷婷| 99久久人妻精品无码二区| 天天人人综合| 狠狠色97| 99热都是精品| 日日干天天爽| 丁香婷婷六月在线资源观看| 亚洲在线激情婷婷五月| 思思99精品视频在线观看| 97色色色| 黄色成人网站在线播放| 色婷婷丁香五月色综合网| 精品一区二区三区四区五区六区介绍| 九色综合五月天婷五月| 香蕉人妻AV久久久久天天| 精品一二三区久久AAA片| 激情五月天电影| 狠狠综合久久| 99热精品在线播放| 色噜噜狠狠色综合日日| 无码成人AAAAA毛片AI换脸| 99精品在线| 国产亚洲成AV人片在线观黄桃| 啪啪小说五月天| 激情婷婷五月天日本系列| 色婷婷九月综合| 天天插天天干天天舔| 伊人9999| 色色亚洲五月天| 日韩精品色| 婷婷 月 丁香| 久色激情| 亚洲男女激情| 亚洲乱码日产精品BD| 中文字幕婷婷9月天| 丁香五月综合网| 婷婷色狠狠| 欧美性久| 99精品视频在线观看免费| 美妞av| 婷婷丁香五月天在线视频| 五月综合激情视频| 五月天久久婷婷| 色色99| 色五月欧美| 免费观看18视频网站| 五月丁香在线观看国产| 久久综合色情网站| 玖月婷婷爱丁香| 99色播| 99免费热视频在线| 日日噜噜夜夜狠狠久久丁香五月| 五月丁香综合激情网| a久久| 大香蕉在九| 色玖玖玖| 丁香五月婷婷久久综合激情网 | 狠狠操.COM| 亚洲婷婷激情五月天| 五月丁香91| 乱精品一区字幕二区| 天天综合网色欲香| 久久久人妻不卡| 久久一二三视频| 天堂久久精品| 天堂婷婷综合| 狠狠干婷婷| 久久九九大香蕉电院| 婷婷综合网站| 六月婷婷天堂| 色色五月婷婷| 亭亭五月色男人| 色噜噜狠狠一区二区三区| 婷婷成人av| AA丁香综合激情| 五月天天爽| 色婷婷丁香五月| 伊人五月综合网| 日韩抽插操逼| 97超碰综合| 婷婷婷狠狠| 日韩黄色电影| 婷婷丁香激情五月天色色色| 成人av在线电影| 九九热经典视频在线观看| 亚洲五月婷婷| 99色五月| 五月深爱激情网| 五月丁香久久| -91九色大屁股| 五月丁香激情深爱婷婷| 26uuu成人网| 天堂网啪啪| 五月丁香花开综合网| WWW.婷婷| 殴美日比视频| 99久在线精品99re8热| 亚洲欧洲中文日韩久久AV乱码| 日本熟妇乱妇熟色A片蜜桃| 99er热精品视频| 国产性色蜜乳| 丁香五月婷婷啪啪| 综合网色| 991国产精选视频在线播放下载| 色五月亚洲| 色狠狠综合| 噜一噜在线| 久久婷婷的综合色丁香五月| 99色看| 思思re最新视频| 99色综合网| 五月激情六月综合| 大香蕉啪啪| 99精品色| 97丁香视频| 日日操日日爽| 热婷婷av| 草做免费在线观看| 色九月综合| 天天干夜夜欢| 任你爽在线视频| 就爱干 在线| 人妻无码视频网| www.久久五月天.com| 8090在线影视少妇| 五月天另类综合网| 性按摩玩人妻HD中文字幕| 丁香五月综合激情久久潮喷| 成人在线日韩| 国产裸舞福利资源在线视频| 色情综合| 九九热在线观看视频网站| 中文字幕日产A片在线看| 天天噪夜夜爽| 久久性都花花世界成人免费视频| 这里只有精品视频国产| 超碰91在线| 伊人丁香五月| 思思热精品免费视频| 草草夜夜操| 天堂草在线观| 九九视屏| 色综合综合色| 激情欧美婷五月| 96自拍视频九色在线观看| 人人人人人人人草| 色99视| 久热9| 激情5月舔| 亚洲操操操| 九九免费在线视频| 日本人妻伦在线中文字幕| 婷婷五月天成人综合网| ...婷婷五月综合不卡,国产在线手机| 色视五月天婷婷| 91九色超碰| 夜色综合网| 97色婷婷| 五月刺激丁香月综合| 开心五月网 | 狠狠色丁香乆乆| 五月开行婷婷色五月| 婷婷综合网性| 亚洲精品视频在线| 婷婷天天日婷婷| 另类图片色五月| 色噜噜丁香| 五月天激情婷婷| 国产精产国品一二三在观看| 五月丁香啪啪综合网| www狠狠| 精品99网站| AA片在线观看视频在线播放| 激情五月丁香五月| 丁香五月色| 婷婷综合玖玖五月| 天天噜日日噜综合无码| 亚洲噜色| 人人人操| 操逼电影免费看| 99人人干| 熟女激情五月天| 久久久婷婷| 国产性爱色| 婷婷五月色播| 日本狠狠干| 婷婷激情综合| 综合久久六月| 久热大香蕉| 久久五月综合| 综合色影院| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 色婷婷精| 亚洲色热| 九九热这里只有精品一| 99免费偷拍视频| 少妇伦子伦精品无吗| 色五月婷婷内射| 久久精彩视频| 亚洲精99| 色狠狠五月天| www.婷婷五月.com| 色婷婷六月| 99热婷婷| 狠狠色成人影片| 婷婷亚洲色| 亚洲色情免费网| 丁香婷婷色五月| 97婷婷在线| 国产原创视频91九色| 丁香五月影院| 五月色婷婷综合| 99亚洲精品| 婷婷亚洲欧美丁香五月| 丁香五月天殴美激情| 久久人妻久久久久| AV在线大香蕉| www.色色五月天.com| 婷婷五月丁香激情图片 | 狠狠爱激情网| 草五月| 婷婷五月色丁香在线看| 日韩av干| 久久婷婷五月综合啪| 成人免费黄色短视频| 妻久久久久| 婷婷五月激情欧美大胆视频| 色噜噜狠狠色综无码久久合欧美| 桃色激情婷婷伊人网| 五月丁香婷婷综合网| 精品一二三区久久AAA片| 思思久久青草热| 91久久色| 久久视频婷婷| 五月婷婷丁香综合,亚洲天堂| 99免费| 五月天婷婷导航| 伊人日日干| 久久久er热| 婷婷五月天视频小说| 色五月丁香五月五月婷婷| www.狠狠艹| 国产免费一区二区三州老师F1…… | 少妇性按摩无码中文A片| 婷婷五月天激情影片| 深爱五月激情| 婷婷色狠狠| 婷婷色婷婷| 五月丁香六月婷婷综合网| 久久99热这里只频精品6学生| 久久九九热视频| 国产成人AV在线播放| Www.狠狠| 精品动漫 无码av| 激情文学 综合 九月| 婷婷狠狠综合网入口| 欧美色综合天天久久综合精品| 一级黄色尤物综合视频手机在线观看| 蜜乳.comcom| 五月六月丁香婷婷在线观看| 亚洲欧洲色色| 丁香五月婷婷亚洲另类| 婷婷色情五月| 久久久久久人妻| 九九人人操| 激情婷婷丁香| 在线观看日韩12345区| 五月丁香婷婷欧美色图视频五月丁香777电影 | 久久小视频| 婷婷五月丁香综合| 日日色综合| 桃色五月婷婷| 丁香六月青青草| 婷婷伊人| 五月精品免费XXX| 996日日爱| 99色干| 亚洲无码99| 9l久久久视频| 婷婷激情性爱| 韩国婷婷丁香五月| 婷婷丁香五月色| 色五月婷婷久久| 人妻丰满精品一区二区A片| 狠狠色婷婷色| 九九国产视频| 99久久精品视频女神1| 激情五月婷| 五月激情小说| 色九九九九| av婷婷丁香 六月| 久久久久久人妻久久久久久久久久人妻久久久 | 99操九九网| 色V狠狠的干| 91视屏在线观看com.wwwvv| 狠狠操狠狠做| 狠狠穞A片一區二區三區| 五月丁香综合色婷婷| 色婷婷中文在线| 初夜av| 99久久婷婷| 99久操视频| 丁香五月天无码AV| 婷婷五月天在线观看第二页| 少妇综合网| 激情婷婷五月在线合集| 亚洲操操| 五月天激情小说| 桃色五月天| 9久久婷婷国产综合精品性色| 久久婷婷五月综合色奶水99啪| 日本久久人人| 六月色国内综合| 激情五月天婷婷| 我想看国产大学生口爆吞精的视频| 九九色天堂| 婷婷丁香熟妇综合网| 五月天亚洲综合网| 色九九综合色| 亚洲精品色色| 狠狠色丁香婷婷久久综合| 国产69精品久久久久999小说| www.韩日视频| 免费成人va| 在线播放中文字幕| 丁香五月婷婷影视先锋| 日日噜人人人做人| AV网站免费在线| 激情五月婷色| 狠狠五月天激情| 久久久网站| 色九月婷婷| 在线综合网| 91大操| 午夜婷婷五月天在线| 俺去也五月天| 久久人人看| 天天干天天操天天射| 婷婷黄色五月| 丁香五月婷久久| 超PEN精品在线| www·五月天| 日韩另类| 伊人丁香六月婷婷| 在线播放成人网站| 婷婷色网站| 99激情网| 任你操精品免费| 在线观看亚洲AV| 伊人丁香五月婷婷潮吹| 色婷婷社区| 亚洲日比视频| 婷婷五月天在线观看第二页| 国产精品成人网址| 色婷婷九月综合| 久久丁香综合精品综合| 婷婷日日天天| 五月天婷婷激情六月久久 | 久久99热免费| 日日干夜夜干| www.激情五月天.com| 狠狠干综合| 在线五月色播| 大伊香蕉精品视频在线| 天天更新天天亚洲| 国产XXXX搡XXXXX搡麻豆| 婷婷五月天激情偷拍| 激情小说五月天| 99久久99热这里只有精品| 国产偷人爽久久久久久老妇APP | 久久A热| 欧美特大片黄| 亚洲亚洲永久无码777777| 99热99| 丁香六月婷婷综合缴| AV色婷婷| 超碰在线99| 狠狠肏综合网| www.cao.com久久| 天天激情欧美美女| 超碰人人在线| 久久香蕉影院| 五月激情网综合| 欧美色偷拍| 热九九精品| 五月综合在线婷婷图片| 伊人丁香五月天丁香在线婷| 婷婷成年人免费视频| 日本久久婷| 天天日日夜夜| 丁香婷婷色| 超碰资源在线| 婷婷久久综合久| www夜夜操com| 国产熟女大叫受不了| 色婷婷狠狠| 六月婷婷国产| 国产9色在线/日韩| 精品无码久久久久久久久| 五月婷婷开心丁香| 久久99精品视频| 婷婷五月丁香五月天| 久久久久98| 日韩丰满少妇无码内射| 思思热在线播放| 天天色天天搡| 久9精品视频在线| 91色久| 四月婷婷丁香| 在线中文av| www99精品在线观看| 婷婷五月天激情网| 丁香五月AV综合激情| 激情啪啪五月| 另类少妇人与禽zOZZ0性伦| 丁香五月偷拍| 五月婷婷伊人网| 婷婷激情五月视频| 日本欧美成人片AAAA| 五月天天天天天天天天天天天天天天天婷婷婷| www.99热视频| 婷婷丁香五月基地| 久久狠狠干| 九九热在线精品| 激情综合网,五月| 9999热在线观看| 五月天色色无码| 天堂草在线看www| 五月婷婷色男女| 91在线日| 嘿嘿视频免费看9| 九色PORNY9l原创自拍| 另类 在线| 99色视频在线观看| 掩去也综合五月视频| 99色爱| 五月丁香啪啪综合| 丁香五月天亚洲视频| 天天日夜夜草进麻麻的子宫| 伊人婷婷五月天| 色九九七七| 狠狠一日| 日韩中文字幕| 五月天狠狠| www,com,五月色色| 五月婷婷激情综合网 | 久久免费婷婷视频| 婷婷丁香五月久久| 九九综合九九| 色情五月天。| 色色影院黄大片| 99re欧美精品| 欧美 日韩 人妻 高清 中文| 色情五月婷婷| 激情綜合網址| 欧美色性色好| 啪啪婷婷五月天激情| 婷婷五月天av网| 婷婷啪啪| 思思99久久| 国产激情在线| 午夜成人综合| 99热一本久道| 综合精品啪啪| 欧美色偷偷大香| 在线中文AV| 丁香五月激情图片婷婷| 免费视频在线观看的网站| 天天操综合网| 久久9视频| 黄网在线播放| 996er热| 五月丁香综合激情| 丰满少妇猛烈A片免费看观看| www.色9| 五月综合久久| 99热这里只有精品33| 亚洲五月天综合| 五月天成人手机在线视频| 91日本在线观看| 另类图片天天影视在线观看| 91色五月| 日韩不卡DvD| 五月天婷婷xxx| 亚洲综合视频天天精品| 欧美久久婷婷| 色婷婷婷av | 丁香五月婷婷色播艳门照| 亚洲国产成人裸舞| 色色婷婷五月天| 成年人看Va免费视频| 婷婷欧美偷拍综合| 操人妻90p| 丁香六月天色婷婷| 五月丁香婷婷婷婷综合网| 亚洲 五月 婷婷 成人| 夜夜操,天天撸| 天天狠天天叉| 天堂久久婷婷| 激情综合网五月激情| 99热网站| 亚洲精品白浆高清久久久久久 | 江苏少妇性BBB搡BBB爽爽爽| 五月天久久色| 久久婷婷免费| 久久婷婷丁香| 97色婷| 色之综合网| 天天色综合综合| 婷婷色综合| 五月婷婷av| 白人荫道BBWBBB大荫道| 色五月激情图片| 欧美日韩五月婷婷| 欧美精品99久久久| 欧美视频在线观看噜噜| 色丁香五月天婷婷| 日本一道久久| 五月色综合| 香蕉久久五月| 在线中文av| 五月婷婷精品视频| 欧美丁香婷婷五月天| 亚洲综合在线视频| 久久人人添人人爽添人人片αV | 国产五月婷| 五月激情婷婷国产精品久久久久久| 丁香六月天之亚州热女 | 色欲色香综合网| 亚洲无线视频| 男女啪啪做爰高潮无遮挡| 色一情一乱一乱一区9| 欧美日本国产欧美日本韩国99| 97干在线看| 狠狠婷婷爱| 久久98热re| 开心激情站| 婷婷综合在线播放| 五月青青草综合| 五月丁香六月玩女人| 亚洲乱码日产精品BD| 97色色综合| 色综合久久伊伊婷婷五月| 殴美日韩成人| 久久精品一区二区三区四区| av免费在线网站| 激情久久五月网| 成片免费观看视频大全| 五月开心网| 丁香六月| 久久九九在线视频| 人妻22p| 伊人热婷婷| 69午夜成人影片| 五月天激情影院| 丁香五月婷婷国产av| 五月婷婷六月丁香免费| 久久五月丁香| 久久亚洲激情五码| 日都一级A片| 婷婷亚洲在线| 67194国产| 色婷婷情片| 色丁香五月综合网| 另类图片五月天| 色人久夂| 色五月色五天免费视频| 人人色人人弄人人操| 在线91日韩| 婷婷香五月综合激情| 99性爱视频| 久久综合婷婷| 日韩淑女人妻luan伦激情精品一区二| 99欧美| 丁香婷婷五月综合影院| 精品三区影院| 一本大道伊人AV久久综合| 99爱视频精品在线观看| 精品亚洲VA网站| 97操在线| 天天草天天日| 亚洲亚洲人成综合网络| 久久永久视频| 九九热视频99| 99久久精品国产色欲| 激情宗合哪里能看| 99综合视频一体| 亚洲国产成人综合| 99热爱爱干干日| 99热 在线播放| 99在线小视频| 天天网曰日曰夜夜综合永久免费| 狠狠色婷婷丁香五月| 婷激情五月| 天天干天天av天天射| 九九热这里只有精品9| 日韩婷婷| 色婷婷丁香五月天在线视频| 天天色视频| 七月激情六月婷婷综合在线播放| 五月婷婷视频啪啪美女| 久草热久草在线视频| 激情丁香久久| 亚洲热综合| 99爱欧美| 国产亚洲精品久久久久久久久动漫 | 婷婷色情 | 激情综合五月色在线| 99热综合| 五月香婷婷|