Сокращение пути для приложения GUI

Мне нужно отобразить путь в приложении GUI. Отображение всего пути будет излишним, поэтому я создал собственный сокращенный путь.

def cut_path(path):
    ''' This function takes a path and outputs the path cut with the ... after the 
     the first folder after the first character and completes the name with the filename or the last folder
    Example: 
    C:/Users/Mauro/Desktop/DenoiseAvg/DenoiseAverage/test_cut_path.py
    C:/Users/.../test_cut_path.py
     '''      
    endidx = 5
    char = path[endidx]    
    while char != '/' and endidx < len(path):
        endidx += 1
        char = path[endidx]

    inpath = path[:endidx + 1 ]

    rpath = path[::-1]    
    idx = 1   
    char = rpath[idx]    
    while char != "/" and idx < len(rpath):
        idx += 1
        char = rpath[idx]

    endpath = path[len(path) - idx - 1 : ]

    outpath = inpath + "..." + endpath
    return outpath

Pastebin для подсветки синтаксиса

Есть ли более короткий, более читаемый, питонический способ сделать это? Есть ли способ ограничить, сколько символов путь будет длинным? Как вы это сделаете?

10 голосов | спросил Pella86 14 J000000Friday17 2017, 08:08:57

3 ответа


19

Python - это «батареи включены» , это означает, что выгружаете код в основная библиотека - это хорошо, и часто это возможно. В этом случае, если вы используете Python 3.4+, вы можете использовать pathlib . Все, что вам нужно, это знать pathlib.PurePath и PurePath.parts .

И вы можете изменить свой код на:

import pathlib

def cut_path(path):
    parts = list(pathlib.PurePath(path).parts)
    if len(parts) >= 4:
        parts [2:-1] = ['...']
    return pathlib.PurePath(*parts)

Однако, поскольку вы делаете это в том, как долго путь, вы можете динамически построить новый путь. И поэтому можно использовать что-то вроде:

def cut_path(path, max_size=5):
    if not path:
        return path

    parts = list(pathlib.PurePath(path).parts)

    path = pathlib.PurePath(parts[0])
    for part in parts[1:-1]:
        path /= part
        if len(str(path)) >= max_size:
            path /= '...'
            break
    if len(parts) > 1:
        path /= parts[-1]
    return path

Если вы используете Python 2 или Python <3.4, то вы не можете использовать новый новый интерфейс и использовать старый интерфейс os.path . Который не поддерживает разделение и соединение путей очень хорошо. Сначала вы можете использовать os.path.normcase , чтобы нормализовать путь. Который может уничтожить путь, если у вас есть путь Posix в Windows. После этого вы хотите взять диск с ---- +: = 7 =: + ---- , а затем разделите остальные части с помощью os.path.splitdrive. Затем вы хотите сделать то же самое, что и выше, и заменить среднюю часть пути и, наконец, os.sep все вместе.

Который может оставить вас с чем-то вроде:

os.path.join
ответил Peilonrayz 14 J000000Friday17 2017, 11:36:47
5

Вместо hardcoding a / было бы более оперативно использовать os.path.sep для разделителя.

ответил Nicole Stevens 14 J000000Friday17 2017, 19:38:55
3

Нет, я не думаю, что это идиоматический питон (хотя я не идеальный человек, чтобы ответить на вопрос).

Я думаю, что более идиоматично разделить строку (на массив). Затем используйте части массива для построения результата.

В ваших коротких дорожках также есть ошибка:

cut_path("c:/a/a.y") 

Вот как я это сделаю

def cut_path2(path):
    segments = path.split('/')
    siz = 0
    pat = 0
    output = ""

    # Your code assumes the prefix must be at least 
    # 5 characters long I record this in siz
    while (siz < 5) and (pat < len(segments)):
        output += segments[pat]
        output += "/"
        siz += len(segments[pat]) + 1
        pat += 1

    # You don't want to shorten if the
    # the first loop prints the whole path.
    if pat < (len(segments)):
        output += ".../"
    if pat <= (len(segments)):
        output += segments[len(segments) - 1]    
    return output

Он протестировал это с помощью тестируемого устройства, но я могу гарантировать, что он будет работать для всех путей.

ответил Martin York 14 J000000Friday17 2017, 08:41:51

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132