连接路径和文件名

11

我需要在Python中构建完整路径。我尝试了以下代码:

filename= "myfile.odt"

subprocess.call(['C:\Program Files (x86)\LibreOffice 5\program\soffice.exe',
                    '--headless',
                    '--convert-to',
                    'pdf', '--outdir',
                    r'C:\Users\A\Desktop\Repo\',
                    r'C:\Users\A\Desktop\Repo\'+filename])

但是我遇到了这个错误

语法错误:扫描字符串文字时出现行尾错误。


1
字符串字面量不能以单个“\”结尾,否则您将转义“'”,这将使字符串保持打开状态 - Moses Koledoye
还要注意字符串 http://stackoverflow.com/a/40053376/3125566 的高亮显示 - Moses Koledoye
7个回答

29

试试:

import os
os.path.join('C:\Users\A\Desktop\Repo', filename)

os模块包含许多有用的方法,可用于目录和路径操作。


3
使用操作系统的连接方式是不错的,但这里真正的问题在于单引号被转义了。 - Aaron

7

反斜杠字符 (\) 在字符串字面量中必须进行转义。

  • 错误写法: '\'
  • 正确写法: '\\' - 这是一个包含一个反斜杠的字符串

因此,以下写法是错误的:

'C:\Program Files (x86)\LibreOffice 5\program\soffice.exe'

有一个技巧!

r为前缀的字符串字面量是为了更容易地编写正则表达式。它们的一个特点是反斜杠字符不必转义。所以,以下内容是正确的:

r'C:\Program Files (x86)\LibreOffice 5\program\soffice.exe'

然而,对于以反斜杠结尾的字符串,这种方法并不适用:

  • r'\' - 这是语法错误

因此,这种方法也是错误的:

r'C:\Users\A\Desktop\Repo\'

所以,我会按照以下步骤进行操作:
import os
import subprocess


soffice = 'C:\\Program Files (x86)\\LibreOffice 5\\program\\soffice.exe'
outdir = 'C:\\Users\\A\\Desktop\\Repo\\'
full_path = os.path.join(outdir, filename)

subprocess.call([soffice,
                 '--headless',
                 '--convert-to', 'pdf',
                 '--outdir', outdir,
                 full_path])

2
你的问题在于原始字符串以单个反斜杠结尾。由于我不明白的原因,这是不允许的。你可以在末尾加倍反斜杠:
r'C:\Users\A\Desktop\Repo\\'+filename

或者使用首选方法 os.path.join()

os.path.join(r'C:\Users\A\Desktop\Repo', filename)

我猜尾随反斜杠不被允许的原因是它会转义闭合引号。我没有查过,但是虽然 r'' 允许我们在不转义的情况下写反斜杠,但你仍然需要一种方法来转义其中的单引号,所以 \' 仍然是一个转义的引号,而单引号字符串会一直延续到下一个单引号。这与语法错误一致,因为解释器认为它正在读取一个字符串,而文件已经结束了。 - SvenS

2

在zanseb所说的基础上,使用os.path.join,但是\是转义字符,因此您的字符串文字不能以\结尾,否则它将转义结束引号。

import os
os.path.join(r'C:\Users\A\Desktop\Repo', filename)

1
对于其他遇到这个问题的人,您可以使用\来连接Path对象和str
对于与Unix和Windows都兼容的路径,使用path.Path(您可以像我使用pathlib.PureWindowsPath一样使用它)。
我之所以使用pathlib.PureWindowsPath,是因为问题特别涉及Windows路径。
例如:
import pathlib
# PureWindowsPath enforces Windows path style
# for paths that work on both Unix and Windows use path.Path
base_dir = pathlib.PureWindowsPath(r'C:\Program Files (x86)\LibreOffice 5\program')
# elegant path concatenation
myfile = base_dir / "myfile.odt"

print(myfile)
>>> C:\Program Files (x86)\LibreOffice 5\program\myfile.odt

  1. 你的第一句话使用了反斜杠,但是你的代码使用了正斜杠(/)。
  2. / 运算符不仅仅是简单地连接第二个参数,它执行的是路径合并。如果你只是想要追加一个字符串,/ 将无法实现。
- Jonathon Reinhart

1

你也可以简单地将字符串相加。个人而言,我更喜欢这种方法。

filename = r"{}{}{}".format(dir, foldername, filename)

1

将库添加到代码中:

from pathlib import Path

当您想要获取当前路径而不包括文件名时,请使用以下方法:

print("Directory Path:", Path().absolute())

现在你只需要将文件名添加到其中:例如

   mylink = str(Path().absolute())+"/"+"filename.etc" #str(Path().absolute())+"/"+"hello.txt"

如果通常在第一个路径中添加"r"字符,例如:r"c://..."

这里不需要这样做


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接