問題の説明:os.path.isdir()とos.path.isfile()は、エラーが発生した判断した場合、第2の層の周期。
問題のコード:
#编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径。
import os
def findfile(name, path):
for file in os.listdir(path):
print(file)
print(os.path.abspath(file))
if os.path.isdir(file):
newpath = os.path.abspath(file)
findfile(name, newpath)
else:
if name in file:
a = os.path.abspath(file)
print(a)
print('文件名是%s' % os.path.split(a)[1], '地址是%s' % os.path.split(a)[0])
フォルダには、Bは、機能のOSで内蔵し、されるファイルがある場合でも、実装レベルの後に機能するためにC、Cを含み、Bが含まれています。我々は、この再帰プログラム自体はエラーではありませんが、あなたはこのようなシナリオが発生した場合、デバッグを通じて発見しました。 path.isdir()判決は、非常に奇妙な偽です。
幸いなことに、我々は間違った道を見つけ実行することにより、2つの印刷出力パスを観察することができました!
ファイルは、ファイルが1234.txtある/A/B/C/1234.txt、である場合、例えば、os.path.abspath(ファイル)出力(os.path.isdirに至る、実際/A/1234.txtあります)OSErrorのを返し、ファイルを見つけることができませんでした。
だから、問題は、ファイル名が、この機能は非常におざなりにアドレス+の機能を実行することで戻ってきたos.path.abspath()、です!だから、表向きos.path.isdir()の問題は、実際にそれが彼について間違っています。
ABSPATH一目でコードを見て。
def abspath(path):
"""Return an absolute path."""
path = os.fspath(path)
if not isabs(path): #判断是否是绝对路径,经判断不是绝对路径
if isinstance(path, bytes):
cwd = os.getcwdb()
else:
cwd = os.getcwd()#返回函数当前执行路径
path = join(cwd, path)
return normpath(path)
その後、次の質問は延長されている理由isabs(パス)は、falseに別の関数に出理由でしょう:os.listdir(パス)。
os.listdir(パス)の公式説明のを見てください
与えられたディレクトリ内のエントリの名前を含むリストを返し パスを。リストには、任意の順序であり、かつ特別なエントリが含まれていない
'.'
と'..'
、彼らは、ディレクトリに存在している場合でも。リターン「で」と指定されたパスリストをアルファベット順にソートされた「..」すべてのファイルとディレクトリ名の外。
...
scandir()
この関数は、多くの一般的なユースケースのためのより良いパフォーマンスを与えて、ファイルの属性情報とともにディレクトリエントリを返します。SCANDIR()関数は、ディレクトリパスと属性を持つファイル、多くの場面で使用され、より良い結果を返します。
理解し、os.listdir(パス)は、文字列とリストのみを返し、属性なしにかかわらず、信憑性の、公式には)我々は(SCANDIRを使用するルートをお勧めします。
したがって、このコードは、それを変更する方法をすべきですか?
3つの方法があります。
1、os.walk、ない自作のホイール。
2、os.scandirを使用して()os.listdirを交換()。
図3は、CHDIR()でディレクトリの実行パスを交換します。
...
os.chdir(file)
newpath = os.path.abspath('.')
print(newpath)
...
os.chdir(os.path.abspath('..'))