【10月更文挑战第17天】
编码---encode()
解码---decode()
#编码(encode):将我们能够识别的文字,转换为计算机能够识别的内容
print('你好'.encode())#默认utf-8
#b'\xe4\xbd\xa0\xe5\xa5\xbd'
#将'你好'翻成进制数
#解码(decode):将计算机能识别的内容,转换为我们能识别的内容
print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode())
#你好
#将计算机语言翻译成我们能看懂的语言
#如何设置编码格式呢?
#下面是两种编码格式
print('你好'.encode('gbk'))
#b'\xc4\xe3\xba\xc3'
print('你好'.encode('utf-8'))
#b'\xe4\xbd\xa0\xe5\xa5\xbd'
#我们可以发现,编码的默认值是和这个utf-8是一样的
#解码也是默认utd-8
print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('gbk'))
#浣犲ソ
#这个是我们的解码使用gbk
#这个叫做乱码
#编码和解码格式是不一致的,会导致乱码或者报错
#我们编码使用gbk就行,但是我们的解码使用gbk就会进行报错
#编码用什么格式,解码就用什么格式
#我们使用gbk模式产生出来的编码就用gbk模式进行解码的操作
#模式是要进行对应的,不然是会报错的
编码用什么格式,解码就用什么格式
我们使用gbk模式产生出来的编码就用gbk模式进行解码的操作
模式是要进行对应的,不然是会报错的
格式有两中
uft-8和gbk(中国的)
文件的路径
文件的绝对路径和相对路径的解释
'''
文件路径:要打开的文件的存储位置
绝对路径:从盘符开始一直到文件的路径
如:C:\Users\27890\Desktop\demo.txt
相对路径:同文件夹下的文件才会进行使用的(同一个文件夹下才能使用相对路径)
如:demo.txt
'''
绝对路径:就是处于盘符的某个位置
相对路径:对于现在这个py文件,我们要打开的文件此时我们两个是在一个文件夹里面的
我们输入要打开文件的文件名字就能打开了
打开文件
打开文件,open(文件路径,mode='r',encodeing='cp936')
open()有三个参数的
mode='r'
mode:设置文件的打开方式
r:文件以只读的方式打开
encodeing="cp936"
encodeing:设置打开文件的编码格式
#我们现在桌面有个文件叫demo.txt文件,那么我们如何打开呢?
#我们先将文件位置进行复制
#"C:\Users\27890\Desktop\demo.txt"
#1.打开文件----open(文件路径)
#打开文件之后会返回一个文件对象,那么我们就需要一个变量进行保存的操作
f=open(r"C:\Users\27890\Desktop\demo.txt")
print(f)
#为什么我们这个会报错呢?
#回想起我们之前的转义字符\
#那么这个的\和后面的字母或者是数字一起组合的话可能有着其他的意思
#那么我们如何进行处理呢?
#我们在整个字符串的前面加上r就可以取消字符串中的转义了
#<_io.TextIOWrapper name='C:\\Users\\27890\\Desktop\\demo.txt' mode='r' encoding='cp936'>
#上面的是绝对路径
#那么我们这个进行相对路径的书写
f1=open('demo.txt')
print(f1)
#<_io.TextIOWrapper name='demo.txt' mode='r' encoding='cp936'>
#这个打开文件的open()有三个参数的
#open(文件路径,mode='r',encodeing='cp936')
我们在路径的字符串的前面加上r,可以取消这个字符串的转义操作了
关闭文件
=open(r"C:\Users\27890\Desktop\demo.txt")
print(f)
f.close()
#查看文件是否关闭:
print(f.closed)
#True
#如果忘记关闭怎么办,我们可以进行自动关闭的操作的
#with open()
with open("demo.txt")as f:
print(f'1{f.closed}')
#在with open里面就是出于打开的状态,出来的话就自动进行关闭了
print(f'2{f.closed}')
#1False
#2True
#as将open("demo.txt")打开的文件对象绑定到变量f上。
#这意味着在with语句的代码块中,你可以使用变量f来访问这个文件对象。
关闭我们有手动的关闭
close()
还有自动的
我们在打开的时候用with open,在这个代码结束之后就会进行自动关闭的操作了
对于as的用法
我们这里
as将open("demo.txt")打开的文件对象绑定到变量f上。
这意味着在with语句的代码块中,你可以使用变量f来访问这个文件对象
我们将打开的文件的返回对象通过as赋值给对象
读取文件信息
read:将文件的内容全部读取
with open("demo.txt") as f:
print(f.read())
#123456
#通过这种方法我们能将文件中的数据进行读取
read(n):读取一个长度的数据
n是正整数
在括号内写上数字的话,那么我们就设置了读取的长度限制
with open("demo.txt") as f:
print(f.read(3))
#123
对于文档中存在汉字的读取方式
对于文档中存在汉字的话,我们是如何进行读取的呢?
#我们在demo.txt文件中添加中文通过这种方法进行读取的话就会报错,这是为什么呢?
#根据报错的信息,我们需要对这个打开的时候的编码格式进行改变
with open("demo.txt",encoding='utf-8') as f:
print(f.read())
'''
123456
这是一个demo.txt文件
'''
只需要将这个open内的第二个默认参数改为utf-8就行了
设置编码格式uft-8
下一次读取的开始位置
对于多次读取的话,我们的下一次读取就是从前面一次读取的结束位置的后面的那个位置开始进行读取操作的
ith open("demo.txt",encoding='utf-8') as f:
print(f.read(2))
print('-'*30)
print(f.read())
'''
12
------------------------------
3456
这是一个demo.txt文件
'''
#我们在第二次读取的时候并没有从头开始
#而是从上一次读完的下一个位置开始的
readline():一次读取一行数据
将文件中的每一行进行读取
with open("demo.txt",encoding='utf-8') as f:
print(f.readline())#读取第一行
#123456
print(f.readline())#读取第二行
#这是一个demo.txt文件
readlines():以行为单位,读取所有数据,返回的是一个以行数据为元素的列表
with open("demo.txt",encoding='utf-8') as f:
print(f.readlines())
#['123456\n', '这是一个demo.txt文件']
将每一行的数据当成一个元素,然后放到一个列表中进行存储
文件的写入
我们通过write进行数据的写入
write(字符串)
我们打开时的open默认的是r,就是只能读,不能写的模式
我们如果这么就进行写入的操作的话,那么就是会进行报错操作的
'''
with open("demo.txt",encoding='utf-8') as f:
f.write('胡云凯')
r'''
Traceback (most recent call last):
File "C:\Users\27890\Desktop\15.文件操作.py", line 154, in <module>
f.write('胡云凯')
io.UnsupportedOperation: not writable
'''
#这里进行了报错
那么我们如何进行数据的写入呢?
那么我们就需要用另外一种模式进行打开了
r----只读不能写,如果文件不存在是会进行报错的
w---只能够进行写入,不存在就创建,存在的话就进行所有数据进行写入
a---只能够进行写入,不存在就创建,存在的话就就在原有的数据的基础下进行数据的追加写入
我们需要将这个打开文件时的第二个参数进行修改
with open("demo.txt",mode='w',encoding='utf-8') as f:
f.write('胡云凯666')
对文件进行查看,确实是多了这个数据
w的介绍
对于'w'的话,只能写,打开的文件不存在就进行创建的操作,打开文件会将之前存在的文件进行清空的操作的
with open("demo1.txt",mode='w',encoding='utf-8') as f:
f.write('胡云凯666')
可以看到我们本来要打开demo1这个文件的
但是我们桌面上没有这个文件
对于w的话,如果没有文件我们就进行创建的操作
w有个霸道的地方,如果我们打开的文件之前有数据的话,w会将文件内的数据进行清空的操作
然后进行数据的写入操作的
a的介绍
a其实是追加的意思,我们在列表中涉及到追加的知识
对于a的话,打开的文件不存在的话就进行这个文件的创建操作
with open("demo2.txt",mode='a',encoding='utf-8') as f:
f.write('胡云凯666')
可以看见桌面上多了一个demo2的文件
现在我们的demo1里面是有数据存放的
但是现在我们通过a方式进行数据的写入操作
那么原先的数据会消失吗?
with open("demo1.txt",mode='a',encoding='utf-8') as f:
f.write('凯子坚持C')
我们发现原先的数据并没有被删除,并且在原先的数据后面进行数据的追加了
那么我们可以进行归纳一下,a只写不读,打开文件不存在的话是会进行文件的创建的,如果文件存在的话,并且有数据的话,我们就在原先的数据的后面进行数据的读写
写入的话是不会帮你换行的
我们只能在写入的时候加上\n进行换行操作
对文件可读可写操作
在r 、w、a的后面加上+,就可以进行可读可写的操作
with open("demo1.txt",mode='r+',encoding='utf-8') as f:
f.write('\n凯子坚持C')
print(f.readlines())
f.write('\nhi')
print(f.read())
#['\n', '凯子坚持C子坚持C\n', '凯子坚持C\n', '凯子坚持C\n', 'hi']
对于文件中的光标
查看文件中光标的位置--tell()
f.tell()
with open("demo1.txt",mode='r+',encoding='utf-8') as f:
f.write('\n凯子坚持C')
print(f.readlines())
f.write('\nhi')
print(f.read())
#['\n', '凯子坚持C子坚持C\n', '凯子坚持C\n', '凯子坚持C\n', 'hi']
print(f.tell())
#97
移动光标---seek(0,起始位置)
起始位置:0(文件开头),1(当前光标的位置),2(文件结尾)
如果我们在重新读取一遍,那么我们需要将光标移动到文件的开头
with open("demo1.txt",mode='r+',encoding='utf-8') as f:
f.write('\n凯子坚持C')
print(f.readlines())
f.write('\nhi')
print(f.read())
#['\n', '凯子坚持C子坚持C\n', '凯子坚持C\n', '凯子坚持C\n', 'hi']
print(f.tell())
#97
f.seek(0,0)
print(f.tell())
print(f.read())
'''
['\n', '凯子坚持C子坚持C\n', '凯子坚持C\n', '凯子坚持C\n', 'hi\n', '凯子坚持C\n', 'hi\n', '凯子坚持C\n', 'hi\n', '凯子坚持C\n', 'hi']
135
0
凯子坚持C子坚持C
凯子坚持C
凯子坚持C
hi
凯子坚持C
hi
凯子坚持C
hi
凯子坚持C
hi
凯子坚持C
hi
对于r+的话,我们光标打开位置是0
如果我们进行数据的写入的操作话,我们是会将原先的数据进行覆盖的,而不是在原有的数据后面进行追加的
r+是不能一上来就进行写
对于w+的话,尽量少用,一般用于创建文件,用于可读可写的操作
对于a+的话,打开文件光标位置是最后的,因为a是追加的
with open("demo1.txt",mode='a+',encoding='utf-8') as f:
print(f.tell())
#135
如果我们使用a+的话,直接读取文件的话是没有东西的,因为我们的光标在最后面
with open("demo1.txt",mode='a+',encoding='utf-8') as f:
print(f.tell())
f.seek(0,0)
print(f.read())
所以我们在使用a+的时候,我们需要进行数据的读取的话,我们需要将光标移动到最前面的位置
使用这个seek(0,0)就能实现了
如果我们在以后的话,优先读文件就使用r+
写文件就a+
创建文件就w+