如何在Python3中使用生成器对象(pathlib.iterdir)执行比较?
我在一个名为calls的目录中有很多文件。所有这些文件的文件名中都包含,其创建日期,例如:20181022\u 151012\u kK029150d6.xml 我需要找到创建日期大于等于180天的所有文件。 我正在使用pathlib收集文件名,并可以打印文件名。 我想这样做:如何在Python3中使用生成器对象(pathlib.iterdir)执行比较?,python,python-3.x,pathlib,Python,Python 3.x,Pathlib,我在一个名为calls的目录中有很多文件。所有这些文件的文件名中都包含,其创建日期,例如:20181022\u 151012\u kK029150d6.xml 我需要找到创建日期大于等于180天的所有文件。 我正在使用pathlib收集文件名,并可以打印文件名。 我想这样做: calls = Path('/Users/muh/Python/calls') for fyle in calls.iterdir(): datetime.strptime(fyle[:8], "%Y%m%d")
calls = Path('/Users/muh/Python/calls')
for fyle in calls.iterdir():
datetime.strptime(fyle[:8], "%Y%m%d")
但我得到“PosixPath”对象不可下标
我需要将每个文件名中的YYYYMMDD与当前的YYYYMMDD进行比较。As
@juanpa.arrivillaga
建议使用fyle.name[:8]
,这很好
建议:每当遇到此类问题时,请尝试获取该对象的详细信息,如下所示(为任何对象定义了哪些属性/方法)
在上面的列表中,您可以找到类似于[…,'mkdir',name',open',owner',parent',…]
的条目,您可以看到'name'
是其中的一部分。最后,您可以尝试访问像fyle.name
|type(fyle.name)
等来检查它是否是字符串或其他内容
解决方案:
所以,你可以这样做
from pathlib import Path
from datetime import datetime
calls = Path("/Users/muh/Python/calls")
details = {}
i = 1
for fyle in calls.iterdir():
date = datetime.strptime(fyle.name[:8], "%Y%m%d")
# Write logic here
详细的:
在下面的代码中,我已将详细信息存储到字典中,以便您可以查看代码中更改的对象的不同状态
在我的例子中,calls
目录的路径是/Users/hygull/Projects/django1.9.x-docs/Sfw/file\u handling/calls
我已经存储了每一部分,以帮助您解决问题。我没有尝试引入新变量,除了d和详细信息&还多次将名为fyle的变量用于不同的目的(如果在简单程序中不进一步使用该变量,这是很好的,为大型应用程序引入有意义的变量名称也是很好的)
date是实际的datetime对象,您可以使用它进行操作以实现最终目标
输出
使用
fyle.name[:8]
@mr.zog,请检查我的答案是否适合您。在查看了评论和否决票之后,我更新了我的答案,现在一切都好了。顺便说一句,对于任何python,请始终使用generic[python]标记questions@mr.zog,我再次用调试信息更新了我的答案,这将对您有用。@juanpa.arrivillaga,非常感谢您的建议。我是盲人,看不出这个问题是否与使用pathlib
有关,那么我为什么建议在这里使用os
。我已经对该行进行了注释,并使用替代方法从文件路径获取基本名称。再次感谢你指出我的错误。不@juanpa.arrivillaga,这里没有实际用途。也许,这有点尴尬,因为这不是你的问题。第一次,当我不知道使用.name
时,我提出了不同的方法来解决问题。当时我想记下并存储转换的每个细节。现在,我更新了我的答案。我知道你已经解决了。为了澄清疑问,我将答案分为两部分。考虑第一个作为工作。第二个是详细的(用于调试此类问题)。谢谢你回信。
from pathlib import Path
from datetime import datetime
calls = Path("/Users/muh/Python/calls")
details = {}
i = 1
for fyle in calls.iterdir():
date = datetime.strptime(fyle.name[:8], "%Y%m%d")
# Write logic here
from pathlib import Path
from datetime import datetime
calls = Path("/Users/hygull/Projects/django1.9.x-docs/Sfw/file_handling/calls")
details = {}
i = 1
for fyle in calls.iterdir():
d = {}
d["pathlib"] = fyle
fyle = str(fyle)
d["fullpath"] = fyle
# fyle = fyle.split("/")[-1]
fyle = fyle.name[:8]
d["file_name"] = fyle
date = datetime.strptime(fyle[:8], "%Y%m%d")
d["date"] = date
# Write your business logic here
details["file" + str(i)] = d
i += 1
print(details)
{'file2': {'date': datetime.datetime(2018, 10, 25, 0, 0), 'file_name': '20181025_151013_kK029150d7.xml', 'fullpath': '/Users/hygull/Projects/django1.9.x-docs/Sfw/file_handling/calls/20181025_151013_kK029150d7.xml', 'pathlib': PosixPath('/Users/hygull/Projects/django1.9.x-docs/Sfw/file_handling/calls/20181025_151013_kK029150d7.xml')}, 'file1': {'date': datetime.datetime(2018, 10, 22, 0, 0), 'file_name': '20181022_151012_kK029150d6.xml', 'fullpath': '/Users/hygull/Projects/django1.9.x-docs/Sfw/file_handling/calls/20181022_151012_kK029150d6.xml', 'pathlib': PosixPath('/Users/hygull/Projects/django1.9.x-docs/Sfw/file_handling/calls/20181022_151012_kK029150d6.xml')}}