【发布时间】:2022-10-16 19:49:23
【问题描述】:
我正在使用os.walk 来识别通用源目录 (SRC) 中包含my_list 中的任何字符串的路径:
SRC = '/User/dir_1/'
my_list = ["dog", "cat", "mouse", "bird"]
for dirpath, dirnames, filenames in os.walk(SRC):
for folders in dirnames:
for x in my_list:
if x in folders:
source_path = os.path.join(dirpath, folders)
假设print(source_path) 给出以下内容:
/User/dir_1/cat_test/
/User/dir_1/cat_test/bird_results/
/User/dir_1/dir_2/dog_test/
/User/dir_1/dir_2/dog_test/cat_results/
/User/dir_1/mouse_test/
/User/dir_1/mouse_test/mouse_results/
/User/dir_1/unknown_test/dog_results/
/User/dir_1/bird_files/
/User/dir_1/bird_files/bird_a_files/
/User/dir_1/bird_files/bird_b_files/
我的目标是 shutil.move 我的 source_path 的,但是因为,例如,移动 /User/dir_1/bird_files/ 然后尝试移动 /User/dir_1/bird_files/bird_a_files/ 将导致 FileNotFound 错误,我想过滤我的 source_path 以包括那些只有 1 次出现的任何my_list 中的字符串,这样我的 source_path 是:
/User/dir_1/cat_test/
/User/dir_1/dir_2/dog_test/
/User/dir_1/mouse_test/
/User/dir_1/unknown_test/dog_results/
/User/dir_1/bird_files/
我已经尝试过source_path.count(x) == 1,但它迭代了my_list,而不是计数any x in my_list,这样我的输出是(例如):
/User/dir_1/dir_2/dog_test/cat_results/ count == 1 (for dog)
/User/dir_1/dir_2/dog_test/cat_results/ count == 1 (for cat)
/User/dir_1/dir_2/dog_test/cat_results/ count == 0 (for mouse)
/User/dir_1/dir_2/dog_test/cat_results/ count == 0 (for bird)
但我想看看(例如):
/User/dir_1/dir_2/dog_test/cat_results/ count == 2 (for any x in my_list)
这将允许我用count != 1 过滤掉任何source_path
【问题讨论】:
-
你就不能做
for dirpath, dirnames, filenames in os.walk(SRC): print(dirpath.count("dog")),目标有点模糊…… -
@Ferret我的目标是排除在 my_list 中包含多次出现的任何项目的任何 source_path (包括同一项目的多次出现)。所以,例如/dir/dog/cat 和 dir/dog/dog 将被排除,但 /dir/dog 将被保留
-
您应该创建列表以保留您已经移动的
source_path,并使用此列表检查下一个source_path。最终你应该使用os.path.exists(source_path)来检查source_path是否仍然存在。或者干脆使用try/except捕获错误FileNotFound
标签: python list count shutil os.walk