将WindowsPath转换为字符串

时间:2018-10-15 21:41:16

标签: python filepath glob pathlib

redpath = os.path.realpath('.')              
thispath = os.path.realpath(redpath)        
fspec = glob.glob(redpath+'/*fits')
thispath = os.path.realpath(thispath+'/../../../..')
p = Path(thispath)
userinput = 'n'
while (userinput == 'n'):
   text_file = next(p.glob('**/*.fits'))
   print("Is this the correct file path?")
   print(text_file)
   userinput = input("y or n")

parent_dir = text_file.parent.resolve()
fspec = glob.glob(parent_dir+'/*fits')

我遇到错误

unsupported operand type(s) for +: 'WindowsPath' and 'str'

我认为这是因为当我需要遍历字符串时,我正在尝试遍历Windows文件路径。有没有一种方法可以将WindowsPath转换为字符串,以便将所有文件都放在一个列表中?

2 个答案:

答案 0 :(得分:0)

与大多数其他Python类一样,来自WindowsPath的{​​{1}}类实现了非默认的“ 暗线”方法(pathlib)。事实证明,该方法为该类返回的字符串表示形式恰好是表示您要查找的文件系统路径的字符串。这里是一个例子:

__str__

from pathlib import Path p = Path('E:\\x\\y\\z') >>> WindowsPath('E:/x/y/z') p.__str__() >>> 'E:\\x\\y\\z' str(p) >>> 'E:\\x\\y\\z' 内置函数实际上在后台调用了“ 暗号字符串”方法,因此结果是完全一样的。顺便说一句,您可以很容易地猜到直接调用“ dunder string ”方法可以缩短执行时间,从而避免了某种程度的间接调用。

这是我在笔记本电脑上完成的测试结果:

str

即使调用from timeit import timeit timeit(lambda:str(p),number=10000000) >>> 2.3293891000000713 timeit(lambda:p.__str__(),number=10000000) >>> 1.3876856000000544 方法在源代码中看起来也较难看,如您在上面看到的,它也导致运行时更快。

答案 1 :(得分:0)

是的,调用glob.glob时需要一个字符串。在代码的最后一行中,parent_dir是一个pathlib.Path对象,您不能将其与字符串'/*fits'连接。您需要将parent_dir传递给内置的str函数,以将fspec = glob.glob(str(parent_dir)+'/*fits') 显式转换为字符串。

因此,代码的最后一行应为:

>>> from pathlib import Path
>>> path = Path('C:\\')
>>> path
WindowsPath('C:/')
>>> str(path)
'C:\\'
>>>

为进一步说明,请考虑以下示例:

AllowShortLoopsOnASingleLine