0

曲の歌詞をすばやく切り替えるのに役立つプログラムをコーディングしました。ファイルから歌詞を読み取り、.lyr印刷します。

これは、のような追加機能を含まない簡略化されたバージョンですedit_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\lyrics\は、次の形式で名前が付けられています。

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
>

Set Fire to the Rainインデックス付きの歌詞を開くと1、完全に開きます。ただし、の歌詞を開こうとするとNot Afraid、歌詞ファイルの長さが実際には約120行であるのに、出力に約50行の歌詞が表示されます。次に、次のように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
>

ファイルは互いにほとんど同じです(もちろん歌詞は異なります)。プログラムはIDLEで問題なく動作しますが、Pythonコマンドラインでは動作しません。

4

2 に答える 2

0

次のようなプログラムをコーディングしたと言います。

.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ファイルから歌詞を読みたい場合は、mutagenのようなライブラリを使用できます。

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')
于 2013-01-23T21:28:15.777 に答える
0

この問題はかなり奇妙に思えますが、不可能ではありません。現時点で得られたものは次のとおりです。

  1. ファイルが開いて一部が印刷されるため、問題はファイルの印刷にある必要があります。
  2. 私はあなたのコードをトリプルチェックしました、そして問題はあなたのdraw()メソッドにありません。
  3. 問題は一部のファイルでのみ発生し、他のファイルでは発生しないため、問題はおそらくファイル自体にあります。
  4. 問題はPythonコマンドラインでのみ発生し、IDLEでは発生しないため、問題は一部のファイルのコンテンツの印刷にある必要があります。これはIDLEで印刷できますが、Pythonコマンドラインでは印刷できません。

あなたがあなたの描画関数がまさにこのように見えることを確信しているなら(物事を理解するのに少し時間がかかりましたmaxlen):

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="")

self.contentファイルの内容自体に問題があるという事実だけが残っています。

簡単に言えば、ファイルにはIDLEで印刷できるが、Pythonコマンドラインでは印刷できない文字がいくつかあると99%確信しています。このような文字は、、、、、、、、、または矢印キーでスクロールしないと表示されない一部の非表示の文字でさえあります%'"´|#

歌詞の内容を投稿していただければ、もっとお手伝いさせていただきます。特に最後に印刷される行と、まったく印刷されない最初の行。

于 2013-01-24T14:32:45.240 に答える