python基础文档_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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值