文件操作
假如现在这个世界上,如果可以操作文件的所有软件都消失了,比如word,wps等等,此时你的朋友通过聊天软件给你发过来一个文件,文件名是:娱乐圈明星联系方式.txt,在座的所有同学,那么你接受到这个文件之后,你的内心是否有一丝冲动,想要看看里面写的是什么。但是前提说了所有可以操作文件的软件全部都没了,那么你是不是百爪挠心,火急火燎,哎呀。别急呀,你忘了么?你学过Python这门编程语言,这个语言肯定有能操控文件的功能。我相信在这种强大的动力下,你是可以,必须能学会的。
那么假设,现在让你用Python开发一个软件来操作这个文件,你觉得你需要什么必要参数呢?
文件路径:D:\娱乐圈明星联系方式.txt (你想操作这个文件,必须要知道这个文件的位置)
编码方式:utf-8,gbk,gb2312.... (编码,文件其实就是数据的存储,数据存储你需要编码知道这个数据是以什么编码存储的)
操作模式:只读,只写,追加,写读,读写....
此时你需要先利用软件创建一个文件,文件里面随便写一些内容,然后保存在任意磁盘(路径尽量要简单一些)中。
然后创建一个py文件,利用Python代码打开这个文件。
f = open('d:\明星联系方式.txt',mode='r',encoding='utf-8')
content = f.read()
print(content)
f.close()
结果:
标题很好
对上面代码的解释:
f: 就是一个变量,一般都会将它写成f,f_obj,file,f_handler,fh,等,它被称作文件句柄。
open:是Python调用的操作系统(windows,linux,等)的功能。
'd:\护士少妇萝莉.txt': 这个是文件的路径。
mode: 就是定义你的操作方式:r为读模式。
encoding: 不是具体的编码或者解码,他就是声明:此次打开文件使用什么编码本。一般来说:你的文件用什么编码保存的,就用什么方法打开,一般都是用utf-8(有些使用的是gbk)。
f.read():你想操作文件,比如读文件,给文件写内容,等等,都必须通过文件句柄进行操作。
close(): 关闭文件句柄(可以把文件句柄理解成一个空间,这个空间存在内存中,必须要主动关闭)。
有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:
#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
#2. 通过句柄对文件进行操作
data=f.read()
#3. 关闭文件
f.close()
文件操作基本操作流程
打开文件,得到文件句柄并赋值给一个变量
通过句柄对文件进行操作
关闭文件
# 第一种 必须手动关闭文件
f = open(文件路径,模式,编码)
文件操作
......
f.close() ##必不可少
# 第二种 自动关闭文件
with open(文件路径,模式,编码) as f:
文件操作
......
模式
| 模式 | ||
|---|---|---|
| 读 | r | 只读 |
| rb | 只读字节 | |
| r+ | 读写,对于读写模式,必须是先读后写,因为光标默认在开头位置,当读完了以后再进行写入.我们以后使用频率最高的模式就是r+,在r+模式下. 如果读取了内容. 不论读取内容多少. 光标显示的是多少. 再写入或者操作文件的时候都是在结尾进行的操作.r+模式一定要记住是先读后写 | |
| r+b | 读写字节 | |
| 写 | w | 只写,如果文件不存在使用w模式会创建文件,文件存在w模式是覆盖写,在打开文件时会把文件中所有的内容清空. |
| wb | 只写字节 | |
| w+ | 写读,先将所有的内容清空,然后写入.最后读取.但是读取的内容是空的,不常用 | |
| w+b | 写读字节 | |
| 追加 | a | 追加,只要是a或者ab,a+都是在文件的末尾写入,不论光标在任何位置.在追加模式下,我们写入的内容后追加在文件的末尾,a模式如果文件不存在就会创建一个新文件 |
| ab | 追加字节 | |
| a+ | 追加读,a+模式下,不论是先读还是后读,都是读不到数据的。 | |
| a+b | 追加读字节 |
注意:b的作用:在读取非文本文件的时候,比如要读取mp3,图像,视频等信息的时候就需要用到rb,因为这种数据是没办法直接显示出来的
这个字节的模式是用于传输和存储
方法
-
seek
seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数
通常我们使用seek都是移动到开头或者结尾
移动到开头:seek(0,0) 可以看做成seek(0)
seek(6)这种如果是单数并且不是0的就是按照字节来移动光标
移动到结尾:seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾
-
tell
使用tell()可以帮我们获取当前光标在什么位置
-
flush
在写文件的时候我们要养成一个写完文件就刷新的习惯. 刷新flush()
-
read
read()是将文件中所有的内容都读取,read()可以指定我们想要读取的内容数量
read()的弊端就是当文件很大的时候,将文件中的内容全部读取,存放在内存中这样会导致内存奔溃
-
readline
readline()读取每次只读取一行,注意点:readline()读取出来的数据在后面都有一个\n
-
readlines
readlines() 将每一行形成一个元素,放到一个列表中,将所以的内容全部读出来,如果文件很大,占内存,容易崩盘。
操作文件推荐使用以下方法:
-
for line in f: -
print(line) #这种方式就是在一行一行的进行读取,它就执行了下边的功能
-
-
truncate
如果想做截断操作. 记住了. 要先挪动光标. 挪动到你想要截断的位置. 然后再进行截断 关于truncate(n), 如果给出了n. 则从开头进行截断, 如果不给n, 则从当前位置截断. 后面 的内容将会被删除。
修改文件
文件修改: 只能将文件中的内容读取到内存中, 将信息修改完毕, 然后将源文件删除, 将新文件的名字改成老文件的名字.
import os
with open("../path1/小娃娃", mode="r", encoding="utf-8") as f1,
open("../path1/小娃娃_new", mode="w", encoding="UTF-8") as f2:
content = f1.read()
new_content = content.replace("冰糖葫芦", "⼤白梨")
f2.write(new_content)
os.remove("../path1/小娃娃") # 删除源文件
os.rename("../path1/小娃娃_new", "小娃娃") # 重命名新文件
弊端: 对于超大文件,⼀次将所有内容进行读取. 内存溢出. 解决方案: 一行一行的读取和操作
import os
with open("小娃娃", mode="r", encoding="utf-8") as f1,\
open("小娃娃_new", mode="w", encoding="UTF-8") as f2:
for line in f1:
new_line = line.replace("大白梨", "冰糖葫芦")
f2.write(new_line)
os.remove("小娃娃") # 删除源⽂文件
os.rename("小娃娃_new", "小娃娃") # 重命名新文件
路径问题
1、绝对路径
绝对路径有三种使用方法:
反斜杠 ‘\’:由于反斜杠 ‘\’ 要用作转义符, 所以如果要使用反斜杠表示路径,则必须使用双反斜杠。
'C:\\Users\\Administrator\\Desktop\\image\\cork.jpg'
原始字符串 r'':可以使用原始字符串+单反斜杠‘\’的方式表示路径
r'C:\Users\Administrator\Desktop\image\cork.jpg'
斜杠‘/’:为了避免转义符 ‘\’ 和 原始字符串的麻烦,可以直接用 斜杠‘/’,python中是承认‘/’用于路径分割符号的。
`'C:/Users/Administrator/Desktop/image/cork.jpg'`
2、相对路径
./Images 表示当前目录下的 Images文件夹
../Images 表示当前目录的上一层目录下的Images文件夹
/Images 表示,项目根目录
3、资源文件路径问题
图片资源变成rc文件的方法
a、新建一个 .qrc的文件
#像下面一样,把图片资源名字写进qrc文件
<RCC>
<qresource prefix="/" >
<file>cork.jpg</file>
</qresource>
</RCC>
b、将写进qrc的图片文件放进qrc所在文件夹,并在该文件夹下写一个py程序
#运行改程序能把 文件下的qrc文件 转为响应的py文件,在使用图片的程序中 import 由qrc生成py文件即可import os
for root, dirs, files in os.walk('.'):
for file in files:
if file.endswith('.ui'):
os.system('pyrcc4 -o ui_%s.py %s' % (file.rsplit('.', 1)[0], file))
elif file.endswith('.qrc'):
os.system('pyrcc4 -o %s_rc.py %s' % (file.rsplit('.', 1)[0], file))
c、在调用资源图片文件的地方,地址一定要这么写
r':/0102.png'

浙公网安备 33010602011771号