Python基础-文件操作

Python基础--文件操作

文件操作

  • 使用open函数加载文件到内存
    • 注:文件打开以后,在使用完毕后应当关闭打开的文件,以免占用内存
  • 例如:
# 参数1:是需要打开的文件的位置,可以是绝对路径,也可以是相对路径。
# 参数2:mode可设置多种值,r、rb、r+、w、wb、w+、a、ab、a+ 。具体这些值代表什么意思,后面说明。
# 参数3:encoding,表示使用什么编码格式打开文件,文件是什么格式就用什么格式打开。

f = open('d:/文件操作测试文件.txt', mode='r' ,encoding='utf-8')  #打开文件
print(f.read()) #读取文件
f.colse()  #关闭文件

参数1:mode

  • 只读
    • r    mode='r' 时,文件对象只能进行读取操作,不能进行其他操作
    • rb  mode='rb' 时,文件对象只能以二进制的形式进行读取操作,不能进行其他操作
      • 以二进制读取,展示是转换为b'...'的格式
      • 如果文件文件里存的是字母,那个就显示为b'abcde...'
      • 如果文本文件里存的是汉字,这把汉字转换为16进制进行显示,b'x02x05'
      • 使用rb时不再需要指定编码,如果指定会报错
# 假设在当前目录下存在一个utf-8编码的txt文件,里面的内容如下
# this is abc
# 这是汉字

# r
f = open('文件操作测试文件', mode='r' ,encoding='utf-8')  #打开文件
print(f.read()) #读取文件
f.colse()  #关闭文件
-------------------------------------------------------
abc
汉字
-------------------------------------------------------


# rb ,使用rb时不再需要指定编码,如果指定会报错
f = open('文件操作测试文件', mode='rb' )  #打开文件
print(f.read()) #读取文件
f.colse()  #关闭文件
-------------------------------------------------------
b'abc\r\n\xe6\xb1\x89\xe5\xad\x97'
-------------------------------------------------------
  • 只写
    • w   mode='w' 时,文件对象只能进行写入操作,不能进行其他操作
      • 如果文件不存在,则创建文件
      • 如果文件存在,则从清空文件再写入
    • wb mode='wb' 时,文件对象只能以二进制的形式进行写入操作,不能进行其他操作
      • 如果文件不存在,则创建文件
      • 如果文件存在,则从清空文件再写入
      • 使用wb写入时,需要先将字符串转为二进制
      • 使用wb时不再需要指定编码,如果指定会报错
# 假设“文件操作测试文件” 不存在

# w
f = open('文件操作测试文件', mode='w', encoding='utf-8')
f.write('abcdefg')
f.close()
-------------------------------------------------------

-------------------------------------------------------

# wb 
f = open('文件操作测试文件', mode='wb')
f.write('测试'.encode())
f.close()
-------------------------------------------------------

-------------------------------------------------------
  • 追加
    • a   mode='a' 时,文件对象只能进行追加操作,不能进行其他操作
      • 默认从光标结尾处追加。
    • ab mode='ab' 时,文件对象只能以二进制的形式进行追加操作,不能进行其他操作
      • 默认从光标结尾处追加。
      • 使用ab写入时,需要先将字符串转为二进制
      • 使用ab时不再需要指定编码,如果指定会报错
# 假设“文件操作测试文件” 存在,其内容为:
# abc
# 测试

# a
f = open('文件操作测试文件', mode='a', encoding='utf-8')
f.write('一下')
f.close()
-------------------------------------------------------
#内容变为:
abc
测试一下
-------------------------------------------------------

# ab 
f = open('文件操作测试文件', mode='ab')
f.write('二下'.encode())
f.close()
-------------------------------------------------------
#内容变为:
abc
测试一下二下
-------------------------------------------------------
  • 读写
    • r+   mode='r+' 时,可以对文件进行读取和写入操纵
      • 先读后写
      • 先写后读
    • r+b mode='r+b' 时,可以以二进制的方式对文件进行读取和写入操纵
# 假设“文件操作测试文件” 存在,其内容为:
# abc
# 测试

# r+ 先读后写
f = open('文件操作测试文件', mode='r+', encoding='utf-8')
print(f.read()) #读取完光标在文件的最后位置
f.write("一下") #从光标所在位置写入
f.close()
-------------------------------------------------------
#read 输出内容
abc
测试

