在上一篇博文里有介绍简单的文件操作,而这一篇是在上一篇的基础上延伸的。百变不离其中,让我们继续往下看。
代码背景:我最近在写一个乞丐版的学生信息管理系统,主要实现录入,查看,修改,删除,搜索,清空学生信息等功能。所以代码中会用class类初始化学生信息各参数,字符串拼接成一整串信息,并存储在文件student.txt中
出席嘉宾:[file object].write(),,,,[file object].readlines()
[file object].seek() 将文件光标移到指定位置。0是起始点, 1是当前所处位置,2是终点
[string].replace(old_info,new_info) 用新的子串代替老子串
[file object].truncate() 从文件光标所处位置起截断(删除)下面的内容
1. 在文件中添加新内容。那肯定是调用我们经常使用的write方法
class StudentInfo:
def __init__(self, name, stuid, gender, age, major, tel):
self.name = name
self.stuid = stuid
self.gender = gender
self.age = age
self.major = major
self.tel = tel
def info(self):
# 字符串的拼接
msg = self.name + ' ' + self.stuid + ' ' + self.gender + self.age + ' ' + self.major + ' ' + self.tel + '\n'
return msg
def add():
# the file has been created , aappending,and will be closed automatically
with open('student.txt', 'a') as f:
name = input("Name: ")
stuid = input("Student ID: ")
gender = input("1.Male 2.Female : ")
age = input("Age: ")
major = input("Major: ")
tel = input("Telephone: ")
student = StudentInfo(name, stuid, gender, age, major, tel)
f.write(student.info())
2. 读取文件中的全部内容。read方法走起~
def view():
with open("student.txt", 'r') as f:
lines = f.readlines()
for line in lines:
print(line)
3. 删除文件中特定一行的信息。这个是文件操作中最精髓的地方,搞懂了这个,其他的操作都可以迎刃而解。
这里要特别注意f.seek(0)的位置。在写代码的时候贪方便,直接省略了lines = f.readlines()这个操作,而是写成了for line in f.readlines(),发现不对头了,文本多复制了一遍,第二遍要删的是删掉了,可是跟预期的不一样啊,那只能是f.seek(0)和f.truncate() 没起作用了。为什么呢,因为我后面的for line in f.readlines()将文件光标又移动到了文件的末尾,我在末尾将除了要删的信息外复制了一遍,f.truncate()将在由光标起始处起删除,可是此刻已经是文件的末尾,这个方法相当于没进行操作。
故改为了lines = f.readlines(),这样的话,光标移到了文件起始处,在起始处复制了除要删除的信息外的其他信息,光标位于新旧信息之间,最后,f.truncate()将原始信息删掉了。
def delete():
discard = input("delete the info you want: ")
with open('student.txt', 'r+') as f:
lines = f.readlines()
f.seek(0)
for line in lines:
if discard not in line:
f.write(line)
f.truncate()
4. 修改文件内容跟删除类似,但是多了一些操作,用字符串处理方法将要修改的信息改正过来了再写入文件。
def revise():
revise_line = input("show the info line: ")
with open('student.txt', 'r+') as f:
lines = f.readlines()
f.seek(0)
for line in lines:
if revise_line in line:
print(line)
old_info = input("old info: ")
new_info = input("new info: ")
line = line.replace(old_info, new_info)
f.write(line)
else:
f.write(line)
f.truncate()
5. 相信看懂了前面部分的你,这个查找函数就是小case了。
def research():
search = input("info you want to search: ")
with open("student.txt", 'r') as f:
lines = f.readlines()
for line in lines:
if search in line:
print(line)