Фактически shutil.make_archive
может создавать однофайльный архив! Просто перейдите к целевому каталогу как root_dir
и укажите имя файла как base_dir
.
Попробуйте следующее:
import shutil
file_to_zip = 'test.txt' # file to zip
target_path = 'C:\\test_yard\\' # dir, where file is
try:
shutil.make_archive('archive', 'zip', target_path, file_to_zip)
except OSError:
pass
Или укоротить ответ Давида:
if 4 <= day <= 20 or 24 <= day <= 30:
suffix = "th"
else:
suffix = ["st", "nd", "rd"][day % 10 - 1]
Вот более общее решение:
def ordinal(n):
if 10 <= n % 100 < 20:
return str(n) + 'th'
else:
return str(n) + {1 : 'st', 2 : 'nd', 3 : 'rd'}.get(n % 10, "th")
За исключением 1-го, 2-го и 3-го, я думаю, что они все просто добавляют ... 4-е, 5-е, 6-е , 11, 21 ... ой, ой; -)
Я думаю, это может сработать:
def ordinal(num):
ldig = num % 10
l2dig = (num // 10) % 10
if l2dig == 1:
suffix = 'th'
elif ldig == 1:
suffix = 'st'
elif ldig == 2:
suffix = 'nd'
elif ldig == 3:
suffix = 'rd'
else:
suffix = 'th'
return '%d%s' % (num, suffix)
Здесь словари используются либо как функция, либо как лямбда ...
Если вы посмотрите на словари в обратном направлении, вы можете прочитать это как. ..
Все заканчивается на "th"
... если оно не заканчивается на 1, 2 или 3, тогда оно заканчивается на "st", "nd" или "rd"
... если только он заканчивается на 11, 12 или 13, затем на «th», «th» или «th»
# as a function
def ordinal(num):
return '%d%s' % (num, { 11: 'th', 12: 'th', 13: 'th' }.get(num % 100, { 1: 'st',2: 'nd',3: 'rd',}.get(num % 10, 'th')))
# as a lambda
ordinal = lambda num : '%d%s' % (num, { 11: 'th', 12: 'th', 13: 'th' }.get(num % 100, { 1: 'st',2: 'nd',3: 'rd',}.get(num % 10, 'th')))
Вот еще более короткое общее решение:
def foo(n):
return str(n) + {1: 'st', 2: 'nd', 3: 'rd'}.get(4 if 10 <= n % 100 < 20 else n % 10, "th")
Хотя другие решения, приведенные выше, вероятно, легче понять с первого взгляда, это работает так же хорошо, когда используется немного меньше кода.