• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Сортировка книг в формате PDF по годам выпуска с помощью Python

Не знаю как у других, но у меня есть такая привычка – собирать как можно больше информации об изучаемом предмете. Не факт, что в будущем она может понадобиться, но, тем не менее, я от нее пока что не избавился. И вот, когда я начал изучать Python, конечно же, мне в голову пришла «гениальная» мысль скачать как можно больше книг по изучаемой теме. Со временем количество книг росло и, уже трудно было разобраться, что и где искать. Но хуже всего то, что не особо было понятно, свежая это книга или года эдак из 2010-го. Большинство книг, которые я скачивал (не спрашивайте где, думаю, что сами знаете) в формате pdf. И мне потребовалось как-то отсортировать их по году выпуска. Открывать вручную файл и перемещать его в нужную папку достаточно долго. Поэтому немного погуглив я понял, что нужно считать метаданные из файла, для того, чтобы получить дату создания и соответственно переместить файл в нужную папку.

Надо отметить, что сильно полагаться на данные, которые находятся в метаданных именно в том случае, если вам требуется определить точную дату, когда была выпущена книга, не стоит. Ведь в метаданных может быть указана информация о дате выхода перевода книги, тогда как книга вышла на самом деле на пару лет раньше. Ну или стоять дата на год ранее, а в самой книге дата выпуска будет на год позднее. Но, для сортировки книг ее вполне можно использовать. А в дальнейшем уже проверять дату глазами.

86d32073-8b19-4090-9190-bfc44e31e717.jpg


Что потребуется?

Для того чтобы все заработало нужна будет библиотека PyPDF2. Установка происходит как обычно. Пишем в терминале:

pip install PyPDF2

Ну и стандартная библиотека os, которую нужно будет просто импортировать:

Python:
import os

from PyPDF2 import PdfFileReader


Создание скрипта

Создадим заготовку для будущего кода, в который добавим несколько функций. Первая для получения метаданных из pdf, а вторая для перемещения файла в нужную папку, третья для получения пользовательского ввода, на основании которого будем обрабатывать директорию. Ну и добавим функцию main, в которой будем запускать все процессы.

Вот код заготовки:

Python:
import os

from PyPDF2 import PdfFileReader


def get_date_file(file_name):
    pass


def move_file(ins, item, date_f):
    pass


def get_target_path():
    pass

def main():
    pass


if __name__ == "__main__":
    main()

Что же, заготовка готова. Давайте двигаться дальше. Для начала получим директорию, в которой будем сканировать файлы на наличие pdf. Для этого запустим функцию def get_target_path(), которая будет возвращать папку для обработки.

Python:
def main():
    ins = get_target_path()

А так же напишем саму функцию, в которой (до посинения пользователя :)) будем запрашивать валидную папку, которая существует. В противном же случае, будем просить его ввести путь заново.

Python:
def get_target_path():
    while not os.path.isdir(user_input := input("Введите путь к папке: ")):
        print(f"Папка {user_input} не найдена")
    print(f"\nРаботаем с папкой {user_input}\n")
    return user_input

Теперь необходимо просканировать содержимое полученной директории. Для этого воспользуемся функцией os.listdir.

scan_dir = os.listdir(ins)

Ну и в цикле будем перебирать полученный список файлов, из которого будем выбирать только те, расширение которых равно «.pdf», чтобы не передать в функцию получения метаданных файлы, которые не имеют отношения к pdf. Далее, полученную директорию и имя файла нужно будет объединить и передать в функцию def get_date_file(file_name), которая вернет дату создания файла. А далее, запустить функцию def move_file(ins, item, date_f), в которую передать директорию, имя файла и полученную дату создания.

Вот код функции main:

Python:
def main():
    ins = get_target_path()
    for item in os.listdir(ins):
        if item.endswith('.pdf'):
            print(item)
            date_f = get_date_file(os.path.join(ins, item))
            move_file(ins, item, date_f)

