将文本文件转换为python字典

将文本文件转换为python字典,python,dictionary,Python,Dictionary,我在将文本文件转换为python字典时遇到问题。幸运的是,文本文件有一个“:”将我的未来键与其值分开。例如,每一行的结构如下“-项目经理:约翰·考德威尔”。我想在包含大量文本文件的目录中循环。在这个过程中,我想去掉每行有一个“-”。以下是我目前掌握的代码: import sys, traceback,os, csv, itertools from collections import defaultdict def get_metadata(filepath): d = default

我在将文本文件转换为python字典时遇到问题。幸运的是,文本文件有一个“:”将我的未来键与其值分开。例如,每一行的结构如下“-项目经理:约翰·考德威尔”。我想在包含大量文本文件的目录中循环。在这个过程中,我想去掉每行有一个“-”。以下是我目前掌握的代码:

import sys, traceback,os, csv, itertools
from collections import defaultdict

def get_metadata(filepath):
    d = defaultdict(list)
    for files in filepath:
        if files.endswith(".txt"):
            with open(files,'r') as in_file:
                for line in in_file:
                    k,v = line.strip('-').split(':')
                    d[k].append(v)

    return d

root_directory = get_metadata("C:\Random")
print root_directory
这是我运行脚本时得到的结果

defaultdict(<type 'list'>, {})
defaultdict(,{})
问题在于
C:\Random“
不是文件列表,它只是一个字符串。因此,对于文件路径中的文件,
将为您提供
'C'
,然后是
':'
,然后是
'\'
,依此类推。所有这些都以
.txt
结尾,因此您不会打开任何文件或执行任何其他操作

你想要的可能是

或者,如果您希望(递归地)打开该目录或任何子目录中的所有文件,请使用(有关示例代码,请参阅链接文档)


正如bgporter所指出的,如果调用
listdir
的唯一原因是根据模式检查每个文件名,那么您可能希望使用来跳过
if
测试的需要。

…或者使用
glob.glob()
来获得感兴趣的.txt文件列表…非常好的反馈!我假设将txt转换为字典的部分是正确的?它给了我一个ValueError ValueError:需要超过1个值才能unpack@user40720当前位置其余部分看起来不错。有关
ValueError
的信息,请参阅我对该问题的评论。作为旁注,不要在非原始字符串文本中使用未转换的反斜杠。你在这里碰巧侥幸逃脱了惩罚,但是用
“C:\random”
试试,你会得到一个可怕的惊喜。您可以使用原始字符串(
r“C:\Random”
),转义反斜杠(
“C:\\Random”
),或者(除少数情况外)使用前斜杠代替(
“C:/Random”
)。此外,您的值将以换行结束。您可能需要
line.rstrip().lstrip('-').split(':')
或类似的方法来处理该问题。@abarnert我认为这是一个错误:ValueError:需要超过1个值才能解包
ValueError
看起来像是一个新问题,如果您自己无法解决,您需要为它创建一个新问题。但我会给出50/50的可能性,问题在于文件中的某个地方有空行(可能在末尾只有一行),尝试将一个空行拆分为
k
v
显然会失败。您可以通过检查空行(
,如果strippedline:k,v=strippedline.split(“:”)
),或者通过使用
尝试
/
除了
,或者其他两种方法来处理,这取决于您是否只想静默地忽略空行,或者任何意外情况,或者……还有一件事:您可能想
剥离
v
值,也可能
k
值;否则,您将遇到名为“John Caldwell”
的项目经理,而不是名为“John Caldwell”