[序言]:
我是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
... (以及其他) ...
[尝试部分]:
...
...
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'未定义
所以我需要一种方法来创建一个字典来创建与文件中的值匹配的键,以及一种获取字典的正确方法。
答案 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中,则假设“目录”是什么,所有内容都将关闭。
最重要的是,如果您不知道文件夹的潜在布局,我认为有很多可能做出错误的假设。