1

Есть код:

def go(cur):
    for dr in listdir(cur):
        if(isdir(cur.join(dr))):
            go(cur.join(dr))
        elif(dr[-4:] == 'flac'):
            query = 'cuebreakpoints {}.cue | shnsplit -o flac {}.flac'.format(dr[-5:], dr[-5:])
            os.system(query)

x = os.getcwd()
go(x)

Мне нужно осуществить рекурсивный обход подпапок и разрезать каждый .flac файл.

Проблема в том, что в названиях папок могут содержаться русские символы. Как вы поняли, код не работает (не происходит никаких изменений). Код не работает из-за плохой локализации или проблема в чем-то еще?

P.S. Как вывести строку, переведя ее в UTF-8 перед этим?

jfs
  • 52,361
Jyree
  • 308

2 Answers2

3

У вас алгоритм неправильный, попробуйте это:

import os

def go(cur): print('go ' + cur)

for dr in os.listdir(cur):
    abs_path = os.path.join(cur, dr)
    print('  go abs_path ' + abs_path)

    if os.path.isdir(abs_path):
        print('dir')
        go(abs_path)
    elif 'flac' in dr[-4:]:
        print('cmd file')
        # query = 'cuebreakpoints {}.cue | shnsplit -o flac {}.flac'.format(dr[-5:], dr[-5:])
        # os.system(query)

go(r'D:\Users')

gil9red
  • 77,085
  • Да, действительно, вчера поздно ночью заметил, что использую не тот join. Видимо, стоит писать почаще) – Jyree Feb 18 '16 at 11:10
  • 1
    Если еще os.walk или glob для обхода папок и получения списка файлов ) – gil9red Feb 18 '16 at 11:15
1

На Питоне 3, у вас в коде имена файлов уже как Unicode представлены—не только русские буквы, но ещё миллион других символов можно использовать. Подробнее Как работать с путями c русскими символами?

Чтобы выполнить внешнюю команду для каждого flac-файла в текущем дереве директорий:

#!/usr/bin/env python3
import pathlib
import shlex
import subprocess
import sys

for path in pathlib.Path().glob("**/*.flac"):
    paths = [shlex.quote(str(p)) for p in (path.with_suffix('.cue'), path)]
    command = "cuebreakpoints {} | shnsplit -o flac {}".format(*paths)
    process = subprocess.run(command, shell=True)
    if process.returncode != 0:
        print('warning: failed to split {path}, '
              '`{command}` returned {process.returncode}'.format(**vars()),
              file=sys.stderr)

shlex.quote() используется, чтобы экранировать специальные в shell символы такие как пробел в именах файлов. Если команда завершается с ненулевым статусом (ошибка), то выводится предупреждение.

jfs
  • 52,361