Как получить доступ к файлам в подпапке независимо от системы?

Я хотел бы собрать все пути к файлам .mp3 в папке (MP3) и назначить их ключам в словаре, поэтому моя программа работает независимо от системного пути к файлу (в настоящее время пути к файлам жестко запрограммированы, что означает, что программа работает только сама по себе ПК).

Вот исходная установка:

      NotePaths = {
"C" : "C:/.../MP3/C4.mp3",
"D" : "C:/.../MP3/D4.mp3",
"E" : "C:.../MP3/E4.mp3",
"F" : "C:/.../MP3/F4.mp3",
"G" : "C:/.../MP3/G4.mp3",
"A" : "C:/.../MP3/A4.mp3",
"H" : "C:/.../MP3/H4.mp3"
}

Вот что я пытался сделать, чтобы программа работала независимо от структуры системных папок, если в той же папке, где расположена программа, есть папка с именем MP3 (которая включает необходимые файлы .mp3):

      NotePaths = {
"C" : "",
"D" : "",
"E" : "",
"F" : "",
"G" : "",
"A" : "",
"H" : ""
}

for root, dirs, files in os.walk("/MP3"):
    for file in files:
        if file.endswith(".mp3") and file.startswith("C"):
            NotePaths["C"].append(Str("(os.path.join(root, file))"))

        if file.endswith(".mp3") and file.startswith("D"):
            NotePaths["D"].append(Str("(os.path.join(root, file))"))

        if file.endswith(".mp3") and file.startswith("E"):
            NotePaths["E"].append(Str("(os.path.join(root, file))"))

        if file.endswith(".mp3") and file.startswith("F"):
            NotePaths["F"].append(Str("(os.path.join(root, file))"))

        if file.endswith(".mp3") and file.startswith("G"):
            NotePaths["G"].append(Str("(os.path.join(root, file))"))

        if file.endswith(".mp3") and file.startswith("A"):
            NotePaths["A"].append(Str("(os.path.join(root, file))"))

        if file.endswith(".mp3") and file.startswith("H"):
            NotePaths["H"].append(Str("(os.path.join(root, file))"))

Попытка запустить программу (которая включает команду playsound для воспроизведения вышеупомянутых файлов .mp3) открывает модуль playsound и вызывает следующую ошибку:

      Traceback (most recent call last):
  File "C:\...\Musical Quiz.py", line 67, in <module>
    playsound(currentPath)
  File "C:\...\AppData\Local\Programs\Python\Python38\lib\site-packages\playsound.py", line 35, in _playsoundWin
    winCommand('open "' + sound + '" alias', alias)
  File "C:\...\AppData\Local\Programs\Python\Python38\lib\site-packages\playsound.py", line 30, in winCommand
    '\n    ' + errorBuffer.value.decode())
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position 60: invalid continuation byte

Пути к файлам передаются в функцию playsound следующим образом:

      currentKey, currentPath = random.choice(list(NotePaths.items()))
playsound(currentPath)

Обновление :

Я реорганизовал свой код в соответствии с этим ответом (спасибо!). Я попытался найти настоящую проблему, как описано здесь, изменив модуль playsound (как описано здесь ) со следующим результатом:

      Traceback (most recent call last):
  File "C:\Users\...\Musical Quiz.py", line 67, in <module>
    playsound(currentPath)
  File "C:\Users\...\AppData\Local\Programs\Python\Python38\lib\site-packages\playsound.py", line 35, in _playsoundWin
    winCommand('open "' + sound + '" alias', alias)
  File "C:\Users\...\AppData\Local\Programs\Python\Python38\lib\site-packages\playsound.py", line 31, in winCommand
    raise PlaysoundException(exceptionMessage)
playsound.PlaysoundException: 
    Error 292 for command:
        open "" alias playsound_0.8907395801041198
    Der Befehl erfordert einen Alias-, Datei-, Treiber- oder Gertenamen.
    
##Attempted translation: the command requires an alias, file name, driver name or (I don't know what the last thing is)          

Так что, похоже, а) мой код никогда не работал с самого начала и не мог получить правильные пути к файлам или б) проигрышному звуку не нравится то, что я делаю.

1 ответ

Вы проверили этот ответ? Почему у меня кодек «utf-8» не может декодировать байт 0xc4 в позиции 0: проблема с недопустимым байтом продолжения и как ее решить?

В нем дается обзор того, как устранить такую ​​ошибку, поскольку это своего рода ошибка высокого уровня, а фактическая ошибка может быть связана с не найденным файлом или ошибкой управления версиями Python.

#######

Также, если я могу сделать некоторый рефакторинг вашего кода:

      NotePaths = {
    "C" : "","D" : "","E" : "","F" : "","G" : "","A" : "","H" : ""
}

def file_startswith_key(file):
    """ Checking if file ends with wanted keys """
    for key in NotePaths:
        if file.startswith(key)
        return key, True
    return None, False

for root, dirs, files in os.walk("/MP3"):
    for file in files:
        key, bool_value = file_startswith_key(file)
        if file.endswith(".mp3") and bool_value:
            NotePaths[key].append(Str("(os.path.join(root, file))"))

Это позволит вам добавить столько ключей, сколько вы хотите, без добавления новых «if операторов».

Другие вопросы по тегам