【问题标题】:Dynamic Dictionary from File来自文件的动态字典
【发布时间】:2013-11-17 17:45:41
【问题描述】:

[序言]:
我是 Python 新手,在 Windows 7 [32-Bit] 上使用 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:\> cd C:\Python33\Projects
C:\Python33\Projects>listMusic.py
输入要抓取的路径:'M:\Music'
...
C:\Python33\Projects> 记事本输出.txt


[输出]: 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
... (等等)...


[尝试部分]:

...
...    
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
Win32 上的 Python 3.3.2 [MSC v.1600 32 位(英特尔)]
>>>

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'}

回溯(最近一次通话最后一次):
文件“[stdin]”,第 3 行,在 [module]
IndexError:列表索引超出范围
C:\>


运行模块时完全失败:
C:\> python -i listMusic.py
>>> 打印(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 的新手,这个脚本的大部分内容是根据我对语言的(松散/破碎的)理解拼凑而成的。已回答的投票将是那些对产生结果的逻辑给出良好、连贯的解释的投票。

【问题讨论】:

    标签: python python-3.x dictionary


    【解决方案1】:

    这些条目

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

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

    【讨论】:

    • 在尝试部分中提到了此注释:(如果值列表中有 5 个条目....如果路径超出范围则失败)。
    【解决方案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)
    

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

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

    【讨论】:

      猜你喜欢
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 2021-04-16
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多