Форум сайта python.su
103
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")
Офлайн
857
terabaytГлобальные переменные тоже проще использовать… до поры до времени :)
но так же проще
terabaytНу да, и это вводит связывание по формату - функция требует передачи именно даты/времени. А надо параметры функции максимально упрощать: если есть условие, что они должны быть датой, то надо упростить их до простого текста. Тогда функции становятся совместимыми.
но я бы использовал datetime
Отредактировано py.user.next (Апрель 23, 2015 10:59:55)
Офлайн
103
py.user.nextну Вы и сравнили…
Глобальные переменные тоже проще использовать
py.user.nextя Вас понял и со многим согласен
Ну да, и это вводит связывание по формату - функция требует передачи именно даты/времени. А надо параметры функции максимально упрощать: если есть условие, что они должны быть датой, то надо упростить их до простого текста. Тогда функции становятся совместимыми.
Отредактировано terabayt (Апрель 23, 2015 11:21:36)
Офлайн
0
py.user.nextЧто-то я не нашла как там сделать, чтоб было только 2 аргумента произвольные пути к папкам, типа
Вот это всё надо заменить на argparse; там всё красиво, удобно и компактно.
Посмотришь примеры, он простой.
import argparse parser = argparse.ArgumentParser(description="my parser") parser.add_argument('help', nargs=1) args = parser.parse_args()
py.user.nextЕсли не будет глобальной date, то функция copy_files не будет знать с каким именем надо создавать папку для каждой совокупности фото с одинаковыми датами и куда копировать.
Глобальных переменных и ссылок на них вообще не должно быть.
Функции должны зависеть только от себя самих, иначе они будут ломаться из-за изменений в других функциях.
Офлайн
857
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Так вон terabayt привел, как это делать, если не глобально.
Если не будет глобальной date, то функция copy_files не будет знать с каким именем надо создавать папку для каждой совокупности фото с одинаковыми датами и куда копировать.
Отредактировано py.user.next (Апрель 23, 2015 12:20:43)
Офлайн
0
py.user.nextАвтоматическая она только для -h, –help, а мне надо help, без дефисов
Помощь там добавляется автоматически и заполняется она тоже автоматически. То есть её не надо вручную добавлять, она уже есть.
Офлайн
857
l1nxОно же не просто так с дефисами, дефисы отличают опции от аргументов. Если путь help будет, например, надо же его обработать, а не помощь выводить.
а мне надо help, без дефисов
Офлайн
0
Версия 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])
Офлайн
857
l1nxparser.add_argument('inputdir', nargs=1, help='need path to input dir')
l1nxparser.parse_args().inputdir[0]
parser.add_argument('inputdir', help='need path to input dir')
parser.parse_args().inputdir
l1nxstr - имя встроенной функции, нельзя имя перекрывать, потому что она может понадобиться.def date_from_filename(str):
if __name__ == '__main__': parser = argparse. ... main(...)
Отредактировано py.user.next (Май 1, 2015 02:03:16)
Офлайн
0
Теперь так
#!/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)
Офлайн