文本文件中的数据:
GOPU 433 33332.000000
GOPAL 20 22233.000000
RAMU 33 76532.000000
以下是修改文本文件中数据的代码:
def modify():
another='Y'
while another=='Y':
print "\nEnter name of employee to modify"
empname=raw_input()
import os
fp.seek(0,os.SEEK_SET)
for line in fp:
if len(line)>1: #To handle line feed
e.name, e.age, e.bs=line.split()
e.age = int(e.age) # convert age from string to int
e.bs = float(e.bs)
if(cmp(e.name,empname)==0):
c=len(line)
print "\nEnter new name,age & bs"
e.name=raw_input()
e.age=eval(raw_input())
e.bs=eval(raw_input())
import os
fp.seek(-c,os.SEEK_CUR)
ch="%s %d %f" % (e.name,e.age,e.bs)
fp.writelines("\n")
fp.writelines(ch)
fp.writelines("\n")
break
print "\nModify another Record(Y/N)"
another=raw_input()
输出:
Enter name of employee to modify: GOPAL
Enter new name,age & bs: PANDEY
24
38374
文件内容变为:
GOPU 433 33332.000000
GOPAL 20 22233.000000
PANDEY 24 38374
当我试图修改GOPAL
的数据时,它正在修改下一个员工的数据,即; RAMU
。
不知道为什么会这样?
请为我提供解决方案吗?
答案 0 :(得分:3)
您正在循环遍历文件对象作为迭代器:
for line in fp:
使用内部预读缓冲区;这意味着使用f.seek()
相对于缓冲区读取的位置,而不是您正在处理的行。
您必须使用f.readline()
来电:
for line in iter(fp.readline, ''):
如果没有预读缓冲区,会给你相同的循环效果。
然而,您的方法会遇到其他问题;行大小的任何更改都将不会覆盖足够的内容或覆盖 next 行。如果您写入的输出与完全匹配您要替换的行长度,则文件不会自动缩小或增长。
相反,您必须将整个文件重写为临时文件并将其移回原位。
进一步评论:
使用fp.write()
; fp.writelines()
将最终单独编写每个字符。它会起作用,但只是偶然而缓慢。
比较字符串时请勿使用cmp()
。只需使用string1 == string2
。
请勿eval()
或int()
使用float()
。
您只需在顶部导入一次模块。那些额外的import os
行是多余的。