day08_文件操作

# # 账户注册
# usename = input("请输入用户名:")
# password = input("请输入密码:")
#
# with open("2.txt", mode="w", encoding="utf-8") as account:
#     account.write("{}
{}".format(usename, password))

# 账户登录
li = []
i = 0
while i < 3:
    usename1 = input("请输入用户名:")
    password1 = input("请输入密码:")
    with open("2.txt", mode="r", encoding="utf-8") as account1:
        for line in account1:
            li.append(line)
    print(li)
    if usename1 == li[0].strip() and password1 == li[1].strip():  
        #Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
        print("登录成功")
        break
    else:
        if i < 2:
            print("输入错误,重新输入")
        else:
            print("强制退出")
    i += 1

  

计算机系统分为:计算机硬件,操作系统,应用程序三部分。

我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

 1.文件操作

  1.文件路径:绝对路径、相对路径

  2.编码格式:utf-8

  3.操作方式:只读,只写,追加。读写...

  f=open("d:1.txt",mode="r",encoding="utf-8")

  f.read()

  f.close() 

  print(f.read())

      只读:r, 二进制读取:rb(非文字文件,图片,音频等),并且如果你要是带有b的模式操作文件,那么不用声明编码方式。

              以只读方式打开文件,文件的指针将会放在文件的开头。是文件操作最常用的模式,也是默认模式,如果一个文件不设置mode,那么默认使用r模式操作文件。

      只写:w  ,若有文件,直接覆盖

  f=open("d:1.txt",mode="w",encoding="utf-8")    没有文件则创建,有文件则覆盖

  f.write("sd")

  f.close() 

  

  追加:a   若文件存在,则尾部追加

  f=open("d:1.txt",mode="a",encoding="utf-8")    没有文件则创建,有文件则覆盖

  f.write("sdalkksk")

  f.close() 

  读写:r+  (常用)

  f=open("d:1.txt",mode="r+",encoding="utf-8")   

  print(f.read() )

  f.write("sdalkksk")

  f.close() 

  写读:w+   先清除,后添加

  f=open("d:1.txt",mode="w+",encoding="utf-8")   

  f.write("sdalkksk")

  print(f.read() )

  f.close() 

  读写:a+    光标已经到最后,可以seek(0),将光标一直起始位置,再读取

  f=open("d:1.txt",mode="a+",encoding="utf-8")   

  f.write("sdalkksk")

  print(f.read() )

  f.close() 

功能详解

1.seek(n)  #按照字节定光标位置,偏移n个字节

f = open("小娃娃", mode="r+", encoding="utf-8")
f.seek(0) # 光标移动到开头
content = f.read() # 读取内容, 此时光标移动到结尾
print(content)
f.seek(0) # 再次将光标移动到开头
f.seek(0, 2) # 将光标移动到结尾
content2 = f.read() # 读取内容. 什么都没有
print(content2)
f.seek(0) # 移动到开头
f.write("张国荣") # 写入信息. 此时光标在9 中文3 * 3个 = 9
f.flush()
f.close() 

seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数

通常我们使用seek都是移动到开头或者结尾

移动到开头:seek(0)

移动到结尾:seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾

2.f.tell()    #返回光标所在位置

  f.truncate() # 截取文件

read()将文件内容全部读取出来,弊端,当文件很大,就会占内存,容易导致内存崩溃

read(n)------read()读取的时候指定读取到什么位置

    在r模式下,n按照字符读取

f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg = f.read(3)
msg1 = f.read() # 从三个字符串之后读取
f.close()
print(msg)
print(msg1)

结果: 
高圆圆

刘亦菲
张柏芝
杨紫
王菲

3.f.readable()   #是否可读,bool

4.f.readline()    #读取整行字符串,每次一行(注意点:readline()读取出来的数据在后面都有一个 ),就是会单独换一行

解决这个问题只需要在我们读取出来的文件后边加一个strip()就OK了

f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg1 = f.readline().strip()
msg2 = f.readline().strip()
msg3 = f.readline().strip()
msg4 = f.readline().strip()
f.close()
print(msg1)
print(msg2)
print(msg3)
print(msg4)

结果:
高圆圆
刘亦菲
张柏芝
杨紫

5.f.readlines()   #将每一行放置列表中,读取

打开文件的另一种方式

咱们打开文件都是通过open去打开一个文件,其实Python也给咱们提供了另一种方式:with open() as .... 的形式,那么这种形式有什么好处呢?

# 1,利用with上下文管理这种方式,它会自动关闭文件句柄。
with open('t1',encoding='utf-8') as f1:
    f1.read()
    
# 2,一个with 语句可以操作多个文件,产生多个文件句柄。
with open('t1',encoding='utf-8') as f1,
        open('Test', encoding='utf-8', mode = 'w') as f2:
    f1.read()
    f2.write('老男孩老男孩')

这里要注意一个问题,虽然使用with语句方式打开文件,不用你手动关闭文件句柄,比较省事儿,但是依靠其自动关闭文件句柄,是有一段时间的,这个时间不固定,所以这里就会产生问题,如果你在with语句中通过r模式打开t1文件,那么你在下面又以a模式打开t1文件,此时有可能你第二次打开t1文件时,第一次的文件句柄还没有关闭掉,可能就会出现错误,他的解决方式只能在你第二次打开此文件前,手动关闭上一个文件句柄。

修改文件

# 文件不能修改

若修改文件,新建一文件写入,替换,删除旧文件,新文件重命名

import os

with open("1","r",encoding="utf-8") as f1,open("2.txt","w",encoding="utf-8") as f2: for line in f1: if "wzc" in line: line = line.replace("wzc","wuzhengchong") #写入文件 f2.write(line) import os os.remove("1") #删除源文件 os.rename("2.txt","1") #重命名
原文地址:https://www.cnblogs.com/wzc27229/p/10952639.html