[英]What's the proper way to initialize instance attributes that refer to files?
[英]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
这是可以理解的,因为input
在my-project
中,而不是在同一级别。 但是,使用..
引用确实感觉像是引用data.csv
的正确方法,就像我们从script.py
中所做的那样。 但也许我错了?
如果这是引用我的数据文件的合理方法 - 我如何设置 VSCode 以便能够运行脚本而不返回错误? 我认为应该有一种方法可以将子文件夹添加到搜索路径,而无需将子文件夹作为工作区打开,但我运气不好试图找到它。
@Edit:请注意,我知道相对/绝对路径的概念。 这个问题更多的是关于 VSCode 设置。 我也愿意接受答案:“不,使用../input/data.csv
在此设置中是愚蠢的做法。您应该使用input/data.csv
来代替,因为...”(它是与我目前的理解相矛盾,但我可能完全错了,我很乐意学习不同的观点)
我相信这比你想象的要简单,让我们一起做吧!
使用的扩展...
我相信下面的步骤并不难!
将默认解释器切换到创建的虚拟环境
创建一个简单的launch.json,用简单的选择python脚本
猜猜现在怎么样! 我们现在要做的就是在编辑器中 select 一个script.py文件然后......运行!
您可以在终端中看到结果。
让我们谈谈...
生成的launch.json文件会强制我们在编辑器中select **src.script.py" 在我们每次要启动程序之前点击开始按钮,如果你喜欢,我可以建议一个更合适的方法
在第 6 步中,您可以选择Module而不是Python 文件,之后编辑器会提示您输入模块名称的字段,我们的输入必须是src.script 。
我们将得到我们的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.