繁体   English   中英

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

[英]What's the correct way and VSCode setup to refer to files between subdirectories in Python

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

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

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

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

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

发生异常:FileNotFoundError [Errno 2] 没有这样的文件或目录:'../input/data.csv

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

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

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

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

  1. 创建空文件夹

  2. 用 VSCode 打开它

使用的扩展...

  1. 扩展

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

  1. 基本步骤

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

  1. 虚拟环境

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

  1. 创建启动.json

  2. Launch.json 文件示例

猜猜现在怎么样! 我们现在要做的就是在编辑器中 select 一个script.py文件然后......运行!

  1. 运行脚本后

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

让我们谈谈...

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

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

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

新的launch.json

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

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

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

import os
print(os.getcwd())

然后从那里开始 go。

编辑:您可以更改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 变量可以在这里引用: https://code.visualstudio.com/docs/editor/variables-reference


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

文件结构:

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

发射.json:

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

主要.py:

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

我通常会执行以下操作 - 找出我的 current.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'))

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

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

但这不是 go 关于它的正确方法,您应该添加与执行script.py的位置相关的文件路径,我假设它最有可能来自项目文件夹的根目录。 特别是如果您使用 VS 代码中的 run python 命令。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM