Я решил реализовать свою собственную версию mkgmtime, и это было легче, чем я думал.
const int SecondsPerMinute = 60;
const int SecondsPerHour = 3600;
const int SecondsPerDay = 86400;
const int DaysOfMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool IsLeapYear(short year)
{
if (year % 4 != 0) return false;
if (year % 100 != 0) return true;
return (year % 400) == 0;
}
time_t mkgmtime(short year, short month, short day, short hour, short minute, short second)
{
time_t secs = 0;
for (short y = 1970; y < year; ++y)
secs += (IsLeapYear(y)? 366: 365) * SecondsPerDay;
for (short m = 1; m < month; ++m) {
secs += DaysOfMonth[m - 1] * SecondsPerDay;
if (m == 2 && IsLeapYear(year)) secs += SecondsPerDay;
}
secs += (day - 1) * SecondsPerDay;
secs += hour * SecondsPerHour;
secs += minute * SecondsPerMinute;
secs += second;
return secs;
}
Моя основная проблема заключалась в том, что mkgmtime
должен соответствовать gmtime
. Таким образом, gmtime(mktime(t))
возвращает исходные входные значения. Поэтому я сравнил результаты для всех кратных 61 между 0 и MAX_INT для time_t, и они действительно равны (по крайней мере, в моей системе). Поэтому указанная выше процедура правильная.
Этот результат также означает, что библиотека C не учитывает секунды прыжка, что само по себе плохо, но полезно для моей цели. Обе функции будут оставаться неизменными в течение длительного времени. Чтобы быть абсолютно уверенным, мой класс Timestamp, который использует эту функцию, всегда выполняет быструю проверку запуска программы и доказывает согласованность для пары значимых значений.
Это потому, что имя_файла
и имя_папки
выбрасываются при каждой итерации цикла. Метод .replace ()
возвращает строку, но вы нигде не сохраняете результат.
Вы должны использовать:
filename = line[2]
foldername = line[5]
for letter in bad_characters:
filename = filename.replace(letter, "_")
foldername = foldername.replace(letter, "_")
Но я бы сделал это с помощью регулярного выражения. Он чище и (вероятно) быстрее:
p = re.compile('[/:()<>|?*]|(\\\)')
filename = p.sub('_', line[2])
folder = p.sub('_', line[5])
Вы переназначаете переменные filename
и Foldername
на каждой итерации цикла. Фактически заменяется только *
.
Вы начинаете заново с базовой линии вместо сохранения замененного результата, таким образом, вы получаете эквивалент
filename = line[2].replace('*', '_')
foldername = line[5].replace('*', '_')
Попробуйте следующее
bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
filename = line[2]
foldername = line[5]
for letter in bad_characters:
filename = filename.replace(letter, "_")
foldername = foldername.replace(letter, "_")
Вам следует посмотреть на метод строки Python translate ()
http: //docs.python.org/library/string.html#string.translate
с участием
http://docs.python.org/library/string.html#string.maketrans
import string
toreplace=''.join(["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"])
underscore=''.join( ['_'] * len(toreplace))
transtable = string.maketrans(toreplace,underscore)
filename = filename.translate(transtable)
foldername = foldername.translate(transtable)
Можно упростить, сделав замену чем-то вроде '/ \:' и т. Д., Я просто использовал то, что было указано выше