Как избежать специального символа

Я получил следующий код для обработки проблемы китайских символов или какой-то специальный символ в файле powerpoint, потому что я хотел бы использовать содержимое ppt в качестве имени файла для сохранения. Если он содержит какой-то специальный символ, он выдаст какое-то исключение, поэтому я использую следующий код для его обработки.

Он отлично работает под Python 2.7, но при запуске с Python 3.0 выдает следующую ошибку:

    if not (char in '<>:"/\|?*'):
TypeError: 'in <string>' requires string as left operand, not int

Я погуглил сообщение об ошибке, но не понимаю, как его устранить. Я знаю код if not (char in '<>:"/\|?*'): это преобразовать символ в кодовый номер ASCII, верно?

Есть ли пример, чтобы исправить мою проблему в Python 3?

def rm_invalid_char(self,str):

    final=""
    dosnames=['CON', 'PRN', 'AUX', 'NUL', 'COM1', 'COM2', 'COM3', 'COM4', 'COM5', 'COM6', 'COM7', 'COM8', 'COM9', 'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5', 'LPT6', 'LPT7', 'LPT8', 'LPT9']
    for char in str:
        if not (char in '<>:"/\|?*'):
            if ord(char)>31:
                final+=char
        if final in dosnames:
            #oh dear...
            raise SystemError('final string is a DOS name!')
        elif final.replace('.', '')=='':
            print ('final string is all periods!')
            pass
    return final

3 ответа

Решение

Вы передаете итерируемое, первым элементом которого является целое число (232) rm_invalid_char(), Проблема не в этой функции, а в вызывающей.

Некоторая отладка в порядке: в самом начале rm_invalid_char(), ты должен сделать print(repr(str)): вы не увидите строку, вопреки ожиданиям rm_invalid_char(), Вы должны исправить это, пока не увидите ожидаемую строку, изменив код перед rm_invalid_char() называется.

Вероятно, проблема связана с тем, как Python 2 и Python 3 обрабатывают строки (в Python 2 str объекты являются строками байтов, в то время как в Python 3 они являются строками символов).

Просто: используйте это

re.escape(YourStringHere)

Из документов:

Возвращает строку со всеми не алфавитно-цифровыми символами с обратной косой чертой; это полезно, если вы хотите сопоставить произвольную литеральную строку, в которой могут быть метасимволы регулярного выражения.

Мне любопытно, почему в "str" ​​есть нечто, действующее как целое число - что-то странное происходит с вводом.

Тем не менее, я подозреваю, если вы:

  • Измените имя вашего str значение для чего-то другого, например char_string
  • Сразу после for char in char_string Приведите все, что вы вводите в строку

тогда описанная вами проблема будет решена.

Вы можете также рассмотреть возможность добавления случайного бита в конец вашего сгенерированного имени файла, чтобы вам не пришлось беспокоиться о столкновении с зарезервированными именами DOS.

Другие вопросы по тегам