Python——文件操作
文件操作
一. 计算机编码和解码
我们都知道,计算机只能识别0和1, 但是它是如何将我们输入的内容展示出来的呢?
1.1 编码表
1.2 编码
gbk
编码encode就是把人类语言转成计算机语言。
print('你好'.encode('gbk')) # b'\xc4\xe3\xba\xc3'
gbk汉字内码扩展规范编码表
http://ff.163.com/newflyff/gbk-list/
utf-8
print('你好'.encode('utf-8')) # b'\xe4\xbd\xa0\xe5\xa5\xbd'
查看字符编码
http://www.mytju.com/classcode/tools/encode_utf8.asp
1.3 解码
解码decode就是把计算机语言转成人类语言。
print(b'\xc4\xe3\xba\xc3'.decode('gbk')) # 你好
print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf-8')) # 你好
注意 :
decode()默认是utf-8
**之前是什么编码方式 ,解码的话也要按照什么方式来解码
如果出现乱码时 : 那么编码方式不是gbk 就是utf-8
二. 绝对路径和相对路径
2.1 绝对路径
'C:\Users\Administrator\Desktop\Python编程讲义\课件\06 函数综合应用 名片管理系统'
2.2 相对路径
'./测试.txt'
'测试.txt'
三. 文件的读写
什么是文件 ?
总结:文件操作的作用就是把一些内容(数据)存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。
文件的基础操作
- 打开文件
- 读写等操作
- 关闭文件
3.1 打开
在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下:
open(name, mode)
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读、写入、追加等。
模式 | 描述 |
---|---|
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
写入
# 打开文件
f = open('ceshi.txt','w',encoding= 'utf-8')
# 写入文件
f.write('这是测试的文件,相对路径')
# 关闭文件
f.close()
# 打开文件 注意转义 比如\n
f = open(r'C:\Users\Administrator\Desktop\Python编程讲义\课件\07 文件操作\ceshi.txt','w')
# 写入文件
f.write('这是测试的文件,绝对路径')
# 关闭文件
f.close()
# 追加
f = open('ceshi.txt','a',encoding= 'utf-8')
f.write('\n')
f.write('这是测试的文件,相对路径1111')
f.close()
注意 :
- open函数默认的编码格式是 比如Window上默认字符编码为GBK,Linux上默认字符编码为UTF-8。
w
和a
模式:如果文件不存在则创建该文件;如果文件存在,w
模式先清空再写入,a
模式直接末尾追加。r
模式:如果文件不存在则报错。
转义
为什么转义 ? 比如 \n
代表的是换行, 但是在绝对路径中有的是 D:\\nxxx\\txxx\\x1
此时 电脑以为你要换行 ,
但是你认为是一个nxxx的一个文件夹 ,导致出现歧义 ,必须统一所以 ,才有转义这个概念
在windows中编写路径时,一般有两种方式:
- 加转义符,例如:
"D:\\nxxx\\txxx\\x1"
- 路径前加r,例如:
r"D:\\nxxx\\txxx\\x1"
3.2 读取
read()
f = open('ceshi.txt','r',encoding= 'utf-8') # r表示读取
print(f.read())
f.close()
#这是测试的文件,相对路径这是测试的文件,相对路径1111
#这是测试的文件,相对路径1111
readlines()
f = open('ceshi.txt','r',encoding= 'utf-8')
print(f.readlines())
f.close()
# ['这是测试的文件,相对路径这是测试的文件,相对路径1111\n', '这是测试的文件,相对路径1111']
readline()
f = open('ceshi.txt',encoding='utf-8')
line = f.readline() # 打印第一行
print(line)
f = open('ceshi.txt','r',encoding='utf-8')
content = f.readline()
print(f'第一行:{content}')
content = f.readline()
print(f'第二行:{content}')
# 关闭文件
f.close()
3.3 with
之前对文件进行操作时,每次都要打开和关闭文件,比较繁琐且容易忘记关闭文件。
以后再进行文件操作时,推荐大家使用with上下文管理,它可以自动实现关闭文件。
with open('ceshi.txt') as fp :
line = fp.readline()
print(line)
line = fp.readline()
print(line)
# 好处 简洁和不用手写close函数 因为已经自己默认关闭了
#文件的写操作
with open('output_filename.csv', 'w') as f:
f.write('hello world')
3.4 案例
def find_answer(question):
with open('replay.txt', 'r', encoding='utf-8') as file:
while True:
line = file.readline()
if not line:
break
# 字符串的分割
keyword = line.split('|')[0] # 订单
replay = line.split('|')[1] # 订单的回复
if keyword in question:
return replay
return False
# file = open('replay.txt', 'r', encoding='utf-8')
# while True:
# line = file.readline()
# if not line:
# break
# # 字符串的分割
# keyword = line.split('|')[0] # 订单
# replay = line.split('|')[1] # 订单的回复
# if keyword in question:
# return replay
# file.close()
# return False
if __name__ == '__main__':
question = input('您好,有什么烦恼可以和我说下:')
while True:
if question == 'bye':
break
replay = find_answer(question)
if not replay:
question = input('没有您的问题 ,您可以问下关于订单,物流,账户,支付等问题(退出请输入bye)')
else:
print(replay)
question = input('您可以再问下关于订单,物流,账户,支付等问题(退出请输入bye):')
print('小主再见!')
# txt文本内容
replay.txt
订单|您有问题可以登录淘宝,点击我的订单,查看详情
物流|您有问题可以点击物流详细信息,来进行查询物流
账户|关于账户的问题问人工客服,电话: 1999999999
支付|去找马云爸爸吧
s = '五 花 八门、\n'
print(s.split())
with open('words.txt', 'r') as fr :
print(fr.readlines())
for text in fr.readlines():
pass
# print(text.strip("\n")) #
# print(list(text.strip("\n")))第一行\n是去掉了 ,第二行去掉\n变成空
with open('words.txt', 'r') as fr, open('new.txt', 'w') as fd:
for text in fr.readlines():
print(text.split())
if text.split():
fd.write(text)
"""
易错点 :
1: write在写入的时候 , 不换行,但是为啥在这就换行 ?
2: if [] :
pass # 这行代码是不执行的,因为是空列表
3: readlines 是返回一个列表形式,注意区别
4: text.split() ,默认是去掉换行把空格进行分隔 分成列表的形式
5: 特别注意:写入的时候 text不是单纯地字符串,还有'\n' ,debug的时候可以看到
所以才write写入时候,会发生换行
思想 :
1: 因为原来的数据,有空行(这个需要去掉)
2: 需要读出来,再重新写入一个新的文件或者覆盖源文件
"""
四. 二进制文件操作
数据库文件、图像文件、可执行文件、音视频文件、Office文件等都是二进制文件,不能使用文本编辑进行正常读写,必须对其序列化才能读写
4.1 使用pickle模块
import pickle
f=open('samle_pickle.dat','wb')
n=7
i=13.000000
a=99.056
s='中国公民 123abc'
lst=[[1,2,3],[4,5,6],[7,8,9]]
tu=(-5,10,8)
coll={4,5,6}
dic={'a':'apple','b':'banana','g':'grade','o':orange}
try:
pickle.dump(n,f)
pichle.dump(i,f)
pickle.dump(a,f)
pickle.dump(s,f)
pickle.dump(lst,f)
pickle.dump(tu,f)
pickle.dump(coll,f)
pickle.dump(dic,f)
except:
print('写文件异常')
finally:
f.close
4.2 使用struct模块
import struct
n=13000000000
x=96.33
b=True
s='fuugwgu中国'
sn=struct.pack('if?',n.x.b)
f.open('sample_struct.dat','wb')
f,write(sn)
f.write(s)
f.close()
五. 文件级与目录操作
如果需要处理文件路径,可以使用os.path模块中的对象和方法;如果需要使用命令行读取文件内容可以使用fileinput模块;创建临时文件和文件夹可以使用tempfile模块
5.1 os与os.path模块
这里随便举一个例子,os模块是一个很强大的模块,后续还会进行讲解
#将当前目录的所有.html文件重命名为.htm
import os
file_list=os.listdir('.')
for filename in file_list:
pos=filename.rindex('.')
if filename[pos+1]:=='html'
newname=filename[:pos+1]+"htm"
os.rename(filename,newname)
print(filename+"更名为"+newname)
目录操作
import os
os.getcwd() #返回当前工作目录
os.mkdir(os.getcwd()+'\\temp') #创建目录
#遍历目录
import os
def visitDir():
for filename in names:
print(os.path.jion(dirname,filepath))
os.path.walk('C:\\music',visitDir())
5.2 shuil模块
复制文件
import shuil
shuil.copyfile('C:\\dir.txt','C:\\dir1.txt')
#压缩文件,将C:\\python\shu文件夹以及该文件夹中所有文件压缩值D:\\a.zip
shuil.make_archive('D:\\a','zip','C:\\python','shu')