Конвертировать WindowsPath в строку - PullRequest
0 голосов
/ 16 октября 2018
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 голосов
/ 16 июня 2019

Вы правы, вам нужна строка при вызове glob.glob.В последней строке вашего кода parent_dir - это объект pathlib.Path, который нельзя объединить со строкой '/*fits'.Вам необходимо явно преобразовать parent_dir в строку, передав ее во встроенную функцию str.

Последняя строка вашего кода должна выглядеть следующим образом:

fspec = glob.glob(str(parent_dir)+'/*fits')

Toдалее проиллюстрируем этот пример:

>>> from pathlib import Path
>>> path = Path('C:\\')
>>> path
WindowsPath('C:/')
>>> str(path)
'C:\\'
>>>
0 голосов
/ 16 июня 2019

Как и большинство других классов Python, класс WindowsPath, начиная с pathlib, реализует метод по умолчанию " dunder string " (__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'

Встроенная функция str фактически вызывает метод " dunder string " под капотом, поэтому результаты точно такие же.Кстати, как вы можете легко догадаться, непосредственный вызов метода « dunder string » позволяет избежать уровня косвенности, что приводит к ускорению выполнения.

Вот результаты тестов, которые я провел на своем ноутбуке:

from timeit import timeit

timeit(lambda:str(p),number=10000000)
>>> 2.3293891000000713

timeit(lambda:p.__str__(),number=10000000)
>>> 1.3876856000000544

Даже если вызов метода __str__ может показаться немного уродливым в исходном коде, как вы виделивыше, это приводит к ускорению времени выполнения.

...