Найти - Пользователи
Полная версия: Создание большого (очень) количества папок
Начало » Python для новичков » Создание большого (очень) количества папок
1
Moder5ly
Недавно появилась такая задача: нужно, используя цикл, сделать много папок. Проблема в том, что папка при первом прохождении цикла создается, при остальных - нет. Ошибки никакой не выбивает, программа работает, но свою работу не делает. Как исправить эту проблему?
Код прилагаю.
 import hashlib
import os
i = 0.060000000000000000000000000000
end = 0.0666666666666666666666666666667
while i <= end:
    formatted = str(format(i, ".30f"))
    string = hashlib.sha224(formatted).hexdigest()
    if(os.path.exists("56/" + str(string)) == False):
        os.mkdir('56/' + str(string))
    i = i + 0.000000000000000000000000000001
print "OK"
Значения i, end менять пробовал, но проблема не решилась.
PEHDOM
слишком много нулей после точки, более детально смотреть тут https://docs.python.org/3/tutorial/floatingpoint.html и тут https://docs.python.org/3/library/sys.html
пример:
 import sys
print(0.5+sys.float_info.epsilon)
>>>
0.5000000000000002
если вкратце то работа с любыми числами с плавающей запятой выполняется с погрешностями.
Машинный эпсилон - это минимальная разница между числами, которую компьютер в состоянии различить.
Это конечно не совсем так, числа меньше FLT_EPSILON вполне представимы в float и вы вполне можете с ними работать. Но плотность чисел представимых в float не постоянна. Расстояние между 2 такими соседними числами может быть меньше FLT_EPSILON. А у вас инкремент порядка 10**-30, вот пайтон и ложит болт на ваш инкремент. И цикл у вас создает постоянно одну и туже папку.
Так что вам нужно менять алгоритм вашей программы.
например использовать decimal както так:
 import hashlib
import os
from decimal import Decimal, getcontext
getcontext().prec = 29
i = Decimal(0.060000000000000000000000000000).quantize(Decimal('0.000'))
end = Decimal(0.0666666666666666666666666666667)
while i <= end:
    formatted = str(format(i, ".30f"))
    string = hashlib.sha224(formatted.encode('UTF-8')).hexdigest()
    print(i, formatted, string)
    #if(os.path.exists("56/" + str(string)) == False):
        #os.mkdir('56/' + str(string))
    i = i + Decimal(0.000000000000000000000000000001)
print ("OK")
>>>
0.060 0.060000000000000000000000000000 8fa7b78dbccdcc900620e4453060774facd36bd0a446f1f91176d9dd
0.060000000000000000000000000001 0.060000000000000000000000000001 4e4065c98754420c8f49e4dbbb542790bcf25cbd8b391b8bafd61e39
0.060000000000000000000000000002 0.060000000000000000000000000002 a3119e54b99f91eb8151eefd5f69bc68339e0ca47f609c16e633c0d9
.....
подробнее https://docs.python.org/3/library/decimal.html
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB