在 Python 中排除隐藏文件
Posted
技术标签:
【中文标题】在 Python 中排除隐藏文件【英文标题】:Exclude hidden files in Python 【发布时间】:2021-03-08 11:39:05 【问题描述】:好吧,我必须做一件事:我必须计算带有或不带有隐藏文件、带有或不带有递归、带有或不带有特定扩展名的文件(取决于用户)(CLI)。问题在于隐藏文件。 我的方法:
if namespace.recursive == True:
for files in os.walk(top=namespace.path, topdown=True):
for i in files[2]:
countF += 1
print('Number of files in directory (with recursion): ', countF)
else:
p = Path(namespace.path)
for subdirs in p.iterdir():
if (subdirs.is_file()):
count += 1
print('Number of files in directory (without recursion): ', count)
计算隐藏文件的文件。 我想要做什么:我希望这种方法可以计算没有隐藏文件的文件。但是如果用户输入 -h 参数,我只想计算隐藏文件。所以我尝试为它做一个检查方法:
def check_attributes(filename):
if(os.path.isfile(filename)):
return win32api.GetFileAttributes(filename) & win32con.FILE_ATTRIBUTE_HIDDEN
else:
return 0
然后我尝试修改我的方法并在之后添加
for i in files[2]:
类似:
if check_attributes(f) == 0: #if it's not hidden - then count
但它仍然计入隐藏文件。我想了解如何正确地做到这一点。 非常感谢您的每一个回答! 编辑:全功能检查
def countFiles():
countF = int(0)
count = int(0)
c = int(0)
try:
if namespace.extension == '.':
if namespace.recursive == True:
if namespace.hidden == False:
for files in os.walk(top=namespace.path, topdown=True):
for i in files[2]:
if check_attributes(i) == 0:
countF += 1
print('Number of files in directory (with recursion): ', countF)
else:
if namespace.hidden == False:
p = Path(namespace.path)
for subdirs in p.iterdir():
if (subdirs.is_file()):
count += 1
print('Number of files in directory (without recursion): ', count)
else:
if namespace.recursive == True:
for files in os.walk(namespace.path):
for f in files[2]:
if os.path.splitext(f)[1] == namespace.extension:
c += 1
print('Number if files with extension ' + namespace.extension + ' in directory (without recursion):', c)
else:
for files in os.listdir(namespace.path):
if os.path.splitext(files)[1] == namespace.extension:
c += 1
print('Number if files with extension ' + namespace.extension + ' in directory (without recursion): ', c)
except Exception as e:
print('Error:\n', e)
sys.exit(0)
【问题讨论】:
你确定它超过了if(os.path.isfile(filename))
吗?这看起来是对的,但根据输入字符串,它可能无法通过检查。我可以看看你传递的例子吗?
@wholevinski 是的,当然!我输入 'python, .py 文件的路径 和我的目录的路径,例如 D:\Liza\backup'
你能用正斜杠试试看是否有帮助吗?它可能会将反斜杠和下一个字符解释为特殊/转义字符。
@wholevinski 是的,我试过了,但情况是一样的:(但是谢谢你的帮助!
好的,你能把你的隐藏文件检查添加到你的第一个代码sn-p中并发布整个函数吗?我想自己尝试完整的代码
【参考方案1】:
在您的原始代码中,有多个布尔参数创建不同的路径。据我所知,您的extension == '.'
路径是唯一一个调用check_attributes
的路径,因此可能 是问题所在。我决定尝试重写它。我重写它的方式有两个阶段:1. 递归或不递归获取文件 2. 使用提供的参数过滤文件。这是我想出的:
import argparse
import os
import win32api
import win32con
def count_files(args):
files = []
# Get the files differently based on whether recursive or not.
if args.recursive:
# Note here I changed how you're iterating. os.walk returns a list of tuples, so
# you can unpack the tuple in your for. current_dir is the current dir it's in
# while walking and found_files are all the files in that dir
for current_dir, dirs, found_files in os.walk(top=args.path, topdown=True):
files += [os.path.join(current_dir, found_file) for found_file in found_files]
else
# Note the os.path.join with the dir each file is in. It's important to store the
# absolute path of each file.
files += [os.path.join(args.path, found_file) for found_file in os.listdir(args.path)
if os.path.isfile(os.path.join(args.path, found_file))]
filtered_files = []
for found_file in files:
print(found_file)
if not args.hidden and (win32api.GetFileAttributes(found_file) & win32con.FILE_ATTRIBUTE_HIDDEN):
continue # hidden == False and file has hidden attribute, go to next one
if args.extension and not found_file.endswith(args.extension):
continue # File doesn't end in provided extension
filtered_files.append(found_file)
print(f'Length: len(filtered_files)')
return len(filtered_files)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Process some integers.')
# Note that I took advantage of some other argparse features here like
# required vs optional arguments and boolean types
parser.add_argument('path')
parser.add_argument('--recursive', action='store_true', default=False)
parser.add_argument('--hidden', action='store_true', default=False)
parser.add_argument('--extension', type=str)
args = parser.parse_args()
count_files(args)
【讨论】:
非常感谢您,先生!我实际上修改了我的方法,所以我没有使用你的代码,但现在我知道存储文件的绝对路径非常重要,因为你:) 实际上,这正是我发现它不起作用的原因以后出来。多亏了你的解释,我努力了,现在一切正常。非常感谢您的帮助,您真是太好了!你帮了我很多:)以上是关于在 Python 中排除隐藏文件的主要内容,如果未能解决你的问题,请参考以下文章