3

[プリアンブル]:
私は Python を初めて使用し、 Windows 7 [32 ビット]でPython v3.3を使用しています。ここで、辞書に関するスタックオーバーフローと、新しいキーと値のペアを新しい辞書または既存の辞書に追加する方法を読んで、いくつかの良い情報を見つけました。ただし、以下の問題の解決策は見つかりませんでした。

[問題]:リスト内の要素数
(ファイル内の行から読み取られる) に基づいて適切な数のキーを動的に割り当て、対応するキーに値を割り当てる空の辞書を作成したいと考えています。注: (リスト内の要素は、ファイル内の各行の出力であり、' \ 'で区切られており、キーに割り当てられる値でもあります)。


[作業部]:

#listMusic.py
import os; from fnmatch import fnmatch

# This works like a charm for producing a file with the output of the
# absolute paths we want to grab our list elements from.    
def getWorkingPath(rootPath):
    outputFile = open('output.txt', 'w')
    filePattern = "*.mp3"
    for path, subdirs, files in os.walk(rootPath):
        for name in files:
            if fnmatch(name, filePattern):
                path_list = os.path.join(path, name + "\n")
                outputData = outputFile.write(path_list)
    outputFile.close()

# def setPathList():
    '''continued in [Tried Section]'''
rootPath = getWorkingPath(input('Enter a path to crawl: '))<br>

[Working Run]: [出力]: output.txt M:\Music\Artist1\Album1\Track1.mp3 M:\Music\Artist1\Album1\Track2.mp3 M:\Music\Artist1\Album2\Track1.mp3 M: \Music\Artist1\Album2\Track2.mp3 M:\Music\Artist2\Album1\Track1.mp3 M:\Music\Artist2\Album1\Track2.mp3 M:\Music\UnOrdered\Track1.mp3 M:\Music\UnOrdered \Track2.mp3 ... (など) ...
C:\> cd C:\Python33\Projects
C:\Python33\Projects>listMusic.py
Enter a path to crawl: 'M:\Music'
...
C:\Python33\Projects> notepad output.txt













【試した部分】:

...
...    
def setPathList():
    for i in open(r'output.txt', 'r'):
        v = i.rstrip("\n").split(os.sep)
        k = {'drive':v[0], 'directory':v[1], 'artist':v[2],
               'album':v[3], 'track':v[4]}
        print(k)
rootPath = getWorkingPath(input('Enter a path to crawl: '))

関数から同じコードをsetPathList()対話的に入力すると
、出力は期待どおりです(値リストに5つの要素がある場合...パスが範囲外の場合は失敗します)

[実行を試みました]:
C:\>Python
Python 3.3.2 [MSC v.1600 32 bit (Intel)] on win32
>>>

for i in open(r'output.txt', 'r'):
    v = i.rstrip("\n").split(os.sep)
    k = {'drive':v[0], 'directory':v[1], 'artist':v[2],
               'album':v[3], 'track':v[4]}
    print(k)

...
{'drive': 'M:', 'directory': 'Music', 'artist': 'Artist1', 'album': 'Album1', 'track': 'Track1.mp3'}
{'drive': 'M:', 'directory': 'Music', 'artist': 'Artist1', 'album': 'Album1', 'track': 'Track2.mp3'}
{'drive': 'M:', 'directory': 'Music', 'artist': 'Artist1', 'album': 'Album2', 'track': 'Track1.mp3'}
{'drive': 'M:', 'directory': 'Music', 'artist': 'Artist1', 'album': 'Album2', 'track': 'Track2.mp3'}
{'drive': 'M:', 'directory': 'Music', 'artist': 'Artist2', 'album': 'Album1', 'track': 'Track1.mp3'}
{'drive': 'M:', 'directory': 'Music', 'artist': 'Artist2', 'album': 'Album1', 'track': 'Track2.mp3'}
{'drive': 'M:', 'directory': 'Music', 'artist': 'Artist2', 'album': 'Album2', 'track': 'Track1.mp3'}
{'drive': 'M:', 'directory': 'Music', 'artist': 'Artist2', 'album': 'Album2', 'track': 'Track2.mp3'}

Traceback (most recent call last):
File "[stdin]", line 3, in [module]
IndexError: list index out of range
C:\>


モジュールを実行すると完全に失敗します。 したがって、ファイルの値と一致するキーを作成する辞書を作成する方法と、辞書を取得する適切な方法が必要です。
C:\> python -i listMusic.py
>>> print(k)
Traceback (most recent call last):
File "[stdin]", line 1, in [module]
NameError: name 'k' is not defined




[リソース]:
ファイルを 1 行ずつリストに読み込むにはどうすればよいですか?
Python で dos パスをコンポーネントに分割する方法

[最終的な考え]:
目的の出力を得るために、このスクリプトの単純でありながら重要な部分がおそらく欠けていると確信しています。私が言ったように、私はPythonを初めて使用し、このスクリプトの大部分は、言語の(緩い/壊れた)理解からつなぎ合わされました。回答済みの投票は、結果を生成するためのロジックの適切で一貫した説明を提供するものになります。

4

2 に答える 2

1

これらのエントリ

M:\Music\UnOrdered\Track1.mp3
M:\Music\UnOrdered\Track2.mp3

では5 つに分割できませんos.sep。パーツはたったの4つ

于 2013-11-06T13:52:09.907 に答える
0

あなたが解決しようとしていると思う問題は、パスの「ピース」がいくつあるかを事前に知らないということです。これにより、特定のパス レイアウトがあるかどうか確信が持てない場合に、「ああ、この 2 番目の部分はアーティスト、この 3 番目の部分はアルバム...」などの仮定を立てるのが非常に難しくなります。

したがって、1 つのオプションは、2 つのケースしかないことがわかっている場合は、ケースを別々に処理することだと思います。

for i in open(r'output.txt', 'r'):
    k = {}
    v = i.rstrip("\n").split(os.sep)
    k = {'drive':v[0], 'directory':v[1], 'artist':v[2]}
    if len(v) > 4:    # OR: if 'Unordered' not in v:
        k['album'] = v[3]
        k['track'] = v[4]
    else:
        k['track'] = v[3]
    print( k)

しかし、「ディレクトリ」がルートの 1 レベル下にない場合も考えてみてはいかがでしょうかたとえば、トラックが M:\MyFolder\Music にある場合、「ディレクトリ」とは何かという前提ですべてがオフになります。

要するに、フォルダの潜在的なレイアウトがわからない場合、間違った仮定をする可能性が非常に高いと思います。

于 2013-11-06T22:19:36.233 に答える