Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 23, 2015 07:46:17

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Покомментируйте код

py.user.next
которые вообще ничего из даты/времени не содержат
вот поэтому там и есть
                match_obj = re.match(r"\d{8}_\d{6}", f)
                if match_obj:
                    format_date(f)
                else:
                    # get date from exif data
                    img_info = {}
                    i = Image.open(os.path.join(root, f))
                    info = i._getexif()
                    for tag, value in info.items():
                        decoded = TAGS.get(tag, tag)
                        img_info[decoded] = value
                    format_date(img_info['DateTimeDigitized']) # 2014:11:11 19:14:02
py.user.next
Это делается канонизация и всё
да, это круто :) но так же проще
def format_date(s, r):
    return datetime.strftime(datetime.strptime(s, r), "%d.%m.%Y")
date = format_date(f, "%Y%m%d_%H%M%S")

я Вас понял и с чем-то я согласен, но я бы использовал datetime



————————————————
-*- Simple is better than complex -*-

Офлайн

#2 Апрель 23, 2015 10:55:52

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Покомментируйте код

terabayt
но так же проще
Глобальные переменные тоже проще использовать… до поры до времени :)

terabayt
но я бы использовал datetime
Ну да, и это вводит связывание по формату - функция требует передачи именно даты/времени. А надо параметры функции максимально упрощать: если есть условие, что они должны быть датой, то надо упростить их до простого текста. Тогда функции становятся совместимыми.

Принципы UNIX



Отредактировано py.user.next (Апрель 23, 2015 10:59:55)

Офлайн

#3 Апрель 23, 2015 11:09:44

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Покомментируйте код

py.user.next
Глобальные переменные тоже проще использовать
ну Вы и сравнили…
py.user.next
Ну да, и это вводит связывание по формату - функция требует передачи именно даты/времени. А надо параметры функции максимально упрощать: если есть условие, что они должны быть датой, то надо упростить их до простого текста. Тогда функции становятся совместимыми.
я Вас понял и со многим согласен



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Апрель 23, 2015 11:21:36)

Офлайн

#4 Апрель 23, 2015 11:39:03

l1nx
Зарегистрирован: 2015-04-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Покомментируйте код

py.user.next
Вот это всё надо заменить на argparse; там всё красиво, удобно и компактно.
Посмотришь примеры, он простой.
Что-то я не нашла как там сделать, чтоб было только 2 аргумента произвольные пути к папкам, типа
./script.py ~/my/dir1 ~/my/dir2
Еще такое попробовала
import argparse
parser = argparse.ArgumentParser(description="my parser")
parser.add_argument('help', nargs=1)
args = parser.parse_args()
./script.py help
ничего не выводит, странно.
py.user.next
Глобальных переменных и ссылок на них вообще не должно быть.
Функции должны зависеть только от себя самих, иначе они будут ломаться из-за изменений в других функциях.
Если не будет глобальной date, то функция copy_files не будет знать с каким именем надо создавать папку для каждой совокупности фото с одинаковыми датами и куда копировать.

Офлайн

#5 Апрель 23, 2015 12:17:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Покомментируйте код

terabayt
ну Вы и сравнили…
Не, имеется в виду, что она вот тоже заюзала глобальные переменные для путей, это же так удобно. Зачем там выдумывать локальные переменные?

l1nx
Еще такое попробовала
Помощь там добавляется автоматически и заполняется она тоже автоматически. То есть её не надо вручную добавлять, она уже есть.
Добавлять нужно только аргументы, в данном случае позиционные.

#!/usr/bin/env python
# coding: utf-8
 
import argparse
 
parser = argparse.ArgumentParser()
parser.add_argument('path1', help='path1 help info')
parser.add_argument('path2', help='path2 help info')
 
args = parser.parse_args()
print args
print args.path1, args.path2

[guest@localhost py]$ ./args.py -h
usage: args.py [-h] path1 path2

positional arguments:
path1 path1 help info
path2 path2 help info

optional arguments:
-h, --help show this help message and exit
[guest@localhost py]$

[guest@localhost py]$ ./args.py 1 2
Namespace(path1='1', path2='2')
1 2
[guest@localhost py]$

l1nx
ничего не выводит, странно.
Ну да, print ведь нет.

l1nx
Если не будет глобальной date, то функция copy_files не будет знать с каким именем надо создавать папку для каждой совокупности фото с одинаковыми датами и куда копировать.
Так вон terabayt привел, как это делать, если не глобально.



Отредактировано py.user.next (Апрель 23, 2015 12:20:43)

Офлайн

#6 Апрель 23, 2015 12:28:36

l1nx
Зарегистрирован: 2015-04-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Покомментируйте код

py.user.next
Помощь там добавляется автоматически и заполняется она тоже автоматически. То есть её не надо вручную добавлять, она уже есть.
Автоматическая она только для -h, –help, а мне надо help, без дефисов

Офлайн

#7 Апрель 23, 2015 12:43:40

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Покомментируйте код

l1nx
а мне надо help, без дефисов
Оно же не просто так с дефисами, дефисы отличают опции от аргументов. Если путь help будет, например, надо же его обработать, а не помощь выводить.



Офлайн

