用于在python中处理文件内部数据的代码

时间:2014-02-01 11:16:00

标签: python

文本文件中的数据:

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

不知道为什么会这样?

请为我提供解决方案吗?

1 个答案:

答案 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行是多余的。