Python string.replace () не заменяет символы

Я решил реализовать свою собственную версию 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, который использует эту функцию, всегда выполняет быструю проверку запуска программы и доказывает согласованность для пары значимых значений.

13
задан ZeroUptime 19 August 2010 в 14:57
поделиться

4 ответа

Это потому, что имя_файла и имя_папки выбрасываются при каждой итерации цикла. Метод .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])
25
ответ дан 1 December 2019 в 19:01
поделиться

Вы переназначаете переменные filename и Foldername на каждой итерации цикла. Фактически заменяется только * .

6
ответ дан 1 December 2019 в 19:01
поделиться

Вы начинаете заново с базовой линии вместо сохранения замененного результата, таким образом, вы получаете эквивалент

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, "_")
3
ответ дан 1 December 2019 в 19:01
поделиться

Вам следует посмотреть на метод строки 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)

Можно упростить, сделав замену чем-то вроде '/ \:' и т. Д., Я просто использовал то, что было указано выше

4
ответ дан 1 December 2019 в 19:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: