我的代码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”)。任何帮助表示赞赏。
答案 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)