我在访问其他文件夹中的midi文件时遇到问题

时间:2013-07-21 21:21:15

标签: python pygame os.path

  

我的代码Vincible.py位于

C:\Users\Nick\Desktop\Vincible
     

我正在尝试访问位于

中的midi文件
C:\Users\Nick\Desktop\Vincible\Audio
     

我把它放在一起:

#!C:\Python33\python.exe
import sys, pygame, os.path

print("Loading...")
pygame.mixer.pre_init(44100, -16, 2, 2048)
try:
    pygame.mixer.music.load(os.path.join('Audio', 'title.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'dun1.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'dun2.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'dun3.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'dun4.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'dun5.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'dun6.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'echostheme'))
    pygame.mixer.music.load(os.path.join('Audio', 'town1.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'town2.midi'))
    pygame.mixer.music.load(os.path.join('Audio', 'town3.midi'))
except:
    raise UserWarning("Could not load or play soundfiles in 'Audio' folder")  
pygame.init()
size = width, height = 580, 444
screen = pygame.display.set_mode(size)
print("Loaded!")

while 1:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
          sys.exit()
    pygame.mixer.Sound('title.midi').play()
     

运行它后,它会运行除外的位,我很难想象   如何成功地做到这一点。我通常不会合作   在Python中访问来自不同路径的文件,所以你的帮助非常大   非常感谢。

     

编辑:正如我所要求的那样,我从代码中删除了try / except。   这是新代码:

#!C:\Python33\python.exe
import sys, pygame, os.path

print("Loading...")
pygame.mixer.pre_init(44100, -16, 2, 2048)
pygame.init()

pygame.mixer.music.load(os.path.join('Audio', 'title.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'dun1.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'dun2.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'dun3.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'dun4.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'dun5.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'dun6.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'echostheme'))
pygame.mixer.music.load(os.path.join('Audio', 'town1.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'town2.midi'))
pygame.mixer.music.load(os.path.join('Audio', 'town3.midi'))

size = width, height = 580, 444
screen = pygame.display.set_mode(size)
print("Loaded!")

while 1:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
          sys.exit()
    pygame.mixer.Sound('title.midi').play()
     

这一次推出:

Traceback (most recent call last):
  File "C:\Users\Nick\Desktop\Vincible\Vincible.py", line 8, in <module>
    pygame.mixer.music.load(os.path.join('Audio', 'title.midi'))
pygame.error: Couldn't open 'Audio\title.midi'
     

该文件没有损坏,确实在

Vincible\Audio
     

但它仍然会返回此错误。我想它有一些东西   我使用

os.path.join
     

但是又一次,我是os.path模块的新手。任何帮助都非常多   赞赏。

正如Fredrik建议的那样,我尝试修改我的代码:

#!C:\Python33\python.exe
import sys, pygame, os.path

print("Loading...")
pygame.mixer.pre_init(44100, -16, 2, 2048)
pygame.init()

def load(midi_file):
    module_directory = os.path.dirname(__file__)
    filename = os.path.join(module_directory, 'Audio', midi_file)
    pygame.mixer.music.load(filename)

load("title.midi")

size = width, height = 580, 444
screen = pygame.display.set_mode(size)
print("Loaded!")

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
    titlemusic.play(-1)

注意:我带走了所有其他.midi文件,以使代码更小/更易读,在问题解决后,它们将以正确的方式添加。

当运行时,解释器在第13行引发了另一个pygame.error“文件无法打开”(我加载“title.midi”)。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

路径是相对于当前目录的,不一定与脚本或模块所在的目录相同。要检查它是什么,请添加:

print os.getcwd()

要计算相对于模块目录的路径,您可以执行以下操作:

module_directory = os.path.dirname(__file__)
filename = os.path.join(module_directory, 'Audio', 'town3.midi')

__file__为您提供模块的文件名,os.path.dirname剥离文件部分)

简单的辅助函数可能很有用:

def load(midi_file):
    filename = os.path.join(module_directory, 'Audio', midi_file)
    pygame.mixer.music.load(filename)

load('town1.midi')
load('town2.midi')
load('town3.midi')

答案 1 :(得分:0)

如果文件与python文件不在同一文件夹中,则需要在打开文件时指定该文件夹。我建议您将文件打开为"Audio/file.midi",而不仅仅是"file.midi"。这应该可以正常使用Fredrik建议的功能。如果您更改文件的存储位置(即重命名文件夹或移动文件),请不要忘记在代码中更改它。

编辑:此外,一个与您的问题无关的旁注,但也会很好地帮助您完成项目,尝试从文件夹动态获取文件,而不是对每个文件进行硬编码。尝试:

import os #this is a handy module with operating system functions

def getMusic(place): #where place is the name of the folder in this case "Audio/". Don't forget the slash!
    for file in os.listdir(place): #os.listdir returns a list of all the files in a directory. 
        pygame.mixer.music.load(place+file)