在 Python 中的子目录之间引用文件的正确方法和 VSCode 设置是什么

问题描述

我有一个包含几个子文件夹的文件夹,如下所示:

my-project/
  input/
    data.csv
  src/
    script.py

我想从 my-project/input/data.csv 内的 script.py 读取数据,所以我有

import pandas as pd
data = pd.read_csv('../input/data.csv')

但是,我的工作区是 my-project,所以当我运行 script.py 时它返回:

发生异常:FileNotFoundError [Errno 2] No such file or 目录:'../input/data.csv

这是可以理解的,因为 inputmy-project 之内,不在同一级别。但是,使用 .. 来指代确实感觉是指代 data.csv 的正确方式,就像我们从 script.py 中所做的那样。但也许我错了?

如果这是引用我的数据文件的合理方式 - 我如何设置 VSCode 以便能够在不返回错误的情况下运行脚本?我认为应该有一种方法可以将子文件添加搜索路径中,而无需将子文件夹作为工作区打开,但是我在尝试找到它时运气不佳。

@Edit:请注意,我知道相对/绝对路径的概念。这个问题更多的是关于 VSCode 设置。我也愿意接受这个答案:“不,在这个设置中用 ../input/data.csv 指代是愚蠢的事情。你应该用 input/data.csv 来指代,因为......”(这与我的自相矛盾)目前的理解,但我可能完全错了,我很乐意学习不同的观点)

解决方法

我相信这比你想象的要简单,让我们一起来做吧!

  1. Creating empty folder

  2. Openning it with VSCode

使用的扩展...

  1. Extensions

我相信下面的步骤并不难!

  1. Essential steps

将默认解释器切换到创建的虚拟环境

  1. Virtual environment

创建一个简单的launch.json,选择简单的python脚本

  1. Creating launch.json

  2. Launch.json file sample

现在猜猜怎么着!我们现在要做的就是在编辑器中选择一个 script.py 文件,然后....... RUN!

  1. After running a script

您可以在终端中看到结果。

让我们谈谈...

生成的launch.json文件会强制我们在每次要启动程序时在我们点击开始按钮之前在编辑器中选择**src.script.py",如果你愿意,我可以建议一个更合适的方法

在第 6 步中,您可以选择 Module 而不是 Python 文件,之后编辑器会提示您输入模块名称的字段,我们的输入必须是 src.script.

我们将得到这样的 launch.json 文件......

New launch.json

现在,我们可以从我们想要的地方启动程序,这意味着如果编辑器中打开的文件是“src/data.json”,例如, 转到调试器部分并单击开始将始终启动 src/script.py 文件。

,

如果您在工作区中运行脚本,那么 input/data.csv 应该可以工作。 位置不是基于您的脚本所在的位置,而是基于您运行它的位置。

要获取当前工作目录,您可以使用

import os
print(os.getcwd())

然后从那里开始。

编辑:您可以更改 launch.json 中的工作目录,如下所述:https://stackoverflow.com/a/55072246/14246131

,

通过设置launch.json

"cwd":"${fileDirname}"

// or use "cwd":"${workspaceFolder}/src" to specifically assign /src as your current working directory

那么所有相对路径都从您正在运行的 py 文件开始(在您的情况下为 my-project/src),您应该可以使用:

data = pd.read_csv('../input/data.csv')

可以在此处引用 launch.json 变量:Is it wrong to change a block element to inline with CSS if it contains another block element?


这是我的示例环境供您参考:

文件结构:

my-project/
  .vscode/
    launch.json
  input/
    xxxxx.txt
  src/
    main.py

launch.json:

{
    "version": "0.2.0","configurations": [
        {
            "name": "Python: Current File","type": "python","request": "launch","program": "${file}","console": "integratedTerminal","cwd":"${fileDirname}"
        }
    ]
}

main.py:

with open('../input/xxxxx.txt','r') as file_input:
    res = file_input.read()
    print(res)
,

我通常会执行以下操作——找出我当前 .py 文件所在的目录并使用那里的相对路径

import os
py_folder = os.path.dirname(os.path.abspath(__file__))
input_folder = os.path.join(py_folder,'../input')
data = pd.read_csv(os.path.join(input_folder','data.csv'))

这样,您从哪个目录运行 .py 并不重要,它适用于任何开发环境,即不是特定于 VSCode 的环境

,

您可能指的是与 ../input/data.csv 的路径相关的 script.py 之类的文件

但这不是正确的方法,您应该添加与执行 script.py 的位置相关的文件路径,我认为它很可能来自项目文件夹的根目录。尤其是当您从 VS 代码使用 run python 命令时。

因此为什么路径 input/data.csv 应该在这种情况下工作。