The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Как правильно парсить имена файлов с концом строки в середине?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Языки программирования)
Изначальное сообщение [ Отслеживать ]

"Как правильно парсить имена файлов с концом строки в середине?"  +/
Сообщение от AV (??) on 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')

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Как правильно парсить имена файлов с концом строки в середине?"  +/
Сообщение от pavlinux (ok) on 04-Янв-15, 01:37 
> Как обычно работают с такими именами? Никак

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Как правильно парсить имена файлов с концом строки в середине?"  +/
Сообщение от pavlinux (ok) on 04-Янв-15, 06:12 
Ах да, и покури на тему: что такое $IFS
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру