手撕Python之文件操作

凯子坚持 c 2024-09-12 10:35:01 阅读 79

1.编码

编码---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(中国的)

2.文件操作

文件的路径

文件的绝对路径和相对路径的解释

<code>'''

文件路径:要打开的文件的存储位置

绝对路径:从盘符开始一直到文件的路径

如: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'>code>

#上面的是绝对路径

#那么我们这个进行相对路径的书写

f1=open('demo.txt')

print(f1)

#<_io.TextIOWrapper name='demo.txt' mode='r' encoding='cp936'>code>

#这个打开文件的open()有三个参数的

#open(文件路径,mode='r',encodeing='cp936')code>

我们在路径的字符串的前面加上r,可以取消这个字符串的转义操作了

关闭文件

<code>=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:将文件的内容全部读取

<code>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:code>

print(f.read())

'''

123456

这是一个demo.txt文件

'''

只需要将这个open内的第二个默认参数改为utf-8就行了

设置编码格式uft-8

下一次读取的开始位置

对于多次读取的话,我们的下一次读取就是从前面一次读取的结束位置的后面的那个位置开始进行读取操作的

ith open("demo.txt",encoding='utf-8') as f:code>

print(f.read(2))

print('-'*30)

print(f.read())

'''

12

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

3456

这是一个demo.txt文件

'''

#我们在第二次读取的时候并没有从头开始

#而是从上一次读完的下一个位置开始的

readline():一次读取一行数据

将文件中的每一行进行读取

with open("demo.txt",encoding='utf-8') as f:code>

print(f.readline())#读取第一行

#123456

print(f.readline())#读取第二行

#这是一个demo.txt文件

readlines():以行为单位,读取所有数据,返回的是一个以行数据为元素的列表

with open("demo.txt",encoding='utf-8') as f:code>

print(f.readlines())

#['123456\n', '这是一个demo.txt文件']

将每一行的数据当成一个元素,然后放到一个列表中进行存储

文件的写入

我们通过write进行数据的写入

write(字符串)

我们打开时的open默认的是r,就是只能读,不能写的模式

我们如果这么就进行写入的操作的话,那么就是会进行报错操作的

'''

with open("demo.txt",encoding='utf-8') as f:code>

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:code>

f.write('胡云凯666')

文件进行查看,确实是多了这个数据

w的介绍

对于'w'的话,只能写,打开的文件不存在就进行创建的操作,打开文件会将之前存在的文件进行清空的操作的

<code>with open("demo1.txt",mode='w',encoding='utf-8') as f:code>

f.write('胡云凯666')

可以看到我们本来要打开demo1这个文件

但是我们桌面上没有这个文件

对于w的话,如果没有文件我们就进行创建的操作

w有个霸道的地方,如果我们打开的文件之前有数据的话,w会将文件内的数据进行清空的操作

然后进行数据的写入操作的

a的介绍

a其实是追加的意思,我们在列表中涉及到追加的知识

对于a的话,打开的文件不存在的话就进行这个文件的创建操作

<code>with open("demo2.txt",mode='a',encoding='utf-8') as f:code>

f.write('胡云凯666')

可以看见桌面上多了一个demo2的文件

现在我们的demo1里面是有数据存放的

但是现在我们通过a方式进行数据的写入操作

那么原先的数据会消失吗?

<code>with open("demo1.txt",mode='a',encoding='utf-8') as f:code>

f.write('凯子坚持C')

我们发现原先的数据并没有被删除,并且在原先的数据后面进行数据的追加了

那么我们可以进行归纳一下,a只写不读,打开文件不存在的话是会进行文件的创建的,如果文件存在的话,并且有数据的话,我们就在原先的数据的后面进行数据的读写

写入的话是不会帮你换行的

我们只能在写入的时候加上\n进行换行操作

对文件可读可写操作

在r 、w、a的后面加上+,就可以进行可读可写的操作

<code>with open("demo1.txt",mode='r+',encoding='utf-8') as f:code>

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:code>

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:code>

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:code>

print(f.tell())

#135

如果我们使用a+的话,直接读取文件的话是没有东西的,因为我们的光标在最后面

with open("demo1.txt",mode='a+',encoding='utf-8') as f:code>

print(f.tell())

f.seek(0,0)

print(f.read())

所以我们在使用a+的时候,我们需要进行数据的读取的话,我们需要将光标移动到最前面的位置

使用这个seek(0,0)就能实现了

如果我们在以后的话,优先读文件就使用r+

写文件就a+

创建文件就w+

3.文件流

文件流:临时文件,py文件执行完,临时文件占用内存,自动回收

如果我们要使用临时文件的话,那么我们是需要进行数据的导入的

io流

文件流分为:字符串类型、字符串类型

字符串类型的流

import io

s=io.StringIO()#生成一个字符串类型的临时文件

s.write('hello')

s.seek(0,0)#将光标放到开头

print(s.read())

字节类型的流

import io

b=io.BytesIO()#生成一个字节类型的临时文件

#我们需要进行编码操作

b.write('你好'.encode())#只能写入字节数据,需要进行编码

print(b.getvalue())

#b'\xe4\xbd\xa0\xe5\xa5\xbd'

#字节的访问就是getvalue()

#如果像变成我们能看懂的东西,那么就进行解码操作

print(b.getvalue().decode())

#你好

4.文件目录操作

操控电脑上的文件,需要导入os模块

文件夹的创建

使用os.mkdir

<code>import os

os.mkdir('凯子坚持C')

如果我们想要固定创建的位置的话,我们就需要使用相对路径

<code>import os

os.mkdir(r'D:\作业\凯子坚持C')

如果是同一个文件夹的话,那么我们使用相对路径就行了

文件夹的重命名操作

现在我们的桌面是有一个文件的---凯子坚持C.txt

我们如何对这个文件进行重命名的操作呢?

使用os.rename

<code>import os

os.rename("凯子坚持C",'小凯')

文件夹的查询操作

获取当前文件的位置

os.getcwd()---返回值就是当前文件的位置

<code>import os

print(os.getcwd())#获取当前文件的位置

#C:\Users\27890\Desktop

获取当前文件夹内所有的文件

os.listdir()

import os

print(os.listdir())#获取当前文件夹内所有的内容

这些操作我们也是可以进行路径的指定的,获取指定文件夹中所有的内容

删除文件夹

删除空文件夹os.rmdir("文件名")

<code>import os

os.rmdir("小凯")#删除空文件

将文件夹进行删除

os.remove

import os

os.remove("文件名")

对图片进行操作

如果想打开图片的话,那么我们需要用字节的方式进行打开

那么我们的读取模式从r变成rb

b是以字节的方式进行读取

这里我进行读取是十分卡顿的,因为这个图片的字节是很多的

with open(r"C:\Users\27890\Desktop\微信图片_20240906224155.png",mode='rb') as f:code>

print(f.read())

b:以字节方式打开内容

应用于打开图片、音频、视频等非文字文件

对图片进行复制的操作

我们需要先拿到需要复制的文件信息

然后再进行复制

我们先定义一个变量,将要复制图片的信息进行存储

<code>with open(r"C:\Users\27890\Desktop\微信图片_20240906224155.png",mode='rb') as f:code>

data=f.read()

#我们这里不能在用rb了,因为我们要复制这个图片了,所以我们用wb

with open(r"C:\Users\27890\Desktop\微信图片_20240906224155附件.png",mode='wb') as f:code>

f.write(data)

从名字我们就能看出这个图片我们进行复制成功了

我们需要先打开这个我们要复制的图片,将获取的信息用变量进行保存

然后利用这个变量进行文件的创建

最后就得到了这个复制的图片



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。