19
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 を文字列に変換して、すべてのファイルを 1 つのリストにまとめる方法はありますか?

4

2 に答える 2

31

他のほとんどの Python クラスと同様に、WindowsPathクラス frompathlibは、デフォルトではない " 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__ソース コードで少し見苦しく見える場合でも、実行時間の短縮につながります。

于 2019-06-16T19:09:29.667 に答える