解析文本文件中的行的问题

时间:2012-10-04 22:55:07

标签: python

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

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])) 

感谢。

3 个答案:

答案 0 :(得分: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]]

答案 1 :(得分: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)int(workload)就更有意义了,特别是你不再需要输入像int(lineList[i][1])那样笨重的东西。

答案 2 :(得分: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)]格式的列表或元组,则可以轻松将其转换为字典。