Теперь перейдем к созданию функции для получения даты. Открываем файл для чтения побайтово. Прочитанное содержимое передадим в PdfFileReader. Затем получим с помощью функции getDocumentInfo() метаданные. Не все файлы pdf имеют метаданные. Поэтому для начала проверяем их наличие, затем получаем из списка метаданных дату создания, обрезаем ее, для приведения к году издания. Если же метаданных у файла нет, в этом случае просто возвращаем значение 0000. И закрываем файл. Но, тут нужно учесть, что есть такие pdf файлы, которые собраны просто из картинок. И вот в них попросту нет метаданных вообще. При отсутствии метаданных программа просто вылетает с ошибкой. Поэтому обернем код получения метаданных в блок try – except. В случае если нам попадется такой вот файл, вернем значение 0000. Так же, если файл битый, то открыть его мы также не сможем. Поэтому открытие файла так же обернем в блок try – except, в котором будем сообщать об ошибке и закрывать файл.

Python:
def get_date_file(file_name):
    try:
        file = open(file_name, "rb")
    except:
        print(f'Не могу открыть файл {file_name}')
    try:
        pdf_toread = PdfFileReader(file)
        if pdf_info := pdf_toread.getDocumentInfo():
            file.close()
            return pdf_info['/CreationDate'][2:6]
        else:
            file.close()
            return '0000'
    except:
        file.close()
        return '0000'

Вот, кажется, одна функция готова. Закрывать файл даже в случае ошибки обязательно. Если этого не делать, переместить файл в нужную директорию просто не получится, так как будет возникать ошибка доступа к файлу. Он будет занят другим процессом.

Теперь сделаем функцию перемещения файла в директорию с полученной датой. Здесь в самом начале проверяем, есть ли директория с нужным нам именем, а именно датой создания файла. Если есть, ничего не делаем, а вот если нет, то просто создаем. Ну и перемещаем файл в только что созданную директорию.

Python:
def move_file(ins, item, date_f):
    if not os.path.isdir(os.path.join(ins, date_f)):
        os.mkdir(os.path.join(ins, date_f))
    os.rename(os.path.join(ins, item), os.path.join(ins, date_f, item))

Вот и все. На этом программу, на данном этапе можно считать законченной. Но, книги ведь бываю т не только в формате pdf, но так же и в epub и в fb2. Поэтому, думаю, что нужно будет немного улучшить сортировку, чтобы книги в других форматах тоже складировались в нужные папки.

Вот как выглядит директория с книгами до сортировки:

screenshot1.png

А так уже после:

screenshot2.png

Ну и полный код скрипта:

Python:
import os

from PyPDF2 import PdfFileReader


def get_date_file(file_name):
    try:
        file = open(file_name, "rb")
    except:
        print(f'Не могу открыть файл {file_name}')
    try:
        pdf_toread = PdfFileReader(file)
        if pdf_info := pdf_toread.getDocumentInfo():
            file.close()
            return pdf_info['/CreationDate'][2:6]
        else:
            file.close()
            return '0000'
    except:
        file.close()
        return '0000'


def move_file(ins, item, date_f):
    if not os.path.isdir(os.path.join(ins, date_f)):
        os.mkdir(os.path.join(ins, date_f))
    os.rename(os.path.join(ins, item), os.path.join(ins, date_f, item))


def get_target_path():
    while not os.path.isdir(user_input := input("Введите путь к папке: ")):
        print(f"Папка {user_input} не найдена")
    print(f"\nРаботаем с папкой {user_input}\n")
    return user_input


def main():
    ins = get_target_path()
    for item in os.listdir(ins):
        if item.endswith('.pdf'):
            print(item)
            date_f = get_date_file(os.path.join(ins, item))
            move_file(ins, item, date_f)


if __name__ == "__main__":
    main()

Спасибо за внимание. Надеюсь ,что данная информация кому-то будет полезна

Вторая часть
Третья часть
 
Последнее редактирование:

f22

