Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python (循环)glob不允许过滤,也不提供元素枚举时的访问。因此,您需要另一种方法,通过自己枚举dir元素(使用许多现有方法中的一种,您可以查看一下),并过滤掉不需要的元素_Python_File_Recursion_Directory_Glob - Fatal编程技术网

Python (循环)glob不允许过滤,也不提供元素枚举时的访问。因此,您需要另一种方法,通过自己枚举dir元素(使用许多现有方法中的一种,您可以查看一下),并过滤掉不需要的元素

Python (循环)glob不允许过滤,也不提供元素枚举时的访问。因此,您需要另一种方法,通过自己枚举dir元素(使用许多现有方法中的一种,您可以查看一下),并过滤掉不需要的元素,python,file,recursion,directory,glob,Python,File,Recursion,Directory,Glob,这里是testdir结构。注意,在这里,2个重复出现的符号链接实际上是普通的dir,否则它们会弄乱命令(这也不处理这种情况)。之后,我将它们替换为符号链接: [cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q057591233]>tree/a/f。 卷工作的文件夹路径列表 卷序列号为3655-6FED E:\WORK\DEV\STACKOVERFLOW\Q057591233 |代码00.py | +---外部_目录 |file00.xml | \---

这里是testdir结构。注意,在这里,2个重复出现的符号链接实际上是普通的dir,否则它们会弄乱命令(这也不处理这种情况)。之后,我将它们替换为符号链接:

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q057591233]>tree/a/f。
卷工作的文件夹路径列表
卷序列号为3655-6FED
E:\WORK\DEV\STACKOVERFLOW\Q057591233
|代码00.py
|
+---外部_目录
|file00.xml
|
\---搜索目录
|file00.xml
|file01.xml
|
+---迪尔00
|+--dir00
|| | file00.xml
|   |   |
|| \--dir00
|| file00.xml
|   |
|\---dir01\u符号链接\u到\u父级\u同级\u dir01
\---dir01
+---dir00\u符号链接\u到\u父级\u同级\u dir00
+---dir01
|file00.xml
|
\---dir02\u符号链接\u至\u外部\u目录
file00_ext.xml
代码00.py:

#/usr/bin/env蟒蛇3
导入系统
导入操作系统
进口稀土
导入pprint
定义获取文件扫描无符号(目录名称,匹配函数,级别=0):
对于os.scandir中的项目(目录名称):
如果项.is_symlink():
持续
如果item.is_dir():
从(项目路径,匹配函数,级别=级别+1)获取文件(操作系统)(磁盘扫描)(否)符号的产量
elif匹配函数(项路径):
屈服项路径
def\u get\u files\u os\u scandir(目录名,匹配函数,访问索引节点,级别=0):
对于os.scandir中的项目(目录名称):
如果已访问索引节点中的item.inode():
持续
已访问\u inode.append(item.inode())
item_path=os.path.normpath(os.path.join(*os.path.split(item.path)[:-1],os.readlink(item.path)),如果item.is_symlink()else item.path
如果item.is_dir():
从“获取文件”到“浏览”的收益(项目路径、匹配函数、访问节点、级别=级别+1)
elif匹配函数(项目路径):
屈服项路径
def get_文件(路径、ext、exclude_符号链接=True):
如果排除符号链接和os.path.islink(路径):
返回
pattern=re.compile(“.\.{0:s}$”。格式(ext))
如果os.path.isdir(路径):
如果排除符号链接:
从(获取)文件(操作系统)(磁盘扫描)(no)符号(path,pattern.match)产生的产量
其他:
从_get_files_os_scandir(path,pattern.match,list())生成
elif os.path.isfile(路径)和pattern.match(路径):
屈服路径
def main():
search\u dir=“search\u dir”
extension=“xml”
对于[真、假]中的排除符号链接:
打印(“\n包括符号链接:{0:}”。格式(排除符号链接))
文件=列表(获取文件(搜索目录、扩展名、排除符号链接=排除符号链接))
pprint.pprint(文件)
打印(“项目总数:{0:d}”。格式(len(文件)))
如果名称=“\uuuuu main\uuuuuuuu”:
打印(“Python{0:s}{1:d}位在{2:s}\n.format(“.join(sys.version.split(“\n”)中的项的item.strip()),如果sys.maxsize>0x100000000,则为64,否则为32,sys.platform))
main()
打印(“\n完成”)
输出

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q057591233]>“e:\Work\Dev\VEnvs\py\u 064\u 03.07.03\u test0\Scripts\python.exe”code00.py
Python 3.7.3(v3.7.3:ef4ec6ed12,2019年3月25日,22:22:05)[MSC v.1916 64位(AMD64)]win32上的64位
排除符号链接:True
['search\u dir\\dir00\\dir00\\dir00\\file00.xml',
'搜索\u dir\\dir00\\dir00\\file00.xml',
'搜索\u dir\\dir01\\dir01\\file00.xml',
'搜索目录\\file00.xml',
'搜索目录\\file01.xml']
项目总数:5
排除符号链接:False
['search\u dir\\dir00\\dir00\\dir00\\file00.xml',
'搜索\u dir\\dir00\\dir00\\file00.xml',
'搜索\u dir\\dir01\\dir01\\file00.xml',
“外部目录\\file00\u ext.xml”,
'搜索目录\\file00.xml',
'搜索目录\\file01.xml']
项目总数:6
完成。
注释

  • 递归实现依赖于(和其他file/dir函数)
  • 在文件名匹配方面,不支持通配符,因此使用了最接近的(?)东西(regexp)
  • 遍历目录的两个函数:
    • _获取\u文件\u操作系统\u扫描\u否\u符号链接-忽略所有符号链接
    • _获取文件,包括符号链接。还进行一些处理以避免无限递归和符号链接解析
  • 这两个函数本来可以统一(使用一个额外的参数(exclude_symlinks)),但我感觉忽略它们的函数以这种方式执行得更快
  • 如图所示,没有一个进入无限递归(对于前者,这是显而易见的),但前者也忽略了search dir外部的文件
  • get_files_os_scandir-在完成一些初始化工作(避免每次重复调用)后调用这两个函数之一的包装器
  • 我只在Win上运行了代码,但在Nix上也运行了部分代码,所以我不期待会有任何意外

很遗憾,我无法更改此符号链接。同时,我将程序更改为只在子文件夹中搜索而不使用符号链接,但现在我将尝试您的解决方案。所以非常感谢你的工作!没有人说要改变符号链接。这就是我发布代码的原因:)。搜索每个目录也可以,但如果有许多子目录,并且符号链接在树的较低位置,则无法工作。@Meret:这回答了您的问题吗?如果是,请接受答案,以便其他人也能够确认()。不幸的是,我无法更改此符号链接。同时,我将程序更改为只在子文件夹中搜索而不使用符号链接,但现在我将尝试您的解决方案。所以非常感谢你的工作!没有人说要改变符号链接。这就是我发布代码的原因:)。搜索每个目录也可以,但如果有许多子目录,并且符号链接在树的较低位置,则无法工作。@Meret:这回答了您的问题吗?如果是,p
First Level\
 Second Level A\
  Third Level: Link to Second Level B\
  Third Level: subfolder with xml files\
 Second Level B\
  Third Level: Link to Second Level A\
  Third Level: subfolder with xml files\
glob.iglob([r'/**/*.xml', r'!/Link to Second Level B/'])