python是否与Matlab的addpath等效?我知道sys.path.append,但这似乎只适用于python文件/模块,而不适用于一般文件。
假设我在C:\ Data中有一个文件config.txt,而当前的工作目录是其他的,比如D:\ my_project。
我希望代码类似于:
def foo():
with open('config.txt') as f:
print(f.read())
def main():
addpath(r'C:\Data')
foo()
显然我可以在这里将路径传递给foo,但在实际使用案例中这是非常困难的。
答案 0 :(得分:4)
您无法像在matlab中那样添加多条路径。
您可以使用os.chdir
更改目录,并从该目录访问文件和子目录:
import os
def foo():
with open('config.txt') as f:
print(f.read())
def main():
os.chdir(r'C:\Data')
foo()
要管理多个目录,请使用在上下文到期后返回上一个目录的上下文管理器:
import contextlib
import os
@contextlib.contextmanager
def working_directory(path):
prev_cwd = os.getcwd()
os.chdir(path)
yield
os.chdir(prev_cwd)
def foo():
with open('config.txt') as f:
print(f.read())
def main():
with working_directory(r'C:\Data'):
foo()
# previous working directory
答案 1 :(得分:1)
不,它没有。 Python不会这样工作。文件从当前工作目录或特定的已解析路径加载。没有用于加载任意文件的一组预定义路径。
保持数据和程序逻辑分离是Python(以及除MATLAB之外的大多数其他编程语言)的一个重要概念。 python的一个关键原则是"显式优于隐式。"确保明确定义要加载的数据文件更安全,更可靠,更不容易出错。
因此,虽然其他人已经展示了如何解决某些变通方法,但我非常非常强烈地建议您不要使用这种方法。它将使维护代码变得更加困难。
答案 2 :(得分:0)
def foo(prefix):
path = prefix + 'config.txt'
with open(path) as f:
print(f.read())
def main():
foo(r'C:\Data\')
--- ----更新
import os
class changeFileDir:
def __init__(self, path):
self.path= os.path.expanduser(path)
def __enter__(self):
self.savedPath = os.getcwd()
os.chdir(self.path)
def __exit__(self, etype, value, traceback):
os.chdir(self.savedPath)
with changeFileDir(r'C:\Data'):
foo()
答案 3 :(得分:0)
您可以使用os.chdir
功能以及您自己的open
功能来检查您想要的所有路径。
class FileOpener(object):
def __init__(self):
self.paths = []
def add_path(self, path):
self.paths.append(path)
def __open_path(self, path, *args, **kwargs):
old_path = os.getcwd()
try:
os.chdir(path)
return open(*args, **kwargs)
except:
pass
finally:
os.chdir(old_path)
def open(self, *args, **kwargs):
for path in self.paths + [os.getcwd()]:
f = self.__open_path(path, *args, **kwargs)
if f is not None:
return f
raise IOError("no such file")
my_file_opener = FileOpener()
my_file_opener.add_path("C:/Data")
my_file_opener.add_path("C:/Blah")
my_file_opener.open("some_file") # checks in C:/Data, C:/Blah and then the current working directory, returns the first file named "some_file" that it finds, and raises an IOError otherwise
答案 4 :(得分:0)
抱歉,我弄错了。
我想你可以用这个来解决它。 (作为一个堆栈新手,我希望它有所帮助)
import sys
sys.path.append(r'path')