Codeby Academy
Gold Team
05.05.2019
1 842
225
BIT
1 057
И мне потребовалось как-то отсортировать их по году выпуска.
Хочу обратить внимание автора и читателей на следующий момент: дата указанная в метаданных документа может означать всё что угодно и ориентироваться на неё при сортировке, думаю, не стоит.
Зачастую отечественные издательства добавляют туда дату издания книги в русском переводе, хотя с момента оригинального издания могло пройти несколько лет. Узнать эту информацию проще всего на странице с данными типографии:
1649656988227.png
{'/ModDate': "D:20170520111908+03'00'", '/CreationDate': "D:20170319212134-03'00'", '/Producer': 'itext-paulo-155 (itextpdf.sf.net-lowagie.com)', '/Creator': 'pdftk 2.01 - '}

1649657123367.png
{'/Producer': 'Foxit PhantomPDF Printer Version 8.2.0.1217', '/Author': '', '/Creator': '', '/Keywords': '', '/Subject': '', '/Title': '', '/ModDate': "D:20210511135624+02'00'"}
Так что перед покупкой книги обязательно изучайте эту страницу, дабы точно знать, оперативно или нет был произведён перевод.


Что касается кода:
в которую добавим две функции.
Так функций же три)

def get_date_file(file_name):
Код функции очень странный и вот почему:
1.
Мы ожидаем от пользователя, что он введёт верный путь к папке и обмазываем почему-то только открытие файла блоком try.
И в этом же блоке мы можем получить другую ошибку - отсутствие нужного поля в документе. Но except один...
В итоге может сложиться ситуация, когда при каком-то битом файле, который не смог обработать модуль PyPDF2, мы получим его pdf_info равное '0000'

2.
Для подобных конструкций
Python:
pdf_info = pdf_toread.getDocumentInfo()
if pdf_info:
в python 3.8 ввели моржовый оператор.

3.
pdf_info = str(pdf_info['/CreationDate'].split(":")[1].split("+")[0][:4])
Как же хитро)
Если нужен год, берите просто срез
Python:
pdf_info = pdf_info['/CreationDate'][2:6]
Ну и конечно переопределять переменную тут совсем не нужно, разумнее сразу возвращать значение:
Python:
return pdf_info['/CreationDate'][2:6]

точно так же и в блоке except
Python:
return '0000'

3.1.
А вообще, раз подобный формат изначально присутствует в документе, лучше парсить его модулем datetime


4.
Со своей стороны я бы предложил выделить запрос папки от пользователя и проверку наличия этой папки в отдельную функцию
Python:
def get_target_path():
    while not os.path.isdir(user_input := input("Введите путь к папке: ")):
        print(f"Папка {user_input} не найдена")
    print(f"Работаем с папкой {user_input}")

5.
Для "склеивания" путей лучше использовать метод os.path.join()

5.1.
Тут можно сэкономить строку
Python:
scan_dir = os.listdir(ins)
for item in scan_dir:

Python:
for item in os.listdir(ins):
    full_path = os.path.join(ins, item)
    date_f = get_date_file(full_path)
 

Johan Van

Green Team
13.06.2020
356
667
BIT
221
Хочу обратить внимание автора и читателей на следующий момент: дата указанная в метаданных документа может означать всё что угодно и ориентироваться на неё при сортировке, думаю, не стоит.
Зачастую отечественные издательства добавляют туда дату издания книги в русском переводе, хотя с момента оригинального издания могло пройти несколько лет. Узнать эту информацию проще всего на странице с данными типографии:
Посмотреть вложение 58503
{'/ModDate': "D:20170520111908+03'00'", '/CreationDate': "D:20170319212134-03'00'", '/Producer': 'itext-paulo-155 (itextpdf.sf.net-lowagie.com)', '/Creator': 'pdftk 2.01 - '}

Посмотреть вложение 58504
{'/Producer': 'Foxit PhantomPDF Printer Version 8.2.0.1217', '/Author': '', '/Creator': '', '/Keywords': '', '/Subject': '', '/Title': '', '/ModDate': "D:20210511135624+02'00'"}
Так что перед покупкой книги обязательно изучайте эту страницу, дабы точно знать, оперативно или нет был произведён перевод.


Что касается кода:

Так функций же три)


