」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼Python專案中的相對路徑會導致檔案未找到錯誤?

為什麼Python專案中的相對路徑會導致檔案未找到錯誤?

發佈於2024-11-07
瀏覽:385

Why Do Relative Paths in Python Projects Lead to File Not Found Errors?

在 Python 專案中使用相對路徑存取檔案

在 Python 專案中操作檔案時,為了方便起見,通常會使用相對路徑。然而,它們的行為可能變得不明確,特別是在處理多層次專案結構時。

考慮以下專案佈局:

project
    /data
        test.csv
    /package
        __init__.py
        module.py
    main.py

Module module.py 嘗試使用相對路徑讀取 ../data/test.csv 中的文件,但在執行 main.py 時,會出現錯誤,指示找不到該文件。這種明顯的不一致源於這樣一個事實:根據腳本的執行位置,相對路徑的解析方式不同。

對於 __init__.py 和 module.py,路徑是相對於包含這些的目錄進行評估的檔案。然而,對於 main.py 來說,路徑是相對於它自己的位置的。

解決路徑歧義

要解決這種歧義,可以使用絕對路徑。或者,更優雅的方法是利用 Python 的 __file__ 屬性:

from pathlib import Path

path = Path(__file__).parent / "../data/test.csv"

with path.open() as f:
    test = list(csv.reader(f))

此技巧依賴 Python 3.4 pathlib 模組,並根據目前腳本的位置建構絕對路徑。

支援較舊的Python 版本

如果仍在使用低於3.4 的Python 版本,另一種方法是操作當前路徑:

import csv
import os.path

my_path = os.path.abspath(os.path.dirname(__file__))
path = os.path.join(my_path, "../data/test.csv")

with open(path) as f:
    test = list(csv.reader(f))

此方法結合了 os.path 函數以達到與基於 pathlib 的方法相同的結果。

