Вставляем нули перед цифрами, Python
Задача: написать функцию которая переводит целое число в строку определённого размера, содержащую это целое число и нули.
То есть:
5 >> 00005
123 >> 00123
?нструменты: Python, модули os, sys
UPD: Пост, конечно, смешной, потому как всё что я здесь расписываю в Питоне решается на раз без написания всяких функций. Смотри коменты. Продолжать читать имеет смысл только если хочется узнать зачем же нам решать такую задачу 🙂 Ещё можно добавить в коменты свой вариант решения, не только на питоне 🙂
Сразу скажу что я абсолютно уверен что эта задача решается в питоне какой ни будь встроенной функцией, и буду благодарен, если кто ни будь мне на неё укажет. Мне же, к сожалению, ничего раскопать не удалось. Ещё больше я уверен в том что это делает и какой-нибудь awk в одну строчку, но мне нужна была питоновская функция.
Для чего это нужно? Сделано это было для чтения модельных файлов, у которых имена определяются именно таким образом, но потом оказалось полезным и для создания gif файлов из ps при помощи convert (чтоб сортировало по порядку). Хотя ещё позже обнаружилось что gif файлы прекрасно создаются и без этого :))). Оба примера я приведу. Также приведу оригинальную функцию для MATLAB, которая делает то же самое.
Объяснений много не будет, потому что объяснять там особо нечего )
Сам скрипт:
""" Convert integer to string with leading zeros
Usage:
myint2str(x, n)
Keyword arguments:
x - integer
n - number of locations
Function padds integer x with zeros to n locations
"""
zzeros = '0'
input_string = str(x)
string_len = len(input_string)
for zz in range(1,n-string_len,1):
zzeros = zzeros + '0'
rres = zzeros+str(x)
return rres
Чтоб лишний раз не травмировать моск комрада lorien вставил докстринг (да будут преданы анафеме те кто этого не делает, на самом деле) и постарался оформить код поприличней, при этом уверен что опять где нить напортачил и от канона PEP 8 отступил 🙂
Функция принимает в качестве аргументов целое число, которое мы будем конвертить и количество позиций в создаваемой нами строке. Всё просто до безобразия.
Пример раз:
In [1]: from myint2str import *
In [2]: myint2str(333, 10)
Out[2]: ‘0000000333’
Пример двас:
In [4]: myint2str(333, 5)
Out[4]: ‘00333’
Как это дело использовать.
Если какая то программа создаёт выходные файлы, дописывая к каждому из них номер по порядку, то это вызывает известные трудности с алфавитно-числовой сортировкой. Например, решив перевести многостраничный ps файл в png
вы получите примерно такую неприятную картину:
HEFF_0-70560-0.png
HEFF_0-70560-1.png
HEFF_0-70560-10.png
HEFF_0-70560-100.png
HEFF_0-70560-101.png
HEFF_0-70560-102.png
HEFF_0-70560-103.png
HEFF_0-70560-104.png
HEFF_0-70560-105.png
HEFF_0-70560-106.png
HEFF_0-70560-107.png
HEFF_0-70560-108.png
HEFF_0-70560-109.png
HEFF_0-70560-11.png
Просмотрщик рисунков, например, в человеческом порядке смотреть это откажется, потому что по его правилам сортировки после 1 идёт 10, а потом 100. Тот же convert, если вам захочется создать gif анимацию, после 109-го рисунка впихнёт 11-й и ничего вы с ним не сделаете (кто знает как сделать, скажите как! 🙂 ).
Чтобы обойти это безобразие был написан следующий скрипт:
import os, sys
try:
input_file = sys.argv[1]; number_of_frames = sys.argv[2]
except:
print "Usage:",sys.argv[0], "infile number_of_frames"
sys.exit(1)
os.system("convert -density 70 -crop 540x610+30+55! "
+input_file+" "+input_file[:-3]+".png")
for i in range(int(number_of_frames)):
os.system("mv "+input_file[:-3]+"-"+str(i)+".png "
+input_file[:-3]+"-"+myint2str(i,5)+".png")
На входе задаётся имя файла и количество страниц в вашем .ps файле.
Конвертируем .ps, при помощи convert, при этом вырезая только то что нам надо:
+input_file+" "+input_file[:-3]+".png")
input_file[:-3] — это имя входного файла без расширения .ps
Далее мы запускаем цикл в котором поочерёдно все созданные нами .png файлы переименовываем из вида input_file[:-3]-111.png в вид input_file[:-3]-00111.png. Теперь они у нас расположатся в приятном глазу порядке:
HEFF_0-70560-00000.png
HEFF_0-70560-00001.png
HEFF_0-70560-00002.png
HEFF_0-70560-00003.png
HEFF_0-70560-00004.png
HEFF_0-70560-00005.png
HEFF_0-70560-00006.png
HEFF_0-70560-00007.png
HEFF_0-70560-00008.png
HEFF_0-70560-00009.png
HEFF_0-70560-00010.png
HEFF_0-70560-00011.png
и если сделать:
то в анимации всё будет по порядку (ну и задержка между фреймами из за delay будет 30 миллисекунд).
Продвинутые создатели gif анимаций, конечно, такими извратами не пользуются и просто пишут:
Но, если вы решите остановиться на уровне .png, то данный скрипт может пригодиться 🙂
В заключении матлабовская версия функции, написанная Dimitris Menemenlis из JPL для матлабовкого пакета обработки данных
%MYIN2STR(X,N) convert integer to string with leading zeros
% padds integer X with zeros to N locations
if nargin < 2, n=2; end
if nargin < 1, help myint2str, return, end
s=int2str(x);
n=n-length(s);
for i=1:n
s=['0' s];
end
нормальные герой всегда идут в обход :), понимаю….
использовать старое доброе форматирование
«%08d» % 5
из С-printf уже не спортивно :)… а еще можно
«%+08d» % -5
Чорт :((( опозорилсо ))
Ну пусть живёт в назидание потомкам )))
Ещё так можно:
>>> str(333).rjust(10, ‘0’)
‘0000000333’
Блин, где вы раньше были )))
Спасибо, огромное!
Предлагаю устроить конкурс — кто больше вариантов сделает, и не только на питоне )
Я попытался решить, но голяк…не понял прикола совсем..(
2export
А чего тут не понятного то ?
А еще, если строку надо повторить несколько раз, можно ее просто умножить:
>>> ‘0’*10
‘0000000000’
вместо
for zz in range(1,n-string_len,1):
zzeros = zzeros ‘0’
Метод zfill, распознаёт минусы
>>> ’12’.zfill(5)
>>> ‘00012’
>>’-120′.zfill(5)
>> ‘-0120’
2Caujka
? то правда )
Народ, подскажите, а какой вариант лучше юзать? с форматированием аля С или функции-члены класса?
Что значит «лучше»? ) Лучше для кого? Для Санта-Клауса? Ему, мне кажется, без разницы, что вы будете использовать 🙂
Что тут не понятного? Какие-то функции,классы итд — устарелые, какие-то с граблями или не портируемыю.
«Устарелых» функций среди перечисленных я не заметил. Про портируемость я не в курсе — я только с CPython 2.4(2.5) обычно работаю. А грабли найти в любой функции и языке при желании можно, хотя в PHP их, конечно, на порядок больше 😉
По поводу портируемости — это вроде самые что ни на есть стандартные функции. будут везде и всегда )
По поводу скорости не скажу, но на мой взгляд ни в первом ни во втором случае особо ничего не тратится ))
esli variantu to togda mojno i vot etot
def nuller(vl, nuls):
return (nuls — len(str(vl)))*’0′ str(vl)
Like!! I blog quite often and I genuinely thank you for your information. The article has truly peaked my interest.
Generic Viagra Fast Delivery cialis online canada Cialis 10mg Forum cialis online ordering Amoxicillin Prescribing Information For Uti’S
Here are some links to web sites that we link to simply because we think they’re really worth visiting.
Here is a superb Blog You may Find Fascinating that we encourage you to visit.
The time to read or go to the material or websites we’ve linked to beneath.
We like to honor numerous other world-wide-web web pages around the net, even when they aren
If some one wants to be updated with most up-to-date technologies then he must be pay a visit this web site and be up to date everyday.|
Info
[…]scatman[…]