#8 Апрель 30, 2015 16:37:48

l1nx
Зарегистрирован: 2015-04-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Покомментируйте код

Версия 3. Argparse, убраны глобальные переменные, научилась пользоваться pep8 чекером

#!/usr/bin/env python
import argparse
import os
import re
import shutil
import sys
from PIL import Image
from PIL.ExifTags import TAGS
# ./phone_photos_to_nas.py input_dir output_dir
parser = argparse.ArgumentParser()
parser.add_argument('inputdir', nargs=1, help='need path to input dir')
parser.add_argument('outputdir', nargs=1, help='need path to output dir')
def main(inputdir, outputdir):
    if not os.path.isdir(inputdir):
        sys.exit(inputdir + " is not dir")
    if not os.path.isdir(outputdir):
        sys.exit(outputdir + " is not dir")
    for rootdir, dirs, files in os.walk(inputdir):
        for each_filename in files:
            # if filename like 20141111_191402.jpg
            if re.match(r"\d{8}_\d{6}", each_filename):
                date = date_from_filename(each_filename)
            # else get date from exif data
            else:
                info = Image.open(os.path.join(rootdir,
                                  each_filename))._getexif()
                for tag, value in info.items():
                    if TAGS.get(tag, tag) == 'DateTimeDigitized':
                        # 2014:11:11 19:14:02
                        date = date_from_filename(value)
                        break
            copy_file(rootdir, each_filename, date, outputdir)
def copy_file(rootdir, filename, date, outputdir):
        dirs = os.walk(outputdir).next()[1]
        if date not in dirs:
            os.mkdir(os.path.join(outputdir, date))
        shutil.copy2(os.path.join(rootdir, filename),
                     os.path.join(outputdir, date))
def date_from_filename(str):
    match = re.match(r'^(\d{4}):?(\d{2}):?(\d{2})', str)
    day, month, year = match.groups()[::-1]
    date = '{}.{}.{}'.format(day, month, year)
    return date  # '11.11.2014'
main(parser.parse_args().inputdir[0], parser.parse_args().outputdir[0])

Офлайн

#9 Май 1, 2015 01:51:41

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Покомментируйте код

l1nx
parser.add_argument('inputdir', nargs=1, help='need path to input dir')
l1nx
parser.parse_args().inputdir[0]

parser.add_argument('inputdir', help='need path to input dir')
parser.parse_args().inputdir
Выше написано, как делать. Нет, вставляет какой-то nargs, сама не знает, зачем.

l1nx
def date_from_filename(str):
str - имя встроенной функции, нельзя имя перекрывать, потому что она может понадобиться.

Дальше там разбор аргументов и вызов main() должны быть защищены от импорта.
if __name__ == '__main__':
    parser = argparse. ...
    main(...)



Отредактировано py.user.next (Май 1, 2015 02:03:16)

Офлайн

#10 Май 11, 2015 13:17:37

l1nx
Зарегистрирован: 2015-04-12
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Покомментируйте код

Теперь так

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
import os
import re
import shutil
import sys
from PIL import Image
from PIL.ExifTags import TAGS
# ./phone_photos_to_nas.py input_dir output_dir
def main(inputdir, outputdir):
    check_dir(inputdir)
    check_dir(outputdir)
    for rootdir, dirs, files in os.walk(inputdir):
        for each_filename in files:
            # if filename like 20141111_191402.jpg
            if re.match(r'\d{8}_\d{6}', each_filename):
                date = date_from_filename(each_filename)
            # else get date from exif data
            else:
                info = Image.open(os.path.join(rootdir,
                                  each_filename))._getexif()
                for tag, value in info.items():
                    if TAGS.get(tag, tag) == 'DateTimeDigitized':
                        # 2014:11:11 19:14:02
                        date = date_from_filename(value)
                        break
            copy_file(rootdir, each_filename, date, outputdir)
def copy_file(inputdir, filename, date, outputdir):
    src_file = os.path.join(inputdir, filename)
    dst_dir = os.path.join(outputdir, date)
    dst_file = os.path.join(dst_dir, filename)
    if not os.path.isdir(dst_dir):
        os.mkdir(dst_dir)
        log('Created directory: ' + dst_dir)
    if not os.path.isfile(dst_file):
        shutil.copy2(src_file, dst_file)
        log('Copied file: %s to %s' % (src_file, dst_file))
def date_from_filename(s):
    match = re.match(r'^(\d{4}):?(\d{2}):?(\d{2})', s)
    day, month, year = match.groups()[::-1]
    date = '{}.{}.{}'.format(day, month, year)
    return date  # '11.11.2014'
def check_dir(path_to_dir):
    if not os.path.isdir(path_to_dir):
        msg = '"%s" is not dir' % path_to_dir
        log(msg)
        print >> sys.stderr, msg
        sys.exit(1)
def log(msg):
    if args.verbose:
        print msg
# разбор аргументов и вызов main() должны быть защищены от импорта
if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--inputdir', help='need path to input dir')
    parser.add_argument('--outputdir', help='need path to output dir')
    parser.add_argument('-v', '--verbose', action='store_true', help='verbose mode')
    args = parser.parse_args()
    main(args.inputdir, args.outputdir)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version