Код функции очень странный и вот почему:
1.
Мы ожидаем от пользователя, что он введёт верный путь к папке и обмазываем почему-то только открытие файла блоком try.
И в этом же блоке мы можем получить другую ошибку - отсутствие нужного поля в документе. Но except один...
В итоге может сложиться ситуация, когда при каком-то битом файле, который не смог обработать модуль PyPDF2, мы получим его pdf_info равное '0000'

2.
Для подобных конструкций
Python:
pdf_info = pdf_toread.getDocumentInfo()
if pdf_info:
в python 3.8 ввели моржовый оператор.

3.

Как же хитро)
Если нужен год, берите просто срез
Python:
pdf_info = pdf_info['/CreationDate'][2:6]
Ну и конечно переопределять переменную тут совсем не нужно, разумнее сразу возвращать значение:
Python:
return pdf_info['/CreationDate'][2:6]

точно так же и в блоке except
Python:
return '0000'

3.1.
А вообще, раз подобный формат изначально присутствует в документе, лучше парсить его модулем datetime


4.
Со своей стороны я бы предложил выделить запрос папки от пользователя и проверку наличия этой папки в отдельную функцию
Python:
def get_target_path():
    while not os.path.isdir(user_input := input("Введите путь к папке: ")):
        print(f"Папка {user_input} не найдена")
    print(f"Работаем с папкой {user_input}")

5.
Для "склеивания" путей лучше использовать метод os.path.join()

5.1.
Тут можно сэкономить строку
Python:
scan_dir = os.listdir(ins)
for item in scan_dir:

Python:
for item in os.listdir(ins):
    full_path = os.path.join(ins, item)
    date_f = get_date_file(full_path)

Большое спасибо за комментарий. Мне действительно важно, что кто-то предлагает исправления, так как я только учусь программировать на питоне. Про моржовый оператор слышал. По моему даже смотрел, что это такое )) но, если не пользуешься, то забываешь ))

Что же касается издания книги и перевода, то да, часто сталкивался с этим. Бывает даже, что в метаданных указан год, к примеру, 2014, а в книге уже указан 2015 )) Можно сказать, что книга из будущего )
 
  • Нравится
Реакции: Strife и f22

Johan Van

Green Team
13.06.2020
356
667
BIT
221
В итоге может сложиться ситуация, когда при каком-то битом файле, который не смог обработать модуль PyPDF2, мы получим его pdf_info равное '0000'
Да, вы совершенно правы. Сталкивался с этим, но не придавал значения. Некоторые битые файлы попадали в папку 0000.
 
  • Нравится
Реакции: f22

Johan Van

Green Team
13.06.2020
356
667
BIT
221
Не знаю как у других, но у меня есть такая привычка – собирать как можно больше информации об изучаемом предмете. Не факт, что в будущем она может понадобиться, но, тем не менее, я от нее пока что не избавился. И вот, когда я начал изучать Python, конечно же, мне в голову пришла «гениальная» мысль скачать как можно больше книг по изучаемой теме. Со временем количество книг росло и, уже трудно было разобраться, что и где искать. Но хуже всего то, что не особо было понятно, свежая это книга или года эдак из 2010-го. Большинство книг, которые я скачивал (не спрашивайте где, думаю, что сами знаете) в формате pdf. И мне потребовалось как-то отсортировать их по году выпуска. Открывать вручную файл и перемещать его в нужную папку достаточно долго. Поэтому немного погуглив я понял, что нужно считать метаданные из файла, для того, чтобы получить дату создания и соответственно переместить файл в нужную папку.



Что потребуется?

Для того чтобы все заработало нужна будет библиотека PyPDF2. Установка происходит как обычно. Пишем в терминале:

pip install PyPDF2

Ну и стандартная библиотека os, которую нужно будет просто импортировать:

Python:
import os

from PyPDF2 import PdfFileReader


Создание скрипта

Создадим заготовку для будущего кода, в которую добавим две функции. Первая для получения метаданных из pdf, а вторая для перемещения файла в нужную папку. Ну и добавим функцию main, в которой будем запускать все процессы. Вот код заготовки:

