FOR使用Python进行文件管理循环

时间:2015-02-17 08:00:54

标签: python python-2.7 for-loop file-io while-loop

我正在做一个小练习。

  

有一个文本文件有3列:EmployeeID,First Name和   姓。编写一个程序来创建keys()为的字典   文本文件中的EmployeeID和values()是第一个也是最后一个   名字合并。

我首先尝试了没有循环。

f = open('empID.txt','r')
line1 = f.readline().split()
line2 = f.readline().split()
line3 = f.readline().split()
print line1
print line2
print line3
empdict={}
empdict[line1[0]] = line1[1]+" "+line1[2]
empdict[line2[0]] = line2[1]+" "+line2[2]
empdict[line3[0]] = line3[1]+" "+line3[2]
print "The resulting dictionary is \n",empdict
f.close()

这很好用。然后我试着循环。

f = open('empID.txt','r')
empdict = {}
for line in f:
        line = f.readline().split()
        print line
        empdict[line[0]] = line[1]+" "+line[2]

print "The resulting dictionary is \n",empdict
f.close()

这引发了一个错误:

Traceback (most recent call last):
  File "empID3.py", line 4, in <module>
    line = f.readline().split()
ValueError: Mixing iteration and read methods would lose data

某人advised在类似的情况下使用while循环,所以我尝试了:

我代替for line in f:添加了while True:,这次它打印了所有line个输出,然后又输出了另一个错误,而不是输出dictionary

Traceback (most recent call last):
  File "empID3.py", line 6, in <module>
    empdict[line[0]]=line[1]+" "+line[2]
IndexError: list index out of range

有人可以帮我解决这个问题吗?我哪里错了?

2 个答案:

答案 0 :(得分:3)

您根本不需要使用file.readline() 。循环遍历文件(迭代)已经为您提供了行,因此将现在冗余的调用完全删除到file.readline()

for line in f:
    print line
    line = line.split()
    empdict[line[0]] = line[1]+" "+line[2]

您也可以使用while循环,但是您需要检查结束条件;你的档案不是无止境的。读完整个文件后,file.readline()返回一个空字符串;拆分空字符串会导致出现空列表,导致异常。

检查文件已完成的情况:

while True:
    line = f.readline()
    if not line:
        break
    line = line.split()
    print line
    empdict[line[0]] = line[1]+" "+line[2]

这比直接for循环案例更加冗长。

您可以将分割限制在第一个空格:

empid, name = line.strip().split(None, 1)
empdict[empid] = name

当不使用参数或None时,str.split() call在空白上拆分,第二个参数限制拆分计数。如果姓氏包含空格,则此功能特别有用:

>>> line = '42 Guido van Rossum\n'
>>> line.split()
['42', 'Guido', 'van', 'Rossum']
>>> line.split(None, 1)
['42', 'Guido van Rossum\n']

你必须明确剥离换行符。

你也可以使用str.partition(),这比只有一个分裂的情况略快于str.split(),你可以拆分一个固定的字符串(而不是任意的空格):

empid, _, name = line.strip().partition(' ')

_变量就是用来捕获分区的;该方法返回3个值。 _名称是一种约定,在这种情况下,它意味着我将忽略该值

可能是文件中的某些行是空的;你想跳过这些行,否则你仍会得到IndexErrorValueError例外:

line = line.strip()
if not line:
    continue  # line is empty

最后但并非最不重要的是,如果您使用文件对象作为上下文管理器,在with语句中,Python将在您完成阅读后为您关闭文件对象,您的代码是成功还是有异常:

empdict = {}
with open('empID.txt','r') as f:
    for line in f:
        line = line.strip()
        if not line:
            continue
        empid, _, name = line.partition(' ')
        empdict[empid] = name

现在根本不需要致电f.close()

答案 1 :(得分:1)

当您完成for循环时,解决方案可能非常简单

output_dict = {}
for line in f:
    line = line.strip()
    key, value = line.split(" ", 1)
    output_dict[key] = value

或者,为此的一个班轮将是:

output_dict = dict(map(lambda i: i.strip().split(" ", 1), f.read().split("\n")))

PS:我希望第一次超过第二次,因为在我看来,它更加清洁。

相关问题