如何在Python3中使用生成器对象(pathlib.iterdir)执行比较?

时间:2019-03-19 16:29:10

标签: python python-3.x pathlib

我在名为calls的目录中有大量文件。所有这些文件的文件名均包含 创建日期,例如: 20181022 _151012_kK029150d6.xml

我需要找到所有创建日期超过180天的文件。 我正在使用pathlib来收集文件名并可以打印文件名。 我想做这样的事情:

calls = Path('/Users/muh/Python/calls')
for fyle in calls.iterdir():
    datetime.strptime(fyle[:8], "%Y%m%d")

但是我得到“ PosixPath'对象不可下标”

我需要将每个文件名中的YYYYMMDD与当前的YYYYMMDD进行比较。

1 个答案:

答案 0 :(得分:0)

正如@juanpa.arrivillaga建议使用fyle.name[:8]那样,很好。

  

建议:每当您遇到这种问题时,只需尝试按以下方式获取该对象的详细信息(任何对象的定义属性/方法是什么)。

>>> contents = calls.iterdir()
>>> 
>>> content = contents.next()
>>> 
>>> content
PosixPath('/Users/hygull/Projects/django1.9.x-docs/Sfw/file_handling/calls/20181022_151012_kK029150d6.xml')
>>> 
>>> dir(content)
['__bytes__', '__class__', '__delattr__', '__div__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__rdiv__', '__reduce__', '__reduce_ex__', '__repr__', '__rtruediv__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__truediv__', '_accessor', '_cached_cparts', '_cparts', '_drv', '_flavour', '_format_parsed_parts', '_from_parsed_parts', '_from_parts', '_hash', '_init', '_make_child', '_make_child_relpath', '_opener', '_parse_args', '_parts', '_pparts', '_raw_open', '_root', '_str', 'absolute', 'anchor', 'as_posix', 'as_uri', 'chmod', 'cwd', 'drive', 'exists', 'glob', 'group', 'is_absolute', 'is_block_device', 'is_char_device', 'is_dir', 'is_fifo', 'is_file', 'is_reserved', 'is_socket', 'is_symlink', 'iterdir', 'joinpath', 'lchmod', 'lstat', 'match', 'mkdir', 'name', 'open', 'owner', 'parent', 'parents', 'parts', 'relative_to', 'rename', 'replace', 'resolve', 'rglob', 'rmdir', 'root', 'stat', 'stem', 'suffix', 'suffixes', 'symlink_to', 'touch', 'unlink', 'with_name', 'with_suffix']
>>> 

在上面的列表中,您将找到[..., '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_handling/calls

我已经存储了每一点,以帮助您解决问题。除了 d details 之外,我没有尝试引入新变量,并且还多次将您的名为 fyle 的变量用于不同的目的(如果不要在简单的程序中进一步使用该变量,也可以为大型应用程序引入有意义的变量名。

  

日期是实际的日期时间对象,可用于进行操纵以实现最终目标。

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')}}