Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python歌词开启器适用于一个文件,但不适用于另一个文件?_Python_File_Printing_Python 3.x - Fatal编程技术网

Python歌词开启器适用于一个文件,但不适用于另一个文件?

Python歌词开启器适用于一个文件,但不适用于另一个文件?,python,file,printing,python-3.x,Python,File,Printing,Python 3.x,我编写了一个程序,可以帮助我在歌曲的歌词之间快速切换。它从.lyr文件中读取歌词并打印给我 这是一个简化版,没有任何附加功能,如edit\u line()。此代码仍然存在问题 import os class Lyrics: def __init__(self, file): '''Initialize new Lyrics object''' self.file = file.replace("/", "\\") self.path =

我编写了一个程序,可以帮助我在歌曲的歌词之间快速切换。它从
.lyr
文件中读取歌词并打印给我

这是一个简化版,没有任何附加功能,如
edit\u line()
。此代码仍然存在问题

import os

class Lyrics:

    def __init__(self, file):
        '''Initialize new Lyrics object'''
        self.file = file.replace("/", "\\")
        self.path = self.file.rsplit("\\", 1)[0] + "\\"
        self.suffix = "." + self.file.rsplit(".")[-2]
        self.name = self.file\
                    .replace(self.path, "")\
                    .replace(".lyr", "")\
                    .replace(self.suffix, "")

    def draw(self):
        '''Draw lyrics on user's screen'''
        maxlen = len(str(len(self.content)))
        print("[[ %s ]]"%self.name)
        for i,line in enumerate(self.content):
            print("%i  %s"%(i+1, line), end="")

    def play(self):
        '''View lyrics'''
        with open(self.file, "r") as f:
            self.content = f.readlines()
        #os.system("cls")
        self.draw()
        input("[[ Press enter to quit ... ]]")

def main(directory):
    # Get lyric files from directory
    lyric_files = []
    for file in os.listdir(directory):
        if file.endswith(".lyr"):
            lyric_files.append(Lyrics(directory + file))

    # Create variable for showing messages to user
    msg = ""

    # Main loop
    while True:

        # Print lyric files
        #os.system("cls")
        for i, file in enumerate(lyric_files):
            print("%i :: %s"%(i+1, file.name))

        # Handle input
        cmd = input("%s>"%msg)
        if cmd == "bye":
            break
        try:
            lyric_files[int(cmd)-1].play()
            msg = ""
        except ValueError:
            msg = "ValueError: Input must be an integer\n"
        except IndexError:
            msg = "IndexError: Integer must be between 1 and %i\n"%len(lyric_files)


if __name__ == "__main__":
    main("E:\\documents\\lyrics\\")

E:\documents\Lyms\
中的文件以以下格式命名:

