我是一个非常新手的编码员,而Python是我的第一个(实际上也是唯一的)语言。作为研究工作的一部分,我负责操纵一组数据分析脚本,首先让它们在我的计算机上运行。我能够做到这一点,主要是通过删除识别路径的所有编码行,并通过在相关模块和CSV文件所在的目录中打开的Jupyter终端运行脚本,以便脚本知道在哪里查看(我知道Python默认到终点的位置。)
以下是我不理解的功能的特定代码块
import sys
sys.path.append('C:\Users\Ben\Documents\TRACMIP_Project\mymodules/')
import altdata as altdata
我已将原始代码中的路径名替换为通向模块所在目录的路径名;包含所有最终在此处引用的CSV文件的文件也在mymodules中。
这取决于我打开终端的位置,但是我可以让它始终如一地工作的唯一方法是在mymodules中打开终端,这现在很好但是当我需要通过访问远程服务器。我需要更准确地理解这里要做的是什么,以及它与终端的位置有什么关系(我发现的所有文档对我的知识水平而言都过于技术化。)
这是我不理解的另一部分
import os.path
csvfile = 'csv/' + model +'_' + exp + '.csv'
if os.path.isfile(csvfile): # csv file exists
hcsvfile = open(csvfile )
我到这里说它正在寻找CSV文件,但我不确定如何。我也不确定为什么然后在某些情况下取决于我打开终端的位置它能够找到模块但不能找到CSV文件。
我希望能够对我所呈现的内容进行解释,但更一般地说,我想要解释路径以及它们如何在模块中的脚本中工作的信息(或信息链接),以及操作它们的方法。感谢。
答案 0 :(得分:1)
这是一个简单的目录列表,其中python将查找模块和包(.py
和dirs with __init__.py
文件,请查看modules tutorial)。扩展此列表将允许您从非默认位置加载模块(自定义库等)(通常需要在运行时更改它,对于静态目录,您可以修改启动脚本以添加所需的环境变量)。
该模块在路径名上实现了一些有用的功能。
...并允许您查明文件是否存在,是链接,目录等。
*.csv
失败?因为sys.path
负责模块加载而且仅用于此。使用相对路径时:
csvfile = 'csv/' + model +'_' + exp + '.csv'
open()
会查看当前工作目录
file
是一个字符串或字节对象,给出路径名(绝对或相对于当前工作目录)...
您需要通过使用os.path
模块构建它们来使用绝对路径。
答案 1 :(得分:0)
我同意cdarke的评论,你可能遇到了反斜杠的问题。用以下内容替换该行:
sys.path.append(r'C:\Users\Ben\Documents\TRACMIP_Project\mymodules')
可能会解决您的问题。详情如下。
通常,Python将路径视为相对于当前目录(终端正在运行的位置)。当你为它提供一个绝对路径 - 这是一个包含根目录的路径,就像C:\
中的C:\Users\Ben\Documents\TRACMIP_Project\mymodules
- 然后Python不关心工作目录了,它只是看你告诉它的地方。
反斜杠用于在字符串中创建特殊字符,例如换行符(\ n)和制表符(\ t)。你遇到的障碍是Python路径首先是字符串,路径是第二个。所以你路径中的\ U,\ B,\ D,\ T和\ m被误解为特殊字符并弄乱了Python的路径解释。如果在字符串前加上'r',Python将忽略反斜杠的特殊字符含义,只是将其解释为文字反斜杠(你想要的)。
如果从mymodules
目录运行脚本,它仍然有效的原因是因为Python在询问时会自动在工作目录中查找文件。 sys.path.append(path)
告诉计算机在查找命令时包含该目录,这样无论您在何处运行脚本,都可以使用该目录中的文件。错误的路径仍然会被添加,但它没有意义。没有你指向的目录,所以没有什么可以找到的。
对于一般的路径操作,“最安全”的方法是使用os.path中的函数,它与平台无关,无论您是在Windows环境还是在Unix环境中工作,都会提供正确的输出(通常)。
编辑:忘了涵盖第二部分。由于Python路径是字符串,因此您可以使用字符串操作构建它们。这就是行
所发生的事情 csvfile = 'csv/' + model +'_' + exp + '.csv'
据推测,model
和exp
是出现在csv/
文件夹中的文件名中的字符串。使用model = "foo"
和exp = "bar"
,您将获得csv/foo_bar.csv
这是文件的相对路径(即相对于您的工作目录)。代码确保文件实际存在于该路径,然后打开它。假设csv/
文件夹与您在sys.path.append
中添加的路径相同,无论您在何处运行该文件,此路径都应该,但我并非100%确定在那。 编辑: outoftime指出sys.path.append仅适用于模块,而不是打开文件,因此您需要将csv/
扩展为绝对路径或始终在其父级中运行。目录
另外,我认为Python非常聪明,不关心路径中斜杠的方向,但你可能不应该混合它们。所有反斜杠或所有正斜杠。 os.path.join
会为您规范化。我可能会改行
csvfile = os.path.join('csv\', model + '_' + exp + '.csv')
为了保持一致。