#文件内容变为:
abc
测试一下
-------------------------------------------------------

# r+ 先写后读
f = open('文件操作测试文件', mode='r+', encoding='utf-8')
#从光标所在位置写入(默认位置在文件开头),写完后光标移动到6,
#因为一个汉字在utf-8里占3个字节,一个字节一个光标位。所以2个汉字移动6个光标位。
#UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 0: invalid start byte
# 错误原因就是:先写是从光标0位置开始写,写2个汉字需要6个字节。
# 而源文件中第一行为abc3个字节,然后是换行,新写入的6个字节的后3位把换行覆盖了一部分,
# 导致信息无完整,故提示错误
f.write("一下")
print(f.read()) #读取完光标在位置之后的内容
f.close()
-------------------------------------------------------
#文件内容变为:
abc
测试一下

#read 输出内容
abc
测试
-------------------------------------------------------
  • 写读
    • w+   mode='w+' 时,可以对文件进行读取和写入操纵
      • 先读后写
      • 先写后读
    • w+b mode='w+b' 时,可以以二进制的方式对文件进行读取和写入操纵
  • 追加读
    • a+   mode='a+' 时,可以对文件进行读取和追加操纵
      • 先读后写
      • 先写后读
    • a+b mode='a+b' 时,可以以二进制的方式对文件进行读取和追加操纵

功能详解

  • 读取全部内容
f = open('文件操作测试文件', mode='r+', encoding='utf-8')
print(f.read()) 
f.close()
  • 字符读取文件
    • 文件里存的 abcd  那么:read(3)  abc
    • 文件里存的 天马行空 那么:read(3) 天马行
f = open('文件操作测试文件', mode='r+', encoding='utf-8')
print(f.read(3)) 
f.close()
  • 光标位置调
    • 光标调节是按字节调节
    • 为什么f.seek(2)报错? 因为一个汉字3字节
f = open('文件操作测试文件', mode='r+', encoding='utf-8')
f.seek(3) #将光标调节到3
print(f.read()) 
f.close()
  • 获取光标位置
#需求:在文件的末尾追加(汉字)后打印后面3个字符
f = open('文件操作测试文件', mode='a+', encoding='utf-8')
f.write('测试')  #追加完,光标在文件的最后
count = f.tell() #获取光标位置
f.seek(count-9) #为什么是 -9 ? 一个汉字3字节
print(f.read(3)) 
f.close()
  • 判断文件是否可读

    • f.readable()
  • 读一行

    • f.readline()  --> str   #一行一行的读  str

    • f.readlines() --> list  #每一行作为一个元素,返回一个列表

  • 截断文件并返回截断的字节长度

    • f.truncate()
  • 循环

#循环方式1
f = open('文件操作测试文件', mode='a+', encoding='utf-8')
#工作中不要这样读取,不知道文件大小的情况下很容易把内存撑爆
for line in f:
  print(line)
f.close()
#循环方式2 ()
#用这种方法,不必手动close(),此中方法可自动关闭文件
with open('文件操作测试文件', mode='a+', encoding='utf-8') as f:
  print(f.read())
  
# 打开多个文件
with open('file1', mode='a+', encoding='utf-8') as f1,\
open('fiel2', mode='a+', encoding='utf-8') as f2:
  print(f1.read())
  print(f2.read())

练习题

  • 功能:用户注册和登录
  • 注册成功写入文件
  • 登录从文件中读取,并与用户输入的进行对比
# 注册
while 1:
    username = input('请输入用户名:').strip()
    password1 = input('请输入密码:').strip()
    password2 = input('再次输入密码:').strip()
    if password1 == password2 :
        print('注册成功')
        with open('list_of_info', mode='w', encoding='utf-8') as f:
            f.write('{}\n{}'.format(username, password1))
        break
    else:
        print('两次输入的密码不一致,请重新输入')

# 登录
i = 0
users = []
while i < 3:
    usn = input('登录用户:')
    pwd = input('登录密码:')
    with open('list_of_info', mode='r+', encoding='utf-8') as f1:
        for j in f1:
            users.append(j)
        if usn == users[0].strip() and pwd == users[1].strip():
            print('登录成功')
            break
        else:
            print('用户名或密码错误')
    i += 1
posted @ 2019-02-12 10:33  Mirooger  阅读(111)  评论(0编辑  收藏  举报