最新教學 更多>
  • 什麼是 FHIR?
    什麼是 FHIR?
    介紹 與 fhir 相關的儲存庫清單 - Awesome-fhir 快速醫療保健互通性資源 FHIR 伺服器是一款強大的工具,徹底改變了醫療保健產業。 它充當存取和交換關鍵醫療資料的網關,實現不同系統和組織之間的無縫互通性。 什麼是 FHIR 伺服器? FHIR...
    程式設計 發佈於2024-11-07
  • 為什麼常數引用可以延長 C++ 中臨時變數的生命週期?
    為什麼常數引用可以延長 C++ 中臨時變數的生命週期?
    透過常數引用擴展右值生命週期在C 中,常量引用不僅充當不可變別名,還可以延長臨時變量的生命週期。為什麼 C 委員會決定要實現此行為? 此功能的一個基本原理是隱藏類別和函數的實作細節。考慮一個可以傳回行向量或列向量的矩陣類別。為了最佳化效能,類別可以選擇根據其行優先或列優先組織傳回內部值的參考。透過要...
    程式設計 發佈於2024-11-07
  • 如何在 Go 中將切片作為可變參數傳遞?
    如何在 Go 中將切片作為可變參數傳遞?
    將解壓縮的切片作為可變參數傳遞在 Go 中,可變參數函數接受不定數量的特定類型的參數。將切片的切片傳遞給此類函數時,了解所涉及的類型轉換和解包機制至關重要。 如果切片包含與可變參數參數類型相同的元素,則可以在不使用切片的情況下傳遞切片拆包。然而,如果切片中包含多種類型的混合或切片中包含切片,情況會變...
    程式設計 發佈於2024-11-07
  • 使用 TypeScript 和語義版本控制建立並發布 npm 庫
    使用 TypeScript 和語義版本控制建立並發布 npm 庫
    ?编写并发布最少的代码 要在 npm 上发布库,您需要: 一个npm 帐户;您可以在这里注册。 您的代码作为一个项目;即,您的代码目录中有一个 package.json,其中指定了名称和版本。请注意,您可以通过以下方式生成此文件: npm init 项目中的index.js。请记住...
    程式設計 發佈於2024-11-07
  • 如何將包含的 PHP 腳本的值傳回主腳本?
    如何將包含的 PHP 腳本的值傳回主腳本?
    從包含的 PHP 腳本返回在 PHP 中,return() 函數通常用於退出腳本或函數。但是,它不能用於從包含的腳本返回到主腳本。 要從包含的腳本返回並恢復主腳本中的執行,請考慮使用以下技術: 1.使用輸出緩衝:在包含的腳本內,使用ob_start() 將要傳回的輸出儲存在變數中。然後,在主腳本中,...
    程式設計 發佈於2024-11-07
  • samwise-CLI:開源 Terraform 模組依賴性追蹤器
    samwise-CLI:開源 Terraform 模組依賴性追蹤器
    地形 Terraform 是一種用 Hashicorp 配置語言 (HCL) 編寫的基礎設施即程式碼 (IaC) 工具。本文假設讀者已經使用 Terraform 並了解模組的工作原理。 在 Terraform 中編碼的每個人都創建了自己的模組,或至少使用了其他人的模組。 ...
    程式設計 發佈於2024-11-07
  • CSS 鮮為人知但有用的功能
    CSS 鮮為人知但有用的功能
    CSS 有一些鲜为人知但有用的功能。我们将研究其中的一些。 1. CSS的scroll-snap-type属性和scroll-snap-stop属性 滚动快速停止 当为父元素下的每个子元素设置此属性时,当您快速滚动屏幕时,使用触控板或触摸屏快速滚动时将阻止下一个元素通...
    程式設計 發佈於2024-11-07
  • PHP中參數替換後如何用PDO確定最終的SQL查詢?
    PHP中參數替換後如何用PDO確定最終的SQL查詢?
    透過PDO 在PHP 中確定最終的SQL 參數化查詢對於存取MySQL 資料庫時在PHP 中透過PDO 進行參數化查詢,獲得最終結果標記替換後的SQL 查詢可能具有挑戰性。 PHP 環境不會保留完整的查詢,因為它將標記的查詢與參數分開傳送到資料庫。 答案 1:如 Ben James 指出的,在 PH...
    程式設計 發佈於2024-11-07
  • 如何在循環中建立動態變​​數名稱:數組方法
    如何在循環中建立動態變​​數名稱:數組方法
    循環中的動態變數名稱在嘗試使用標記 i 在循環中建立動態變​​數名稱時,遇到語法錯誤。為了解決這個問題,讓我們探索一種使用陣列的替代方法。 陣列標記被初始化為空。在循環內,數組的每個元素都被分配一個與第 i 次迭代相對應的值。 var markers = []; for (var i = 0; i ...
    程式設計 發佈於2024-11-07
  • 為什麼 `localhost` 和 `127.0.0.1` 在 PHP 的 `mysql_connect()` 中表現不同?
    為什麼 `localhost` 和 `127.0.0.1` 在 PHP 的 `mysql_connect()` 中表現不同?
    為什麼 localhost 和 127.0.0.1 在 PHP 的 mysql_connect() 中表現不同? 在 mysql_connect() 中使用 localhost 會使連線比使用 127.0.0.1 更快? 在 mysql_connect() 中使用 localhost 和 127.0...
    程式設計 發佈於2024-11-07
  • 城市技術趨勢開發人員指南
    城市技術趨勢開發人員指南
    想像一下,在一個地方,廢物可以轉化為資源,交通順暢,建築物可以自己產生能源。由於科技的進步,這個未來願景正開始成為現實。 我們將在這篇文章中探討城市科技的最新發展,並為開發商如何為更有效率和永續的未來做出貢獻提供實用建議。 好奇城市如何像一個活的有機體一樣思考、呼吸和反應?發現物聯網在智慧城市...
    程式設計 發佈於2024-11-07
  • 如何在Java 8中實作嵌套物件的多層分組?
    如何在Java 8中實作嵌套物件的多層分組?
    Java 8 中的多層分組使用Nested GroupBy本文探討了在處理嵌套類別時如何實現多層分組Java 8 。具體來說,目標是按 key1 欄位對項目進行分組,然後對於每組項目,進一步按 key2 欄位對它們進行分組。最終,輸出應該是一個以 key1 作為外鍵的映射,以及一個 key2 到子項...
    程式設計 發佈於2024-11-07
  • 如何:身份驗證
    如何:身份驗證
    在建立 Web 應用程式時,安全地管理使用者驗證非常重要。兩個重要的庫是: bcryptjs – 用於安全地散列和比較密碼。 JSON Web 令牌 – 用於簽署和驗證 JWT 令牌以進行使用者身份驗證。 我們將介紹如何在 Node.js 應用程式中實作這兩個函式庫,以實現安全密碼管理和基於令牌...
    程式設計 發佈於2024-11-07
  • 如何在 MySQL 分頁中保持隨機排序而不出現重複或固定首頁結果?
    如何在 MySQL 分頁中保持隨機排序而不出現重複或固定首頁結果?
    具有隨機排序的PHP MySQL 分頁在MySQL 分頁中維護隨機排序可能會在試圖防止重複結果並確保不同的集合時帶來挑戰第一頁。以下是這些問題的解決方案:1。防止重複結果要排除後續頁面上先前看到的結果,請使用基於先前提取的行的排除條件來增強 SQL 查詢。利用 PHP 陣列儲存所取得的內容,並在查詢...
    程式設計 發佈於2024-11-07
  • 如何在 PHP 中根據字邊界截斷字串?
    如何在 PHP 中根據字邊界截斷字串?
    在PHP 中根據單字邊界縮短字串在PHP 中,substr() 函數提供了一種截斷字串的便捷方法。但是,預設情況下,它不考慮單字邊界,這可能會導致摘錄不完整或尷尬。 為了解決這個問題,我們可以修改我們的方法來優先保留整個單字。考慮以下程式碼片段:$big = "This is a sent...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3