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