Artist - Song.format.lyr`
例如:

E:\documents\lyrics\Adele - Set Fire to the Rain.mp3.lyr

当我打开程序时,它会按预期列出所有文件,并在以下情况下要求我输入:

1 :: Adele - Set Fire to the Rain
2 :: Eminem - Not Afraid
3 :: Nicki Minaj - Starships
>
当我用索引
1
打开
Set Fire to the Rain
的歌词时,它们就完美地打开了。然而,当我尝试打开
Not fear
的歌词时,我可以在输出上看到大约50行歌词,而歌词文件实际上大约有120行长。然后它要求我从
main()
函数中输入
ValueError
,如下所示:

1  first_line_in_lyrics
2  second_line_in_lyrics
i  ...
42 fourty_second_line_in_lyrics
43 fourty_third_line_in_lyrics
1 :: Adele - Set Fire to the Rain
2 :: Eminem - Not Afraid
3 :: Nicki Minaj - Starships
ValueError: Input must be an integer
>

这些文件彼此几乎完全相同(当然歌词是不同的)。该程序在空闲状态下工作正常,但在python命令行上工作不正常。

您说您编写了一个程序:

它从.lyr文件中读取歌词并打印给我

但我对你们节目的解读是:

def get_lyric_files(path):
    lyric_files = []
    for lyrics in os.listdir(path):
        if lyrics[:-4].split(".")[-1] in ("wav", "mp3"):
            lyric_files .append(Lyrics(path + lyrics))
    return lyric_files
看起来你正在从.mp3和.wav文件中提取歌词。有些mp3文件包含歌词标签,但您的用户无法解析它们。也许你打算:

lyric_files .append(Lyrics(path + lyrics + '.lyr'))
开始编辑 我现在明白了,我误读了这句话:

if lyrics[:-4].split(".")[-1] in ("wav", "mp3"):
我以为是:

if lyrics[-4:].split(".")[-1] in ("wav", "mp3"):
此代码与
*.mp3.?
匹配。如果您只查找.lyr文件,为什么不:

if lyrics[-8:] in (".wav.lyr", ".mp3.lyr"):
编辑2 此外,这也不好:

try:
    lyrics[int(cmd)-1].play()
except ValueError:
    pass
except IndexError:
    pass
您真的想在.play()中捕获并忽略ValueError和IndexError吗?相反:

try:
    lyric = lyrics[int(cmd)-1]
except ValueError:
    print 'You must enter a number'
except IndexError:
    print 'You must enter a number between 1 and', len(lyrics)
else:
    lyric.play()
这可能会帮助您发现问题所在,因为
try
不会掩盖任何错误

结束编辑 否则,如果你想从.mp3文件中读取歌词,你可以使用诱变剂之类的库

import mutagen, mutagen.mp3, mutagen.easyid3

# . . .

mp3Tags = mutagen.mp3.MP3(mp3FileName)
lyricFrame = mp3Tags.get("USLT::'eng'")
if lyricFrame:
    lyricText = lyricFrame.text
    lyrics = lyricText.split('\n')

这个问题看起来很奇怪,但并非不可能。以下是我们目前得到的信息:

  • 因为文件确实打开了,并且其中一些文件被打印出来了,所以问题一定出在文件的打印上
  • 我三次检查了您的代码,问题不在您的
    draw()
    方法中
  • 由于问题只发生在某些文件上,而不发生在其他文件上,因此问题可能存在于文件本身
  • 因为问题只发生在python命令行而不是IDLE中:问题必须出现在打印某些文件的某些内容时,这些内容可以在IDLE中打印,但不能在python命令行中打印
  • 如果您确定绘图函数与此完全相同(我花了一段时间才弄明白
    maxlen
    的含义):

    我们只剩下一个事实,
    self.content
    和/或文件内容本身有问题

    简单地说:我99%确定您的文件中有一些字符可以通过IDLE打印,但不能通过python命令行打印。这些字符可以是任何字符:
    %
    '
    '
    |
    #
    ,甚至是一些不使用箭头键滚动就看不到的不可见字符


    如果你可以发布歌词的内容,我可以尝试提供更多帮助。尤其是最后打印的行,以及根本没有打印的第一行。

    当你删除
    除了
    语句之外的
    语句时会发生什么情况?@DavidRobinson仍然一样,它们不会影响程序。如果出现错误,歌词将永远不会出现首先被打印出来。现在它们确实被打印出来了,但它们只是在cmd屏幕上闪烁,然后歌曲列表再次出现。那
    print(“\n”*500)
    行呢?这不是歌曲列表消失的原因吗?因为它滑出了屏幕?当你删除它时会发生什么?
    get\u lyric\u files()
    返回您在上面提供的代码中的
    None
    。您确定没有遗漏任何内容吗?@Hpa:嗯,代码中有两个地方可以
    打印(“\n”*500)
    。我敢打赌,当歌词“消失”时,这是由于这两个语句之一。尝试用
    print(“AAA”)替换它们
    打印(“BBB”)
    ,您可以确认这是问题所在,并知道它到达的哪一行导致它消失。主要帖子中提到了文件名,它是fe。
    Eminem-Not fear.mp3.lyr
    。我的代码首先用
    歌词[:-4]去掉
    .lyr
    然后检查剩余后缀是否为(“mp3”、“wav”)中的
    谢谢,我现在看到了。请参阅我文章中的编辑以获得建议(尽管不是解决问题的方法)。添加了第二次编辑,并进行了改进以尝试/例外。这些都是很好的提示,我打算稍后无论如何应用错误消息,但没有一个修复了我的问题,因为错误从未引发…:/我现在已经重写了问题,看看是否有帮助。非常感谢!问题出在
    字母上,例如
    I“m
    而这些行没有打印出来!我通过使用
    .replace(“'”,“')”
    def draw(self):
        '''Draw lyrics on user's screen'''
        maxlen = len(str(len(self.content)))
        print("[[ %s ]]"%self.name)
        for i,line in enumerate(self.content):
            print("%i  %s"%(i+1, line), end="")