Как выполнить сравнение с использованием объекта генератора (pathlib.iterdir) в Python3? - PullRequest
3 голосов
/ 19 марта 2019

У меня есть тонна файлов в каталоге с именем звонки. Все эти файлы содержат в именах файлов дату их создания, например: 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 не подписан»

Мне нужно сравнить ГГГГММДД в ​​каждом имени файла с текущим ГГГГММДД, это все.

1 Ответ

0 голосов
/ 19 марта 2019

Как @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 несколько раз для разных целей (Это хорошо, если не и дальше использовать эту переменную в простых программах, а также полезно ввести значимые имена переменных для больших приложений).

date - это фактический объект datetime, который вы можете использовать для манипуляции для достижения вашей конечной цели.

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