Python:
import os

from PyPDF2 import PdfFileReader


def get_date_file(file_name):
    pass


def move_file(ins, item, date_f):
    pass


def main():
    pass


if __name__ == "__main__":
    main()

Что же, заготовка готова. Давайте двигаться дальше. Для начала получим директорию, в которой будем сканировать файлы на наличие pdf. Для этого просто создадим пользовательский ввод в функции main.

Python:
def main():
    ins = input('Введите директорию для сканирования: ')

Теперь необходимо просканировать содержимое полученной директории. Для этого воспользуемся функцией os.listdir.

scan_dir = os.listdir(ins)

Ну и в цикле будем перебирать полученный список файлов, из которого будем выбирать только те, расширение которых равно «.pdf», чтобы не передать в функцию получения метаданных файлы, которые не имеют отношения к pdf. Далее, полученную директорию и имя файла нужно будет объединить и передать в функцию def get_date_file(file_name), которая вернет дату создания файла. А далее, запустить функцию def move_file(ins, item, date_f), в которую передать директорию, имя файла и полученную дату создания. Вот код функции main:

Python:
def main():
    ins = input('Введите директорию для сканирования: ')
    scan_dir = os.listdir(ins)
    for item in scan_dir:
        if item.endswith('.pdf'):
            print(item)
            date_f = get_date_file(f'{ins}\\{item}')
            move_file(ins, item, date_f)

Теперь перейдем к созданию функции для получения даты. Открываем файл для чтения побайтово. Прочитанное содержимое передадим в PdfFileReader. Затем получим с помощью функции getDocumentInfo() метаданные. Не все файлы pdf имеют метаданные. Поэтому для начала проверяем их наличие, затем получаем из списка метаданных дату создания, обрезаем ее, для приведения к году издания. Если же метаданных у файла нет, в этом случае просто присваиваем возвращаемой переменной значение 0000. И закрываем файл. Но, тут нужно учесть, что есть такие pdf файлы, которые собраны просто из картинок. И вот в них попросту нет метаданных вообще. При отсутствии метаданных программа просто вылетает с ошибкой. Поэтому обернем код получения метаданных в блок try – except. В случае, если нам попадется такой вот файл, присвоим переменной с датой значение 0000. После чего, в блоке finally закрываем открытый файл и передаем значение даты.

Python:
def get_date_file(file_name):
    try:
        file = open(file_name, "rb")
        pdf_toread = PdfFileReader(file)
        pdf_info = pdf_toread.getDocumentInfo()
        if pdf_info:
            pdf_info = str(pdf_info['/CreationDate'].split(":")[1].split("+")[0][:4])
        else:
            pdf_info = '0000'
        file.close()
    except:
        pdf_info = '0000'
    finally:
        file.close()
        return pdf_info

Вот, кажется, одна функция готова. Закрывать файл даже в случае ошибки обязательно. Если этого не делать, переместить файл в нужную директорию просто не получится, так как будет возникать ошибка доступа к файлу. Он будет занят другим процессом.

Теперь сделаем функцию перемещения файла в директорию с полученной датой. Здесь в самом начале проверяем, есть ли директория с нужным нам именем, а именно датой создания файла. Если есть, ничего не делаем, а вот если нет, то просто создаем. Ну и перемещаем файл в только что созданную директорию.

Python:
def move_file(ins, item, date_f):
    if not os.path.isdir(f'{ins}\\{date_f}'):
        os.mkdir(f'{ins}\\{date_f}')
    os.rename(f'{ins}\\{item}', f'{ins}\\{date_f}\\{item}')

Вот и все. На этом программу, на данном этапе можно считать законченной. Но, книги ведь бывают не только в формате pdf, но так же и в epub, и в fb2. Поэтому, думаю, что нужно будет немного улучшить сортировку, чтобы книги в других форматах тоже складировались в нужные папки.

Вот как выглядит директория с книгами до сортировки:


А так уже после:


Ну и полный код скрипта:

Python:
import os

