Тупой случай под Linux - в середине имени файла вставлен "разрыв строки", тот самый '\n', который при разные утилиты парсят по разному. Попытка напечатать его своим кодом красиво печатает две части на разных строках. :)Дальше надо работать с этим именем. А как обычно такую "ересь" обрабатывают? Утилита 'md5sum' вместо разрыва строки пишет \n. Видимо, надо мимикрировать под это поведение... Может - нет.
Например, wget умеет вставлять в имена файлов "весёлые" буквы, сохраняя веб страницы. Как-то с ними работают...
Как обычно работают с такими именами? Никак :), видимо, т.к. пока нет нужды печатать их, до тех пор это объект строка как есть и весёлые буквы внутри никого не трогают.
Как воспроизвести:Берём Midnight Commander (у меня 4.8.11-1, из Убунту репо), выбираем файл, жмём Shift+F6, в середине имени вписываем \n и жмём энтер. Поиском средствами Питона находим это имя и печатаем - см. код ниже:
#!/usr/bin/pythonimport os
import sys
escape_dict={'\a':r'\a', '\b':r'\b', '\c':r'\c', '\f':r'\f',
'\n':r'\n', '\r':r'\r', '\t':r'\t', '\v':r'\v',
'\'':r'\'', '\"':r'\"', '\0':r'\0', '\1':r'\1',
'\2':r'\2', '\3':r'\3', '\4':r'\4', '\5':r'\5',
'\6':r'\6', '\7':r'\7', '\8':r'\8', '\9':r'\9'}def raw(text):
"""
Returns a raw string representation of text
http://code.activestate.com/recipes/65211-convert-a-string-i.../
"""
new_string=''
for char in text:
try: new_string+=escape_dict[char]
except KeyError: new_string+=char
return new_stringdef findFiles(topDir):
namesList = []
for root, subDirs, files in os.walk(topDir, followlinks=False):
for file in files:
namesList.append(os.path.join(file))
return namesList
if __name__ == "__main__":
namesList = findFiles(".")
for name in namesList:
sys.stdout.write("Text:\t\t" + raw(name) + '\n')
sys.stdout.write("Just string:\t" + name + '\n')
sys.stdout.write('\n')
> Как обычно работают с такими именами? НикакВо, для тебя опус: http://www.dwheeler.com/essays/fixing-unix-linux-filenames.html
Ах да, и покури на тему: что такое $IFS