【问题标题】:Python os.getcwd() is not working on subfolders in VSCODEPython os.getcwd() 不适用于 VSCODE 中的子文件夹
【发布时间】:2023-03-14 07:44:01
【问题描述】:

我有一个从 Jupiter Notebook 转换而来的 python 文件,并且该文件夹中有一个名为“datasets”的子文件夹。当我尝试使用以下代码打开该“数据集”文件夹内的文件时:

import pandas as pd
# Load the CSV data into DataFrames
super_bowls = pd.read_csv('/datasets/super_bowls.csv')

它说没有这样的文件或文件夹。然后我添加这一行

os.getcwd()

输出是项目的顶级文件夹,而不是这个python文件的子文件夹。我想也许这就是它不起作用的原因。

那么,如何打开带有相对路径的 csv 文件?我不想使用绝对路径,因为此代码将在另一台计算机中使用。

为什么 os.getcwd() 没有得到实际的文件夹路径?

【问题讨论】:

  • 在 Jupyter 单元格上键入 pwd 时会看到什么?
  • os.getcwd() 工作正常。问题在于你的期望。当前工作目录是运行 Python 的目录,而不是任何特定源文件的目录。
  • 奇怪的是,在我的 Jupiter Notebook 我有pd.read_csv('datasets/super_bowls.csv'),它就像一个魅力。但是当我在直接 .py 文件上运行代码时,它不会。
  • 当我输入 pwd 时,它会给我顶级文件夹。我的结构是“/Users/ivanparra/AprendizajePython/jupyter/datasets”。主文件位于 Jupyter 文件夹中,csv 位于 datasets 子文件夹中。
  • 如果 python 文件在运行时是包的一部分,那么当前工作目录将是第一个 dunder init 文件所在的文件夹。但是如果你直接运行一个没有它的包的模块,那么这个工作目录将是 python 文件所在的位置。

标签: python pandas visual-studio-code


【解决方案1】:

根据我的观察,移动到父目录的点 (.) 符号有时不起作用,具体取决于操作系统。我通常会做的是使其与操作系统无关:

import pandas as pd
import os

__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))

super_bowls = pd.read_csv(__location__ + '/datasets/super_bowls.csv')

这在我的 windows 和 ubantu 机器上同样适用。 我不确定是否有其他更好的方法来实现这一目标。有的话想听听。

【讨论】:

  • 非常感谢。我帮了我很多!研究更多关于这些 os 模块的信息,我得到了一个更短的版本来工作。 import pandas as pd import os currentPath = os.path.dirname(__file__) super_bowls = pd. read.csv(currentPath + '/datasets/super_bowls.csv')
【解决方案2】:

答案就在 user2357112 的回复中: os.getcwd() 工作正常。问题在于你的期望。当前工作目录是运行 Python 的目录,而不是任何特定源文件的目录。 – user2357112 支持 Monica 5 月 22 日 6:03

解决办法是:

    data_dir = os.path.dirname(__file__)

【讨论】:

    【解决方案3】:

    (已编辑)

    根据您在下面的评论,当前工作目录是

    /Users/ivanparra/AprendizajePython/

    当文件在里面时

    /Users/ivanparra/AprendizajePython/Jupyter/datasets/super_bowls.csv

    因此,转到当前工作目录 (CWD) 的 datasets 子文件夹会将您带到不存在或不包含您要查找的文件的 /Users/ivanparra/AprendizajePython/datasets

    你可以做以下两件事之一:

    (1) 使用文件的绝对路径,如

    super_bowls = pd.read_csv("/Users/ivanparra/AprendizajePython/Jupyter/datasets/super_bowls.csv")

    (2) 使用正确的相对路径,如

    super_bowls = pd.read_csv("./Jupyter/datasets/super_bowls.csv")

    还有 (3) - 使用os.path.join 将 CWD 联系到相对路径 - 与 (2) 基本相同。 (你也可以使用

    【讨论】:

    • 我这样做了,把点放在斜线之前,但它不起作用。
    • @IvanParra 您能否将文件的真实位置和当前工作目录添加到问题中?
    • 是的,主文件.py的真实位置是"/Users/ivanparra/AprendizajePython/Jupyter",在那个文件夹里面是一个子文件夹/datasets/,csv文件在哪里。
    • @IvanParra 你能把 os.getcwd() 的结果打印出来并贴在这里吗?
    • 是的。 /Users/ivanparra/AprendizajePython/
    【解决方案4】:

    试试这个代码

    super_bowls = pd.read_csv( os.getcwd() + '/datasets/super_bowls.csv')
    

    【讨论】:

    • 它有效,谢谢。但这一切的重点是这段代码将在另一台计算机上,也许那里的文件结构会有所不同。如何获取当前文件的相对路径,而不是 python 正在运行的文件的相对路径?
    【解决方案5】:

    几年前我就注意到了这个问题。我认为这是设计风格的问题。问题在于:您的工作区文件夹只是一个文件夹,而不是项目文件夹。大多数情况下,您的相对参考是基于当前文件的。

    VSCode 实际上支持 cwd 的动态设置,但这不是默认的。如果你的工作文件夹不是一个严谨专业的项目,我建议你在launch.json添加如下设置。这是您需要的最简单的答案。

    "cwd": "${fileDirname}"
    

    【讨论】:

    • 你能解释一下你只是一个文件夹而不是一个项目文件夹是什么意思吗?我迷失了那个参考。
    【解决方案6】:

    感谢所有试图帮助我的人。感谢 Roy2012 的回复,我得到了一个适合我的代码。

    import pandas as pd
    import os
    
    currentPath = os.path.dirname(__file__)
    
    # Load the CSV data into DataFrames
    super_bowls = pd.read_csv(currentPath + '/datasets/super_bowls.csv')
    

    os.path.dirname 为我提供了当前文件的路径,并让我使用相对路径。

    '/Users/ivanparra/AprendizajePython/Jupyter'
    

    它就像一个魅力!

    P.S.:附带说明一下,os.getcwd() 的行为在 Jupyter Notebook 中与在 python 文件中完全不同。在笔记本中,该函数给出了当前文件路径,但在 python 文件中,给出了顶层文件夹路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 2017-04-12
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多