URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9961
[ Назад ]

Исходное сообщение
"Как правильно парсить имена файлов с концом строки в середине?"

Отправлено AV , 02-Янв-15 17:06 
Тупой случай под Linux - в середине имени файла вставлен "разрыв строки", тот самый '\n', который при разные утилиты парсят по разному. Попытка напечатать его своим кодом красиво печатает две части на разных строках. :)

Дальше надо работать с этим именем. А как обычно такую "ересь" обрабатывают? Утилита 'md5sum' вместо разрыва строки пишет \n. Видимо, надо мимикрировать под это поведение... Может - нет.

Например, wget умеет вставлять в имена файлов "весёлые" буквы, сохраняя веб страницы. Как-то с ними работают...

Как обычно работают с такими именами? Никак :), видимо, т.к. пока нет нужды печатать их, до тех пор это объект строка как есть и весёлые буквы внутри никого не трогают.


Как воспроизвести:

Берём Midnight Commander (у меня 4.8.11-1, из Убунту репо), выбираем файл, жмём Shift+F6, в середине имени вписываем \n и жмём энтер. Поиском средствами Питона находим это имя и печатаем - см. код ниже:



#!/usr/bin/python

import 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_string

def 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')


Содержание

Сообщения в этом обсуждении
"Как правильно парсить имена файлов с концом строки в середине?"
Отправлено pavlinux , 04-Янв-15 01:37 
> Как обычно работают с такими именами? Никак

Во, для тебя опус: http://www.dwheeler.com/essays/fixing-unix-linux-filenames.html


"Как правильно парсить имена файлов с концом строки в середине?"
Отправлено pavlinux , 04-Янв-15 06:12 
Ах да, и покури на тему: что такое $IFS