在Python中操作文件内数据的代码
在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
的数据。
不知道为什么会发生这种情况?
请给我提供一个解决方案。
在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, '')
来循环读取文件的每一行,并将整个文件重新写入临时文件中,以避免覆盖其他行的内容。同时,还需要注意一些其他的编码规范和注意事项。