建设网站需要提前准备的条件,怎么提高网站的知名度,自己建立公司网站的步骤,上海有色金属门户网站文件操作
引言
到目前为止#xff0c;我们做的一切操作#xff0c;都是在内存里进行的#xff0c;这样会有什么问题吗#xff1f;如果一旦断电或发生意外关机了#xff0c;那么你辛勤的工作成果将瞬间消失。是不是感觉事还挺大的呢#xff1f;现在你是否感觉你的编程技…文件操作
引言
到目前为止我们做的一切操作都是在内存里进行的这样会有什么问题吗如果一旦断电或发生意外关机了那么你辛勤的工作成果将瞬间消失。是不是感觉事还挺大的呢现在你是否感觉你的编程技巧还缺了点什么呢是的我们还缺少将数据在本地文件系统进行持久化的能力白话讲就是文件的读写能力。
文件打开 Python内置了一个open()方法用于对文件进行读写操作。使用open()方法操作文件就像把大象塞进冰箱一样可以分三步走一是打开文件二是操作文件三是关闭文件。 文件句柄/文件描述符 open()方法的返回值是一个file对象可以将它赋值给一个变量这个变量就是所谓的文件句柄。file对象 可以调用read()和write()方法对打开的文件进行读写操作。 open方法的语法 f open(filename, mode) filename 一个包含了你要访问的文件名称的字符串值通常是一个文件路径。 mode 打开文件的模式有很多种默认是只读方式r。 文件打开的模式 常规文件打开模式操作演示 b模式 二进制模式通常用来读取图片、视频等二进制文件。注意它在读写的时候是以bytes类型读写的因此获得的是一个bytes对象而不是字符串。在这个读写过程中需要自己指定编码格式。在使用带b的模式时一定要注意传入的数据类型确保为bytes类型。 模式 对于w模式在读写之前都会清空文件的内容建议不要使用对于a模式永远只能在文件的末尾写入有局限性对于r模式也就是读写模式配合seek()和tell()方法可以实现更多操作。 编码问题 要读取非UTF-8编码的文件需要给open()函数传入encoding参数例如读取GBK编码的文件遇到有些编码不规范的文件可能会抛出UnicodeDecodeError异常这表示在文件中可能夹杂了一些非法编码的字符。遇到这种情况可以提供errors’ignore‘参数表示如果遇到编码错误后如何处理。
文件对象操作 每当我们用open方法打开一个文件时将返回一个文件对象。这个对象内置了很多操作方法。 f.read(size) #size读取数据的个数 读取一定大小的数据, 然后作为字符串或字节对象返回。size是一个可选的数字类型的参数用于指定读取的数据量。当size被忽略了或者为负值那么该文件的所有内容都将被读取并且返回。注意 如果文件体积较大请不要使用read()方法一次性读入内存而是read(512)这种一点一点的读。 f.readline() 从文件中读取一行n内容。换行符为’\n’。如果返回一个空字符串说明已经已经读取到最后一行。这种方法通常是读一行处理一行并且不能回头只能前进读过的行不能再读了。 f.readlines() 将文件中所有的行一行一行全部读入一个列表内按顺序一个一个作为列表的元素并返回这个列表。readlines方法会一次性将文件全部读入内存所以也存在一定的风险。但是它有个好处每行都保存在列表里可以随意存取。 #需求读取文件中的数据
fp open(./test.txt,r)
text fp.read(10) #读取指定字节的数据
text_line fp.readline() #一次读取一行数据
text_lines fp.readlines() #读取多行数据返回一个列表
print(text_lines)
fp.close()总结 几种不同的读取和遍历文件的方法比较如果文件很小read()一次性读取最方便如果不能确定文件大小反复调用read(size)比较保险如果是配置文件调用readlines()最方便。普通情况使用for循环更好速度更快。 f.write() 将字符串或bytes类型的数据写入文件内。write()动作可以多次重复进行其实都是在内存中的操作并不会立刻写回硬盘直到执行close()方法后才会将所有的写入操作反映到硬盘上。在这过程中如果想将内存中的修改立刻保存到硬盘上可以使用f.flush()方法。 fp open(./test123.txt,w)
fp.write(hello bobo)
fp.close() #将文件内容清空在写入新数据 fp open(./test123.txt,a)
fp.write(hello bobo)
fp.close() #在文件数据末尾追加数据 f.tell() 返回文件读写指针当前所处的位置,它是从文件开头开始算起的字节数。一定要注意了是字节数不是字符数。 fp open(./test123.txt,w)
# fp.write(hello bobo)
print(fp.tell())
fp.close()f.seek() 如果要改变文件指针的位置, 可以使用f.seek(offset, from_what)方法。seek()经常和tell()方法配合使用。 from_what 如果是0表示从文件开头计算如果是1表示从文件读写指针的当前位置开始计算2表示从文件的结尾开始计算默认为0 offset表示偏移量 seek(x,0) 从起始位置即文件首行首字符开始移动 x 个字节seek(x,1) 表示从当前位置往后移动x个字节seek(-x,2)表示从文件的结尾往前移动x个字节 fp open(./test.txt,r)
fp.seek(9,0)
text fp.read(5)
print(text)
fp.close()f.close() 关闭文件对象。当处理完一个文件后调用f.close()来关闭文件并释放系统的资源。文件关闭后如果尝试再次调用该文件对象则会抛出异常。忘记调用close()的后果是数据可能只写了一部分到磁盘剩下的丢失了或者更糟糕的结果。也就是说大象塞进冰箱后一定不要忘记关上冰箱的门。
with关键字
with关键字用于Python的上下文管理器机制。为了防止诸如open这一类文件打开方法在操作过程出现异常或错误或者最后忘了执行close方法文件非正常关闭等可能导致文件泄露、破坏的问题。Python提供了with这个上下文管理器机制保证文件会被正常关闭。在它的管理下不需要再写close语句。注意缩进。
with open(./test123.txt,r) as fp: #fp open()text fp.read(5)
print(text)#上下两组代码功效一样
fp open(./test123.txt,r)
text fp.read(5)
print(text)
fp.close()简易图书管理系统
注册功能登录功能图书的录入图书的删除图书的修改操作图书的查询操作
注册实现
1.判定两次密码一致则注册成功
def regist():print(欢迎来到注册页面)print(-------------)username input(enter username:)password input(enter password:)repeatpwd input(repeat enter password:)email input(enter email:)#判定用户的注册状态if password repeatpwd:with open(./userData.txt,a) as fp:#bobo-123-123qq.com#jay-456-456qq.comfp.write(username-password-email\n)print(注册成功)else:print(两次密码不一致注册失败)
def login():passdef main_view():print(欢迎来到xxx管理系统)print(----------------)print(1.登录\n2.注册\n3.退出)choose input(请选择功能:)if choose 1:login()elif choose 2:regist()elif choose 3:exit() #退出整个程序else:print(输入有误程序退出)main_view()在两次密码一致的情况下在验证用户名是否重复 def regist():print(欢迎来到注册页面)print(-------------)username input(enter username:)password input(enter password:)repeatpwd input(repeat enter password:)email input(enter email:)#判定用户的注册状态if password repeatpwd:isHave False#用户名是否重复的状态显示isHaveTrue表示用户名重复with open(./userData.txt,r) as fp:#bobo-123-123qq.com#jay-456-456qq.com#读取文件中所有注册用户的用户名user_data_list fp.readlines()for user_data in user_data_list:userName user_data.split(-)[0]if username userName:#用户名重复isHave Trueif isHave False: fp.write(username-password-email\n)print(注册成功)else:print(注册失败%s用户名已被占用%username)else:print(两次密码不一致注册失败)
def login():passdef main_view():print(欢迎来到xxx管理系统)print(----------------)print(1.登录\n2.注册\n3.退出)choose input(请选择功能:)if choose 1:login()elif choose 2:regist()elif choose 3:exit() #退出整个程序else:print(输入有误程序退出)main_view()登录功能实现 import time
def regist():print(\n\n欢迎来到注册页面)print(-------------)username input(enter username:)password input(enter password:)repeatpwd input(repeat enter password:)email input(enter email:)#判定用户的注册状态if password repeatpwd:isHave False#用户名是否重复的状态显示isHaveTrue表示用户名重复with open(./userData.txt,r) as fp:#bobo-123-123qq.com#jay-456-456qq.com#读取文件中所有注册用户的用户名user_data_list fp.readlines()for user_data in user_data_list:userName user_data.split(-)[0]if username userName:#用户名重复isHave Trueif isHave False: fp.write(username-password-email\n)print(注册成功,三秒后自动跳转到登录页面......)time.sleep(3) #暂停三秒login()else:print(注册失败%s用户名已被占用%username)print(是否重新注册y/n)c input(enter your choose:)if c y or c Y:regist()else:exit() else:print(两次密码不一致注册失败)
def login():print(\n\n欢迎来到登录页面)print(-------------)username input(enter username:)password input(enter password:)#判定登录状态login_state Falsewith open(./userData.txt,r) as fp:user_data_list fp.readlines()for user_data in user_data_list:un user_data.split(-)[0]pw user_data.split(-)[1]if username un and password pw:login_state Truebreakif login_state True:print(登录成功)else:print(登录失败,是否返回主页面y/n)c input(enter your choose:)if c y or c Y:main_view()else:exit()
def findPwd():un input(enter your username:)em input(enter your email)with open(./userData.txt,r) as fp:isFind Falseuser_data_list fp.readlines()for user_data in user_data_list:username user_data.split(-)[0]email user_data.split(-)[2]#将email中的回车去掉email email.strip()if username un and email em:password user_data.split(-)[1]print(找回的密码为,password)isFind Truebreakif isFind False:print(密码找回失败用户名和邮箱不匹配)
def main_view():print(欢迎来到xxx管理系统)print(----------------)print(1.登录\n2.注册\n3.找回密码\n4.退出)choose input(请选择功能:)if choose 1:login()elif choose 2:regist()elif choose 3:findPwd() elif choose 4:return #退出整个程序else:print(输入有误程序退出)main_view()拓展内容python访问链接数据库 import pymysql #需要单独pip install pymysql进行安装
#1.链接数据库
conn pymysql.Connect(host 127.0.0.1,port 3306,user root,password boboadmin,db AnHui,charset utf8
)#2.创建一个游标对象(用来执行sql语句)
cursor conn.cursor()#3.可以通过创建好的游标对象执行相关的sql语句
#sql delete from userData where usernametom
sql insert into userData (username,password,email) values (tom,333,333qq.com)
cursor.execute(sql)#4.事物的处理
conn.commit()import pymysql
#1.链接数据库
conn pymysql.Connect(host 127.0.0.1,port 3306,user root,password boboadmin,db AnHui,charset utf8
)#2.创建一个游标对象(用来执行sql语句)
cursor conn.cursor()#3.可以通过创建好的游标对象执行相关的sql语句
#查询数据
sql select * from userData
cursor.execute(sql)
result cursor.fetchall()
print(result)#4.事物的处理
conn.commit()管理系统完整实现
import time
def regist():print(\n\n欢迎来到注册页面)print(-------------)username input(enter username:)password input(enter password:)repeatpwd input(repeat enter password:)email input(enter email:)#判定用户的注册状态if password repeatpwd:isHave False#用户名是否重复的状态显示isHaveTrue表示用户名重复with open(./userData.txt,r) as fp:#bobo-123-123qq.com#jay-456-456qq.com#读取文件中所有注册用户的用户名user_data_list fp.readlines()for user_data in user_data_list:userName user_data.split(-)[0]if username userName:#用户名重复isHave Trueif isHave False: fp.write(username-password-email\n)print(注册成功,三秒后自动跳转到登录页面......)time.sleep(3) #暂停三秒login()else:print(注册失败%s用户名已被占用%username)print(是否重新注册y/n)c input(enter your choose:)if c y or c Y:regist()else:exit() else:print(两次密码不一致注册失败)
def insertBook():title input(插入图书的名称:)publish_date input(插入图书的出版时间:)author input(插入图书的作者:)publish input(插入图书的出版社:)with open(./bookData.txt,a) as fp:fp.write(title-publish_date-author-publish\n)print(title,插入成功)print(是否继续插入y/n)c input(enter your choose:)if c y or c Y:insertBook()else:manageView()
def showBooks():print(\n\n)with open(./bookData.txt,r) as fp:book_list fp.readlines()for book in book_list:print(book)c input(返回主页面请按1:)if c 1:manageView()
def deleteBook():#指定一个删除的条件name input(请输入即将要删除的图书名称:)with open(./bookData.txt,r) as fp:book_list fp.readlines()for book in book_list:if name in book:book_list.remove(book)fp open(./bookData.txt,w)for book in book_list:fp.write(book)fp.close()print(name,被成功删除3秒后自动跳转会主页面......)time.sleep(3)manageView()
def updateBook():name input(请输入即将要修改图书的名字:)with open(./bookData.txt,r) as fp:book_list fp.readlines()for book in book_list:if name in book:old_author book.split(-)[2]new_author input(请输入新的作者名称:)new_book book.replace(old_author,new_author)book_list.append(new_book)book_list.remove(book)breakfp open(./bookData.txt,w)for book in book_list:fp.write(book)print(图书修改成功等待3秒返回主页面......)fp.close()time.sleep(3)manageView()def manageView():print(\n\n欢迎来到管理系统)print(1.查看所有图书\n2.插入图书\n3.删除图书\n4.修改图书\n5.返回主页面\n)choose input(enter your choose:)if choose 1:showBooks()elif choose 2:insertBook()elif choose 3:deleteBook()elif choose 4:updateBook()else:main_view()
def login():print(\n\n欢迎来到登录页面)print(-------------)username input(enter username:)password input(enter password:)#判定登录状态login_state Falsewith open(./userData.txt,r) as fp:user_data_list fp.readlines()for user_data in user_data_list:un user_data.split(-)[0]pw user_data.split(-)[1]if username un and password pw:login_state Truebreakif login_state True:manageView()else:print(登录失败,是否返回主页面y/n)c input(enter your choose:)if c y or c Y:main_view()else:exit()
def findPwd():un input(enter your username:)em input(enter your email)with open(./userData.txt,r) as fp:isFind Falseuser_data_list fp.readlines()for user_data in user_data_list:username user_data.split(-)[0]email user_data.split(-)[2]#将email中的回车去掉email email.strip()if username un and email em:password user_data.split(-)[1]print(找回的密码为,password)isFind Truebreakif isFind False:print(密码找回失败用户名和邮箱不匹配)
def main_view():print(欢迎来到xxx管理系统)print(----------------)print(1.登录\n2.注册\n3.找回密码\n4.退出)choose input(请选择功能:)if choose 1:login()elif choose 2:regist()elif choose 3:findPwd() elif choose 4:return #退出整个程序else:print(输入有误程序退出)main_view()