from PyPDF2 import PdfFileReader


def get_date_file(file_name):
    try:
        file = open(file_name, "rb")
        pdf_toread = PdfFileReader(file)
        pdf_info = pdf_toread.getDocumentInfo()
        if pdf_info:
            pdf_info = str(pdf_info['/CreationDate'].split(":")[1].split("+")[0][:4])
        else:
            pdf_info = '0000'
        file.close()
    except:
        pdf_info = '0000'
    finally:
        file.close()
        return pdf_info


def move_file(ins, item, date_f):
    if not os.path.isdir(f'{ins}\\{date_f}'):
        os.mkdir(f'{ins}\\{date_f}')
    os.rename(f'{ins}\\{item}', f'{ins}\\{date_f}\\{item}')


def main():
    ins = input('Введите директорию для сканирования: ')
    scan_dir = os.listdir(ins)
    for item in scan_dir:
        if item.endswith('.pdf'):
            print(item)
            date_f = get_date_file(f'{ins}\\{item}')
            move_file(ins, item, date_f)


if __name__ == "__main__":
    main()

Спасибо за внимание. Надеюсь ,что данная информация кому-то будет полезна

В соответствии с замечаниями поправил код скрипта. Не знаю, насколько точно это сделал, но я старался ))

Python:
import os

from PyPDF2 import PdfFileReader


def get_date_file(file_name):
    try:
        file = open(file_name, "rb")
    except:
        print(f'Не могу открыть файл {file_name}')
        file.close()
    try:
        pdf_toread = PdfFileReader(file)
        if pdf_info := pdf_toread.getDocumentInfo():
            file.close()
            return pdf_info['/CreationDate'][2:6]
        else:
            file.close()
            return '0000'
    except:
        file.close()
        return '0000'


def move_file(ins, item, date_f):
    if not os.path.isdir(os.path.join(ins, date_f)):
        os.mkdir(os.path.join(ins, date_f))
    os.rename(os.path.join(ins, item), os.path.join(ins, date_f, item))


def get_target_path():
    while not os.path.isdir(user_input := input("Введите путь к папке: ")):
        print(f"Папка {user_input} не найдена")
    print(f"\nРаботаем с папкой {user_input}\n")
    return user_input


def main():
    ins = get_target_path()
    for item in os.listdir(ins):
        if item.endswith('.pdf'):
            print(item)
            date_f = get_date_file(os.path.join(ins, item))
            move_file(ins, item, date_f)
        

if __name__ == "__main__":
    main()
 

Johan Van

Green Team
13.06.2020
356
667
BIT
221
Хочу обратить внимание автора и читателей на следующий момент: дата указанная в метаданных документа может означать всё что угодно и ориентироваться на неё при сортировке, думаю, не стоит.
Зачастую отечественные издательства добавляют туда дату издания книги в русском переводе, хотя с момента оригинального издания могло пройти несколько лет. Узнать эту информацию проще всего на странице с данными типографии:
Посмотреть вложение 58503
{'/ModDate': "D:20170520111908+03'00'", '/CreationDate': "D:20170319212134-03'00'", '/Producer': 'itext-paulo-155 (itextpdf.sf.net-lowagie.com)', '/Creator': 'pdftk 2.01 - '}

Посмотреть вложение 58504
{'/Producer': 'Foxit PhantomPDF Printer Version 8.2.0.1217', '/Author': '', '/Creator': '', '/Keywords': '', '/Subject': '', '/Title': '', '/ModDate': "D:20210511135624+02'00'"}
Так что перед покупкой книги обязательно изучайте эту страницу, дабы точно знать, оперативно или нет был произведён перевод.


Что касается кода:

Так функций же три)


Код функции очень странный и вот почему:
1.
Мы ожидаем от пользователя, что он введёт верный путь к папке и обмазываем почему-то только открытие файла блоком try.
И в этом же блоке мы можем получить другую ошибку - отсутствие нужного поля в документе. Но except один...
В итоге может сложиться ситуация, когда при каком-то битом файле, который не смог обработать модуль PyPDF2, мы получим его pdf_info равное '0000'

