Fi动态字典

2024-05-18 06:12:05 发布

您现在位置:Python中文网/ 问答频道 /正文

前言:
我是Python新手,在windows7[32位]上使用pythonv3.3。在stackoverflow上阅读了字典,以及如何将新的key值对添加到新的或现有的字典中,我发现了一些有用的信息。但是,我还没有找到解决以下问题的方法。在

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


[工作区]:

#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: \>;cd C:\Python33\Projects
C: \Python33\Projects>;列表音乐.py
输入要爬网的路径:“M:\Music”

C: \Python33\Projects>;记事本输出.txt


[输出]:输出.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: \音乐\无序\Track1.mp3
M: \音乐\无序\Track2.mp3
(以此类推)


[试过的部分]:

^{pr2}$

从函数setPathList()交互输入相同代码时,
输出如预期(如果值列表中有5个元素…如果路径超出范围,则失败)

[试运行]:
C:\>;Python
win32上的Python 3.3.2[MSC v.1600 32位(Intel)]
>;>>

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','Artist1','album':'Album1','track':'Track1.mp3'}
{'drive':'M:','directory':'Music','Artist1','album':'Album1','track':'Track2.mp3'}
{'drive':'M:','directory':'Music','Artist1','album':'Album2','track':'Track1.mp3'}
{'drive':'M:','directory':'Music','Artist1','album':'Album2','track':'Track2.mp3'}
{'drive':'M:','directory':'Music','Artist2','album':'Album1','track':'Track1.mp3'}
{'drive':'M:','directory':'Music','Artist2','album':'Album1','track':'Track2.mp3'}
{'drive':'M:','directory':'Music','Artist2','album':'Album2','track':'Track1.mp3'}
{'drive':'M:','directory':'Music','Artist2','album':'Album2','track':'Track2.mp3'}

回溯(最近一次呼叫):
文件“[stdin]”,第3行,在[module]
索引器错误:列表索引超出范围
C: \>;


并且在运行模块时完全失败:
C:\>;python-i列表音乐.py
>;>>打印(k)
回溯(最近一次呼叫):
文件“[stdin]”,第1行,在[module]
名称错误:名称“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的新手,这个脚本的大部分内容都是根据我对该语言的理解(松散/破碎)拼凑而成的。有答案的投票将是那些对产生结果的逻辑给出良好、连贯解释的投票。

Tags: pathgt列表albummusictrackdrivemp3
2条回答

这些条目

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

不能在os.sep上拆分为五个部分。只有四个部分。在

我想你要解决的问题是,你事先不知道你会有多少条路要走。当你不确定有一个特定的路径布局时,很难做出这样的假设:“哦,好吧,这第二部分是艺术家,这第三部分是专辑…”等等。在

所以我认为一个选择是,如果你知道你只拥有两个 案例,然后分别处理:

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中,那么假设“directory”是什么,则一切都将关闭。在

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

相关问题 更多 >