我正在做一个小练习。
有一个文本文件有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
有人可以帮我解决这个问题吗?我哪里错了?
答案 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个值。 _
名称是一种约定,在这种情况下,它意味着我将忽略该值。
可能是文件中的某些行是空的;你想跳过这些行,否则你仍会得到IndexError
或ValueError
例外:
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:我希望第一次超过第二次,因为在我看来,它更加清洁。