这就是我所拥有的:
glob(os.path.join('src','*.c'))
Run Code Online (Sandbox Code Playgroud)
但我想搜索src的子文件夹.像这样的东西会起作用:
glob(os.path.join('src','*.c'))
glob(os.path.join('src','*','*.c'))
glob(os.path.join('src','*','*','*.c'))
glob(os.path.join('src','*','*','*','*.c'))
Run Code Online (Sandbox Code Playgroud)
但这显然是有限和笨重的.
我需要使用Python计算目录中的文件数.我想最简单的方法是len(glob.glob('*'))
,但这也将目录计为文件.
有没有办法只计算目录中的文件?
我想在文件夹中打开一系列子文件夹,找到一些文本文件并打印一些文本文件行.我用这个:
configfiles = glob.glob('C:/Users/sam/Desktop/file1/*.txt')
Run Code Online (Sandbox Code Playgroud)
但是这也无法访问子文件夹.有谁知道如何使用相同的命令来访问子文件夹?
使用Python的.gitignore样式fnmatch()最简单的方法是什么?看起来stdlib不提供match()函数,该函数将路径规范与UNIX样式路径正则表达式匹配.
fnmatch()只匹配纯文件名,没有路径http://docs.python.org/library/fnmatch.html?highlight=fnmatch#fnmatch
glob()将执行目录列表,并且不提供match()true/false样式函数http://docs.python.org/py3k/library/glob.html?highlight=glob#glob.glob
.gitignore具有通配符的路径和文件(黑色)列出
我需要列出当前目录(.)中的所有文件(包括所有子目录),并排除一些文件,如.gitignore如何工作(http://git-scm.com/docs/gitignore)
使用fnmatch(https://docs.python.org/2/library/fnmatch.html),我将能够使用模式"过滤"文件
ignore_files = ['*.jpg', 'foo/', 'bar/hello*']
matches = []
for root, dirnames, filenames in os.walk('.'):
for filename in fnmatch.filter(filenames, '*'):
matches.append(os.path.join(root, filename))
Run Code Online (Sandbox Code Playgroud)
如何"过滤"并获取与"ignore_files"的一个或多个元素不匹配的所有文件?
谢谢!
关于fnmatch在pathinfo上的速度有一个小小的争论:如何检查文件是否是php?
我并不完全相信所以决定对两个功能进行基准测试.
使用动态和静态路径显示pathinfo更快.
我的基准逻辑和结论是否有效?
编辑:从cmd使用mac php
PHP 5.3.0(cli)(内置:2009年7月20日13:56:33)版权所有(c)1997-2009 PHP Group Zend Engine v2.3.0,版权所有(c)1998-2009 Zend Technologies
动态路径pathinfo 3.2973630428314 fnmatch 3.4520659446716 x1.05
static path pathinfo 0.86487698554993 fnmatch 1.0420439243317 x1.2
来自cmd的mac xampp php
PHP 5.3.1(cli)(内置:2010年2月27日12:41:51)版权所有(c)1997-2009 PHP Group Zend Engine v2.3.0,版权所有(c)1998-2009 Zend Technologies
动态路径pathinfo 3.63922715187 fnmatch 4.99041700363 x1.37
static path pathinfo 1.03110480309 fnmatch 2.38929820061 x2.32
我在我的机器上包含一个结果样本,以秒为单位进行100,000次迭代:
dynamic path
pathinfo 3.79311800003
fnmatch 5.10071492195
x1.34
static path
pathinfo 1.03921294212
fnmatch 2.37709188461
x2.29
Run Code Online (Sandbox Code Playgroud)
码:
<pre>
<?php
$iterations=100000;
// Benchmark with dynamic file path
print("dynamic path\n"); …
Run Code Online (Sandbox Code Playgroud) 是否有任何内置或直接的方法来递归匹配双星号的路径,例如像zsh那样?
例如,与
path = 'foo/bar/ham/spam/eggs.py'
Run Code Online (Sandbox Code Playgroud)
我可以使用fnmatch来测试它
fnmatch(path, 'foo/bar/ham/*/*.py'
Run Code Online (Sandbox Code Playgroud)
虽然,我希望能够做到:
fnmatch(path, 'foo/**/*.py')
Run Code Online (Sandbox Code Playgroud)
我知道 fnmatch将其模式映射到 regex,因此在单词的情况下,我可以使用其他**
模式滚动我自己的 fnmatch ,但也许有更简单的方法
我正在尝试为我的存储库上的设置分支设置规则,但存在仅适用于特定分支的模式问题。即规则仅适用于brances master、develop、release
问题:该模式没有选取错误的分支
我尝试在这里查看,但它按预期工作 https://ruby-doc.org/core-2.5.1/File.html#method-c-fnmatch
我已经尝试过,但无法使用 0 个分支或所选的所有内容:
{^.*(master).*$,^.*(develop).*$}
[master,develop,release]
[master;develop;release]*
PS 这个剂量相反,适用于所有支架,但列出的支架:
*[!master|!develop|!release]*
.gitignore
考虑文件中的以下两种模式
foo/*
foo/**
Run Code Online (Sandbox Code Playgroud)
模式格式规范指出:
星号
*
可以匹配除斜杠之外的任何内容。[...]
尾随
/**
匹配里面的所有内容。例如,abc/**
匹配 目录 内的所有文件abc
(相对于 .gitignore 文件的位置),具有无限深度。
当在斜杠之后直接在模式末尾使用时,这对我来说听起来是同样的事情。我确实测试了一些案例 - 有或没有下面的子目录foo
以及各种否定模式 - 并且没有观察到任何差异。
有没有一种情况会让人做出/**
选择/*
?
起初,我期望看到一个具有如下模式的用例,但没有,因为这两种模式都会忽略内部的所有内容,并且规范还表示“[...]不可能重新包含一个文件(如果该文件的父目录被排除)[...]”
foo/*
!foo/a/b/c/file.txt
foo/**
!foo/a/b/c/file.txt
Run Code Online (Sandbox Code Playgroud) 我正在使用递归 glob 来查找文件并将其从一个驱动器复制到另一个驱动器
def recursive_glob(treeroot, pattern):
results = []
for base, dirs, files in os.walk(treeroot):
goodfiles = fnmatch.filter(files, pattern)
results.extend(os.path.join(base, f) for f in goodfiles)
return results
Run Code Online (Sandbox Code Playgroud)
工作正常。但我还想访问与过滤器不匹配的元素。
有人可以提供一些帮助吗?我可以在循环内构建一个正则表达式,但一定有一个更简单的解决方案,对吧?
考虑这一模式:*.py
。它匹配所有以py
扩展名结尾的路径。现在,是否有可能找到与其他所有内容相匹配的模式?
我认为这会做到:*[!.][!p][!y]
,但显然fnmatch.fnmatch
总是False
带着这个返回。
我想避免使用正则表达式。我知道我可以使用它们,但在这种情况下这是不可能的。
这里是 python 新手。我想创建一个脚本来扫描我的目录,如果文件名中包含特定字符串,那么它将自动移动到我选择的文件夹。已经尝试过这个,但没有运气:
import os
import shutil
import fnmatch
import glob
ffe_path = 'E:/FFE'
new_path = 'E:/FFE/Membership/letters'
keyword = 'membership'
os.chdir('E:/FFE/Membership')
os.mkdir('letters')
source_dir = 'E:/FFE'
dest_dir = 'E:/FFE/Membership/letters'
os.chdir(source_dir)
for top, dirs, files in os.walk(source_dir):
for filename in files:
if not filename.endswith('.docx'):
continue
file_path = os.path.join(top, filename)
with open(file_path, 'r') as f:
if '*membership' in f.read():
shutil.move(file_path, os.path.join(dest_dir, filename))
Run Code Online (Sandbox Code Playgroud)
任何见解将不胜感激。