Python 从当前文件开始循环
Python Loop from current file
我正在尝试浏览目录中的文件并找到重复项并将其删除。我的目录中有 29 000 个文件,因此暴力破解需要一天以上的时间。
我的文件名如下:
"some_file_name"
"some-file-name"
所以一个名字有下划线,另一个名字有破折号,有时它们会相隔 2 或 3 个点。
那么如何让我的内循环从外循环在目录中的位置开始,并让它只检查接下来的 10 个?
这是我的暴力破解代码:
import glob, os
os.chdir("C:/Dir/dir")
for file in glob.glob("*"):
temp = file
temp = temp.replace("-", " ")
temp = temp.replace("_", " ")
#How do I start this loop where file is currently at and continue for the next 10 files
for file2 in glob.glob("*"):
temp2 = file2
temp2 = temp2.replace("-", " ")
temp2 = temp2.replace("_", " ")
if temp == temp2:
os.remove(file2)
据我从您的问题中了解到,您想从目录中删除名称相似的文件。我认为您的方法 ("look at the next 10 filenames or so") 过于不精确且过于复杂。
条件是,当文件some_file_name
和文件some-file-name
都存在时,删除其中一个
这可以通过构建文件名列表非常容易地完成,并且对于每个条目检查是否存在带有下划线而不是破折号的文件名,如果存在,则将其删除。
以下使用 set
来执行此操作,因为集合具有非常好的查找特性,即 some_value in some_set
比列表快得多。它还避免了过多的文件存在检查(如调用 os.path.isfile(file)
),因为我们已经从构建集合中知道所有存在的文件。
import glob, os
filenames = {file for file in glob.glob(r"C:\Dir\dir\*")}
for file in filenames:
delete_candidate = file.replace("-", "_")
if delete_candidate != file and delete_candidate in filenames:
os.remove(delete_candidate)
print("deleted " + delete_candidate)
{x for x in iterable}
是一个 集合理解 ,它从值列表构建一个集合。它就像列表推导一样工作。
您可以使用字典并将 "simple name"(不带 _ 或 -)作为键,将所有真实文件名作为值:
import glob, os
def extendDictValue(dDict, sKey, uValue):
if sKey in dDict:
dDict[sKey].append(uValue)
else:
dDict[sKey] = [uValue]
os.chdir("C:/Dir/dir")
filenames_dict = {}
for filename in glob.glob("*"):
simple_name = filename.replace("-", " ").replace("_", " ")
extendDictValue(filenames_dict, simple_name, filename)
for simple_name, filenames in filenames_dict.items():
if len(filenames) > 1:
filenames.pop(0)
for filename in filenames:
os.remove(filename)
我正在尝试浏览目录中的文件并找到重复项并将其删除。我的目录中有 29 000 个文件,因此暴力破解需要一天以上的时间。
我的文件名如下:
"some_file_name" "some-file-name"
所以一个名字有下划线,另一个名字有破折号,有时它们会相隔 2 或 3 个点。
那么如何让我的内循环从外循环在目录中的位置开始,并让它只检查接下来的 10 个?
这是我的暴力破解代码:
import glob, os
os.chdir("C:/Dir/dir")
for file in glob.glob("*"):
temp = file
temp = temp.replace("-", " ")
temp = temp.replace("_", " ")
#How do I start this loop where file is currently at and continue for the next 10 files
for file2 in glob.glob("*"):
temp2 = file2
temp2 = temp2.replace("-", " ")
temp2 = temp2.replace("_", " ")
if temp == temp2:
os.remove(file2)
据我从您的问题中了解到,您想从目录中删除名称相似的文件。我认为您的方法 ("look at the next 10 filenames or so") 过于不精确且过于复杂。
条件是,当文件some_file_name
和文件some-file-name
都存在时,删除其中一个
这可以通过构建文件名列表非常容易地完成,并且对于每个条目检查是否存在带有下划线而不是破折号的文件名,如果存在,则将其删除。
以下使用 set
来执行此操作,因为集合具有非常好的查找特性,即 some_value in some_set
比列表快得多。它还避免了过多的文件存在检查(如调用 os.path.isfile(file)
),因为我们已经从构建集合中知道所有存在的文件。
import glob, os
filenames = {file for file in glob.glob(r"C:\Dir\dir\*")}
for file in filenames:
delete_candidate = file.replace("-", "_")
if delete_candidate != file and delete_candidate in filenames:
os.remove(delete_candidate)
print("deleted " + delete_candidate)
{x for x in iterable}
是一个 集合理解 ,它从值列表构建一个集合。它就像列表推导一样工作。
您可以使用字典并将 "simple name"(不带 _ 或 -)作为键,将所有真实文件名作为值:
import glob, os
def extendDictValue(dDict, sKey, uValue):
if sKey in dDict:
dDict[sKey].append(uValue)
else:
dDict[sKey] = [uValue]
os.chdir("C:/Dir/dir")
filenames_dict = {}
for filename in glob.glob("*"):
simple_name = filename.replace("-", " ").replace("_", " ")
extendDictValue(filenames_dict, simple_name, filename)
for simple_name, filenames in filenames_dict.items():
if len(filenames) > 1:
filenames.pop(0)
for filename in filenames:
os.remove(filename)