在Python中操作文件内数据的代码

13 浏览
0 Comments

在Python中操作文件内数据的代码

文本文件中的数据:

GOPU 433 33332.000000
GOPAL 20 22233.000000
RAMU 33 76532.000000

以下是修改文本文件中数据的代码:

def modify():
    another='Y'
    while another=='Y':
        print "\n输入要修改的员工姓名"
        empname=raw_input()
        import os
        fp.seek(0,os.SEEK_SET)
        for line in fp:
            if len(line)>1:                         #处理换行符
                e.name, e.age, e.bs=line.split()
                e.age = int(e.age)                  # 将年龄从字符串转换为整数
                e.bs = float(e.bs)
                if(cmp(e.name,empname)==0):
                    c=len(line)
                    print "\n输入新的姓名、年龄和薪水"
                    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 "\n修改另一条记录(Y/N)"
        another=raw_input()

输出:

输入要修改的员工姓名:GOPAL
输入新的姓名、年龄和薪水:PANDEY
24
38374

文件内容变为:

GOPU 433 33332.000000
GOPAL 20 22233.000000
PANDEY 24 38374

当我尝试修改GOPAL的数据时,它会修改下一个员工RAMU的数据。

不知道为什么会发生这种情况?

请给我提供一个解决方案。

0
0 Comments

在Python中操作文件中的数据的代码中,出现了一些问题。首先,使用for line in fp:循环遍历文件对象作为迭代器,这会使用一个内部的预读缓冲区;这意味着使用f.seek()时,它是相对于缓冲区读取到的位置,而不是当前正在处理的行。为了解决这个问题,可以改为使用for line in iter(fp.readline, ''):来循环读取每一行,这样可以避免预读缓冲区的问题。

然而,这种处理方式会遇到其他问题;如果修改后的行的长度发生变化,要么不会覆盖足够的内容,要么会覆盖下一行的内容。文件的大小不会自动调整,如果写入文件的输出与要替换的行的长度不完全匹配,就会出现问题。因此,需要将整个文件重新写入临时文件中,然后将临时文件移动回原位置。

除了以上问题,原文中还提到了一些额外的注意事项:

- 在写入文件时,应使用fp.write(),而不是fp.writelines(),因为fp.writelines()会逐个字符地写入,效率较低。

- 在比较字符串时,不要使用cmp(),而应直接使用string1 == string2

- 在转换数据类型时,不要使用eval(),而应使用int()float()

- 只需要在代码的开头导入一个模块即可,多余的import语句是多余的。

此外,还有一个问题是,如果编辑的员工姓名太长,会覆盖下一个员工姓名的一部分,这是修改文本文件时可能遇到的问题。为了解决这个问题,建议参考提供的链接,其中有一个关于如何在Python中搜索和替换文件内容的示例。

总之,上述问题的解决方法是使用iter(fp.readline, '')来循环读取文件的每一行,并将整个文件重新写入临时文件中,以避免覆盖其他行的内容。同时,还需要注意一些其他的编码规范和注意事项。

0