問(wèn)題
環(huán)境:python3.7.16 win10
相對(duì)路徑問(wèn)題
因?yàn)閜ython的執(zhí)行特殊性,使用相對(duì)路徑時(shí),在不同路徑下用python指令會(huì)有不同的索引效果(python的項(xiàng)目根目錄是根據(jù)執(zhí)行python語(yǔ)句時(shí)的根目錄,像是其他項(xiàng)目因?yàn)橛邪芾砉ぞ遶ue-cli或webpack等進(jìn)行管理,會(huì)固定項(xiàng)目根目錄),所以最好規(guī)定執(zhí)行項(xiàng)目路徑。
上圖中第一次運(yùn)行跟路徑是’S:\varcode-project\py’,第二次是’S:\varcode-project’
絕對(duì)路徑問(wèn)題
使用絕對(duì)路徑時(shí),項(xiàng)目移動(dòng)時(shí),索引基本會(huì)發(fā)生錯(cuò)誤(因?yàn)轫?xiàng)目的路徑變化了)。
解決
因此,最好使用絕對(duì)路徑+相對(duì)路徑組合的形式。只要我規(guī)定文件內(nèi)路徑按照項(xiàng)目路徑來(lái)寫(xiě)相對(duì)路徑,并通過(guò)絕對(duì)路徑計(jì)算出當(dāng)前項(xiàng)目路徑,將兩者加以組合,那么無(wú)論項(xiàng)目如何移動(dòng)路徑索引都沒(méi)問(wèn)題了。
os庫(kù)
import os
# 絕對(duì)路徑
absolute_path = os.path.abspath(__file__)
# 相對(duì)路徑
relative_path = "..\data\歷史時(shí)間序列表.csv"
# 連接路徑
combined_path = os.path.join(absolute_path, relative_path)
print(absolute_path, relative_path)
print(combined_path)
很明顯出現(xiàn)拼接錯(cuò)誤,os.path.join函數(shù)只能將’s:\path’與’data.csv’組合,即在兩個(gè)字符串中間簡(jiǎn)單加個(gè)’\',并不能正確解析雙點(diǎn)‘..’的意義,因此這個(gè)方法不行。
pathlib庫(kù)
from pathlib import Path
# 相對(duì)路徑
relative_path = Path("..\data\歷史時(shí)間序列表.csv")
# 獲取絕對(duì)路徑
absolute_path = relative_path.resolve()
print(relative_path)
print(absolute_path)
一樣會(huì)根據(jù)python語(yǔ)句的執(zhí)行目錄發(fā)生變化,因此這個(gè)方法也不行。
最終解決
os庫(kù)藏了一個(gè)很雞賊的方法os.path.normpath(path),并且無(wú)論你是問(wèn)chat-gpt還是自己搜索相關(guān)問(wèn)題,都不會(huì)給出這個(gè)函數(shù)。
import os
# 絕對(duì)路徑
absolute_path = os.path.abspath(__file__)
# 相對(duì)路徑
relative_path = "..\data\歷史時(shí)間序列表.csv"
# 先將當(dāng)前文件的絕對(duì)路徑的目錄和相對(duì)路徑拼接,然后使用normpath進(jìn)行路徑規(guī)范化
combined_path = os.path.normpath(os.path.join(os.path.dirname(absolute_path), relative_path))
print(absolute_path, relative_path)
print(combined_path)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-743040.html
最終解決2
可能有小伙伴發(fā)現(xiàn)以上方案還是不能使代碼在linux上正常運(yùn)行。
這是因?yàn)樵趌inux路徑分割符不是反斜杠’\‘,而是斜杠’/',具體參考這篇文章。并且使用斜杠后windows上的代碼也能正常運(yùn)行,因此最好培養(yǎng)自己寫(xiě)路徑用斜杠的好習(xí)慣。修改代碼如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-743040.html
import os
# 絕對(duì)路徑
absolute_path = os.path.abspath(__file__)
# 相對(duì)路徑
relative_path = "../data/歷史時(shí)間序列表.csv"
# 先將當(dāng)前文件的絕對(duì)路徑的目錄和相對(duì)路徑拼接,然后使用normpath進(jìn)行路徑規(guī)范化
combined_path = os.path.normpath(os.path.join(os.path.dirname(absolute_path), relative_path))
print(absolute_path, relative_path)
print(combined_path)
到了這里,關(guān)于【python】路徑管理+路徑拼接問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!