3

[序言]:
我是 Python 新手,我在Windows 7 [32-Bit]上使用Python v3.3。在 stackoverflow 上阅读了有关字典以及如何将新的 key : value 对添加到新的或预先存在的字典中的信息,我发现了一些很好的信息。但是,我还没有找到解决以下问题的方法。

[问题]:
我想创建一个空字典,它将根据列表中元素的数量(从文件中的行读取)动态分配适当数量的键,将值分配给相应的键。
注意:(列表中的元素是文件中每一行的输出,由“\”分隔,也是要分配给键的值)。


【工作部分】:

#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>

[工作运行]: [输出]: 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




[资源]:
如何将文件逐行读取到列表中?
如何在 Python 中将 dos 路径拆分为其组件

[最后的想法]:
我确信我可能错过了该脚本的一些简单但重要的部分,以获得所需的输出。正如我所说,我是 python 的新手,这个脚本的大部分是根据我对语言的(松散/破碎的)理解拼凑而成的。已回答的投票将是那些对产生结果的逻辑给出良好、连贯的解释的投票。

4

2 回答 2

1

这些条目

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

不能分成部分上os.sep。只有四个部分。

于 2013-11-06T13:52:09.907 回答
0

我认为您要解决的问题是,您事先不知道最终将拥有多少条路径。当您不确定是否有特定的路径布局时,这将很难做出“哦,好吧,第二部分是艺术家,第三部分是专辑……”等假设。

所以我认为一种选择是,如果你知道你只会有两种情况,然后分别处理这些情况:

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)

但是我认为您可能还想考虑“目录”可能不只是根目录下的一层的情况?例如,如果您的曲目位于 M:\MyFolder\Music 中,那么在假设“目录”是什么的情况下,一切都会关闭。

底线是,如果您不知道进入的文件夹的潜在布局,我认为很有可能做出错误的假设。

于 2013-11-06T22:19:36.233 回答