2.
Для подобных конструкций
Python:
pdf_info = pdf_toread.getDocumentInfo()
if pdf_info:
в python 3.8 ввели моржовый оператор.

3.

Как же хитро)
Если нужен год, берите просто срез
Python:
pdf_info = pdf_info['/CreationDate'][2:6]
Ну и конечно переопределять переменную тут совсем не нужно, разумнее сразу возвращать значение:
Python:
return pdf_info['/CreationDate'][2:6]

точно так же и в блоке except
Python:
return '0000'

3.1.
А вообще, раз подобный формат изначально присутствует в документе, лучше парсить его модулем datetime


4.
Со своей стороны я бы предложил выделить запрос папки от пользователя и проверку наличия этой папки в отдельную функцию
Python:
def get_target_path():
    while not os.path.isdir(user_input := input("Введите путь к папке: ")):
        print(f"Папка {user_input} не найдена")
    print(f"Работаем с папкой {user_input}")

5.
Для "склеивания" путей лучше использовать метод os.path.join()

5.1.
Тут можно сэкономить строку
Python:
scan_dir = os.listdir(ins)
for item in scan_dir:

Python:
for item in os.listdir(ins):
    full_path = os.path.join(ins, item)
    date_f = get_date_file(full_path)

Разрешите, я задам вам вопрос. Это касается вот этого куска кода:

Python:
def get_date_file(file_name):
    try:
        file = open(file_name, "rb")
    except:
        print(f'Не могу открыть файл {file_name}')
        file.close()

Нужно ли, после того как сработало исключение закрывать файл? Ведь скорее всего, он даже не открылся.
А если он не открылся, то скрипт вызовет исключение в исключении :)

И еще один небольшой вопрос. Есть вот такая вот функция, которая позволяет получить кортеж из имени файла и пути к нему:

os.path.split("G:\Books\work.pdf")

Но, почему-то у меня она отрабатывает не особо корректно. Ну или наоборот, корректно, но я не совсем понимаю, почему так. Она возвращает мне только значение после разделителя, то есть, имя файла, а вот заголовок, то есть, то, что до имени файла пусто. Его попросту нет. В описании сказано, что она возвращает все только лишь, если есть слеш, именно "/". То есть, получается, что корректно, то есть с возвращением заголовка и окончания файла данная функция будет работать только на Linux?
 
Последнее редактирование:

f22

Codeby Academy
Gold Team
05.05.2019
1 842
225
BIT
1 057
Разрешите, я задам вам вопрос. Это касается вот этого куска кода:
На самом деле в python есть удобный класс path в модуле os
Там есть целых 3 метода, позволяющих проверить существование того или иного объекта:
os.path.isdir - проверка папки
os.path.isdir - проверка файла
os.path.exists - проверка и того, и другого

Использовать для того же самого действия исключения, как мне кажется, избыточно.

Нужно ли, после того как сработало исключение закрывать файл?
Чтобы не заморачиваться с этим вопросом, используйте менеджер контекста with
Он за вас сам закроет файл в случае возникновения ошибки.

То есть, получается, что корректно, то есть с возвращением заголовка и окончания файла данная функция будет работать только на Linux?
Да, всё верно! Ну или изощряться как-то так)
1649784703852.png
 
  • Нравится
Реакции: Johan Van

Johan Van

Green Team
13.06.2020
356
667
BIT
221
На самом деле в python есть удобный класс path в модуле os
Там есть целых 3 метода, позволяющих проверить существование того или иного объекта:
os.path.isdir - проверка папки
os.path.isdir - проверка файла
os.path.exists - проверка и того, и другого

Использовать для того же самого действия исключения, как мне кажется, избыточно.


Чтобы не заморачиваться с этим вопросом, используйте менеджер контекста with
Он за вас сам закроет файл в случае возникновения ошибки.


Да, всё верно! Ну или изощряться как-то так)
Посмотреть вложение 58568

Большое спасибо за ответ )
 
  • Нравится
Реакции: f22
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!