关于win10 下的os.patn.join()

关于win10 下的os.patn.join()

在看廖雪峰python到os这一部分,习题编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径。以下是我写的:

import os

def search_file(path,str):

l=os.listdir(path)

for i in l:

if os.path.isfile(i):

if str in i:

print(os.path.join(path,i))

else:

search_file(os.path.join(path,i),str)

print(os.path.abspath('.'))

search_file(os.path.abspath('.'),'py')

出现错误:
F:新建文件夹
F:新建文件夹11.py
F:新建文件夹33.py
Traceback (most recent call last):
File "F:新建文件夹32.txt", line 11, in <module>

search_file(os.path.abspath('.'),'py')

File "F:新建文件夹32.txt", line 9, in search_file

search_file(os.path.join(path,i),str)

File "F:新建文件夹32.txt", line 9, in search_file

search_file(os.path.join(path,i),str)

File "F:新建文件夹32.txt", line 3, in search_file

l=os.listdir(path)

NotADirectoryError: [WinError 267] 目录名称无效。: 'F:\\新建文件夹\\cdsc\\asx.py'

查了关于os.path.join(),为什么第一蹭目录是/,到了第二层就是//了,按网上的尝试了os.path.join(path,i).replace('\\','/')还是错误:
F:新建文件夹
F:新建文件夹11.py
F:新建文件夹33.py
Traceback (most recent call last):
File "F:新建文件夹32.txt", line 11, in <module>

search_file(os.path.abspath('.'),'py')

File "F:新建文件夹32.txt", line 9, in search_file

search_file(os.path.join(path,i).replace('\\','/'),str)

File "F:新建文件夹32.txt", line 9, in search_file

search_file(os.path.join(path,i).replace('\\','/'),str)

File "F:新建文件夹32.txt", line 3, in search_file

l=os.listdir(path)

NotADirectoryError: [WinError 267] 目录名称无效。: 'F:/新建文件夹/cdsc/asx.py'

但是用os.walk()却可以,如下:

import os

def getfile(path,str):

L=[]

for root,dirs,files in os.walk(path):

for file in files:

if str in file:

L.append(os.path.join(root,file))

return L

print(getfile(os.path.abspath('.'),'py'))

['F:\新建文件夹\11.py', 'F:\新建文件夹\33.py', 'F:\新建文件夹\learn.py', 'F:\新建文件夹\qwe.py', 'F:\新建文件夹\WFW\axasa.py', 'F:\新建文件夹\WFW\EDEWF\dsd.py', 'F:\新建文件夹\pycache\qwe.cpython-38.pyc']
[Finished in 0.3s]

请问为什么?


回答:

路径中的双\\,第一个\代表的是转义符号,问题不在这。
错误是“目录名称无效”,因为F:\\新建文件夹\\cdsc\\asx.py是文件名,不是目录名。
os.listdir(path)之前,应该先判断path是不是dir: os.path.isdir(path)


添加1:
上面只是回答了报错的原因,如果要修改代码功能的话,应该将os.path.isfile(i)修改为os.path.isfile(os.path.join(path,i))
因为i是不带路径的文件名,os.path.isfile(i)无法正确判断

import os

def search_file(path,str):

l=os.listdir(path)

for i in l:

if os.path.isfile(os.path.join(path,i)):

if str in i:

print(os.path.join(path,i))

else:

search_file(os.path.join(path,i),str)

print(os.path.abspath('.'))

search_file(os.path.abspath('.'),'py')

以上是 关于win10 下的os.patn.join() 的全部内容, 来源链接: utcz.com/p/937792.html

回到顶部