0

我有一个 .txt 文件,其中包含许多行格式为“主题、值、工作负载”的文件,我想以 dict[subect]: (值、工作负载) 格式将其打印到字典中。这是我这样做的代码:

for line in inputFile:
        lineList.append(line.split(",", 3))
for i in range(0, len(lineList)):
        subjectDict[lineList[i][0]] = (lineList[i][1], lineList[i][2])
        print subjectDict[lineList[i][0]]

但是,运行程序时,我的 subjectDict 值以元组的形式返回,格式如下:“'6', '2\r\n'。” 这个 r\n 业务是怎么回事?我假设它与文本文件中的换行符有关,这就是为什么我首先在​​我的 split 方法中放入 3 个最大值,但它似乎将 2\r\n 解释为一个字符串. 此外,是否有更有效的方法将元组中的这些列表项分别转换为整数,或者我应该这样做:

subjectDict[lineList[i][0]] = (int(lineList[i][1]), int(lineList[i][2])) 

谢谢。

4

3 回答 3

1

请执行下列操作:

for line in inputFile:
        lineList.append(line.strip().split(",", 3))
for i in range(0, len(lineList)):
        subjectDict[lineList[i][0]] = (lineList[i][1], lineList[i][2])
        print subjectDict[lineList[i][0]]

strip 方法将去掉字符串开头和结尾的任何空格(包括 \r\n 字符)。\r\n 是行尾(\r\n 表示您可能正在打开一个 Windows 文件,Linux/Mac 文件通常使用 \n 作为行尾)。

据我所知 int(someStrVar) 是转换为整数的最有效方法。

假设您稍后对此 lineList 不感兴趣,您可以执行以下操作:

for line in inputFile:
        lineSplit = line.strip().split(",", 3)
        subjectDict[lineSplit [0]] = (lineSplit [1], lineSplit [2])
        print subjectDict[lineSplit [0]]
于 2012-10-04T22:57:33.577 回答
1

尝试这个:

output_dict = {}
with open(r"filename.txt") as f:
    for line in f:
        line = line.strip() # remove newlines and such (the '/r/n' bit)
        subject, value, workload = line.split(',', 3)
        output_dict[subject] = (int(value), int(workload))

所以,我做了几个改变。我曾经line.strip()从您的字符串中删除任何换行符(和周围的空格)。为了提高效率,我还将您拥有的两个循环合二为一。

要将元组中的每个项目转换为 int,您可以执行以下操作:

my_tuple = tuple(int(i) for i in my_tuple)

...这基本上是将生成器推导转换为元组,但鉴于您只有两个项目要转换,因此仅键入int(value)and可能更有意义int(workload),特别是因为您不再需要键入像int(lineList[i][1]).

于 2012-10-04T23:00:05.947 回答
1

这是我的建议,使用列表理解:

with open(r"test.txt") as f:
    reBuff = [x.split(",") for x in f.readlines()]
    outDict = dict([(subject.strip(), (int(value.strip()), int(workload.strip()))) for subject,value,workload in reBuff])

一旦你有一个格式为的列表或元组[(key, value),(key, value)],你就可以轻松地将它转换为字典。

于 2012-10-05T00:28:28.463 回答