【问题标题】:Calling for relative paths in Python在 Python 中调用相对路径
【发布时间】:2019-03-30 11:40:33
【问题描述】:

我在下面有这个 Python 脚本,它从一个位置获取文件并将其复制到另一个目标位置。如果我用绝对位置定义路径,下面的代码就可以正常工作。

我正在尝试使用变量来定义它,完成后不会执行脚本。没有抛出错误,但代码似乎没有被执行。

代码:

Path_from = r'/Users/user/Desktop/report'
Path_to = r'/Users/user/Desktop/report'

for root, dirs, files in os.walk((os.path.normpath(Path_from)), topdown=False):
        for name in files:
            if name.endswith('{}.txt'.format(date)):
                print
                "Found"
                SourceFolder = os.path.join(root, name)
                shutil.copy2(SourceFolder, Path_to)

我想修改代码

Path_from = r'/Users/user/Desktop/report'

base_path = /Users/user/Desktop/
Path_from = r'base_path/{}'.format(type)

【问题讨论】:

  • 你需要在 base_path 中的 r 因为正斜杠
  • 正斜杠不是特殊字符,它们真的需要原始字符串文字吗? stackoverflow.com/questions/2081640/… 。肯定是反斜杠,但不是正斜杠,对吧?
  • @clearshot66 我也尝试在 bath_path 之前包含 r' 但没有运气。 base_path = r'/Users/user/Desktop/'
  • r'base_path/{}' 是一个原始字符串文字,包含您用作变量 'base_path' 的相同字符,但它不添加 @ 的 987654325@ 在字符串中。我不确定.format(type) 应该是什么意思,但我只是假设您的代码示例的最后一点没有忠实地复制到问题中。

标签: python python-3.x variables path relative-path


【解决方案1】:

如果我没看错,您可以使用pathlib,具体而言,pathlib.Path 代码如下所示

from pathlib import Path
import re
import shutil

path_from = Path("/") / "Users" / "user" / "Desktop" # Better IMO
# path_from = Path("/Users/user/Desktop")
path_to = Path("/") / "Users" / "user" / "OtherDesktop"

datename = "whatever"

for x in path_from.glob("*.txt"):
    if re.search(r"{}$".format(datename), x.stem): # stem is whatever is before the extension 
    # ex. something.txt -> something

        shutil.copy(str(path_from / x.name), str(path_to / x.name))

【讨论】:

    【解决方案2】:

    我建议您将所有当前工作目录问题留给用户 - 如果他们想指定相对路径,他们可以在调用 python 并提供相对路径之前进入它相关的目录。

    这几乎是每个 linux 工具和程序所做的——它们很少采用“基本路径”,而是将提供相对于当前目录(或绝对路径)的有效路径的工作留给用户。

    如果您致力于将另一个参数作为相对路径的想法,那么它应该非常简单。您的示例没有有效的 python 语法,但很接近:

    $ cat t.py
    from os.path import join
    basepath="/tmp"
    pathA = "fileA"
    pathB = "fileB"
    print(join(basepath,pathA))
    print(join(basepath,pathB))
    

    但是请注意,这会阻止在脚本执行时提供绝对路径。

    你可以改用一种格式,

    basepath="/tmp"
    pathA = "fileA"
    pathB = "fileB"
    print( "{}/{}".format(basepath, pathA) )
    print( "{}/{}".format(basepath, pathB) )
    

    但是您假设您知道如何在相关操作系统上连接路径,这就是存在os.path.join 的原因。

    【讨论】:

    • 谢谢我一直意识到我哪里出了问题。
    猜你喜欢
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    相关资源
    最近更新 更多