文件中的动态字典

时间:2013-11-06 13:08:20

标签: python python-3.x dictionary

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

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


[工作部分]:

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

[正在运行]:
C:\&GT; cd C:\ Python33 \ Projects
C:\ Python33 \项目与GT; listMusic.py
输入要抓取的路径:'M:\ Music'
...
C:\ Python33 \项目与GT;记事本output.txt


[输出]: output.txt
M:\音乐\ Artist1 \ Album1 \ Track1.mp3
M:\音乐\ Artist1 \ Album1 \ Track2.mp3
M:\音乐\ Artist1 \ Album2 \ Track1.mp3
M:\音乐\ Artist1 \ Album2 \ Track2.mp3
M:\音乐\ Artist2 \ Album1 \ Track1.mp3
M:\音乐\ Artist2 \ Album1 \ Track2.mp3
M:\音乐\无序\ Track1.mp3
M:\音乐\无序\ Track2.mp3
... (以及其他) ...


< p>

[尝试部分]:

...
...    
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:\&GT; Python的
win32上的Python 3.3.2 [MSC v.1600 32位(英特尔)] &GT;&GT;&GT;

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:','目录':'音乐','艺术家':'艺术家1','专辑':'专辑1','专辑' :'Track1.mp3'}
{'drive':'M:','目录':'音乐','艺术家':'艺术家1','专辑':'相册1','曲目':'Track2.mp3'}
{'drive':'M:','目录':'音乐','艺术家':'艺术家1','专辑':'相册2','曲目':'Track1.mp3'}
{'drive':'M:','目录':'音乐','艺术家':'艺术家1','专辑':'专辑2','曲目':'Track2.mp3'}
{'drive':'M:','目录':'音乐','艺术家':'艺术家2','专辑':'相册1','曲目':'Track1.mp3'}
{'drive':'M:','目录':'音乐','艺术家':'艺术家2','专辑':'相册1','曲目':'Track2.mp3'}
{'drive':'M:','目录':'音乐','艺术家':'艺术家2','专辑':'相册2','曲目':'Track1.mp3'}
{'drive':'M:','目录':'音乐','艺术家':'艺术家2','专辑':'专辑2','专辑':'Track2.mp3'}
追溯(最近的呼叫最后):
文件“[stdin]”,第3行,在[module]中 IndexError:列表索引超出范围
C:\&GT;


运行模块时完全失败:
C:\&GT; python -i listMusic.py
&GT;&GT;&GT;打印(k)的
追溯(最近的呼叫最后):
  文件“[stdin]”,第1行,在[module]中 NameError:名称'k'未定义


所以我需要一种方法来创建一个字典来创建与文件中的值匹配的键,以及一种获取字典的正确方法。


[资源]:
How do I read a file line-by-line into a list?
How to split a dos path into its components in Python

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

2 个答案:

答案 0 :(得分:1)

这些条目

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

无法拆分为os.sep上的五个部分。只有四个部分。

答案 1 :(得分: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中,则假设“目录”是什么,所有内容都将关闭。

最重要的是,如果您不知道文件夹的潜在布局,我认为有很多可能做出错误的假设。