Python相当于Matlab的addpath

时间:2016-06-29 17:48:20

标签: python matlab directory

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,但在实际使用案例中这是非常困难的。

5 个答案:

答案 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')