文章目录
- 一、file文件操作
- (一)文本文件和二进制文件
- (二)文件操作相关模块概述
- (三)创建文件对象open()
- (四)文本文件的写入
- 1.基本的文件写入操作
- 2.中文乱码问题
- (五)关闭流要点
- 1.try异常管理
- 2.with语句(上下文管理器)
- (六)文本文件的读取
- (七)enumerate()函数和推导式生成列表
- (八)(二进制文件)图片文件的拷贝
- (九)文件对象常用方法和属性的总结
- (十)使用pickle实现序列化和反序列化
- (十一)csv文件的读取和写入
- 二、os模块
- 三、shutil模块(拷贝和压缩)
一、file文件操作
(一)文本文件和二进制文件
- 文本文件:存储的是“字符”文本,python默认为unicode字符集。
- 二进制文件:将数据内容用“字节”进行存储,无法用记事本打开。
(二)文件操作相关模块概述
(三)创建文件对象open()
- 基本语法格式:open(文件名[,打开方式])
- 打开方式有下图几种:
- 注:文件名可以输入全路径,比如:D:\a\b.txt;也可以使用原始字符串:r"d:\b.txt"
- 例子:open(r"d:\a.txt",“a”)
(四)文本文件的写入
1.基本的文件写入操作
- 创建文件对象
- 写入数据
- 关闭文件对象
f=open(r"a.txt","a")
s="hello"
f.write(s)
f.close()
2.中文乱码问题
当用以下程序向文件中写入中文时,文件会出现乱码
f=open(r"a.txt","a")
s="你好"
f.write(s)
f.close()
Linux操作系统默认的编码是utf-8,utf-8可以看做是unicode的实现。
windows操作系统默认的编码是GBK
python默认的编码是unicode
由于编码和解码需要是同一种编码方法,所以在python中打开文件f=open,输入中文f.write并关闭文件f.close,然后查看建成的txt文件时,需要右键->file Encoding->GBK,才能将乱码转为中文。
(五)关闭流要点
1.try异常管理
用try…finally语句确保文件无论在何种情况下,都能关闭
try:
f=open(r"b:\a.txt","a")
str="hello" #或str=["aaa\n","bbb\n","ccc\n"]
f.write(str) #或f.writeline(str) 用于写入字符串列表
except BaseError as e:
print(e)
finally:
f.close()
2.with语句(上下文管理器)
with执行完语句块后,会自动还原操作环境,因此能够确保文件的正确关闭。
s=['gao','kk']
with open(r"d:\a.txt","a") as f:
f.writeline(s)
(六)文本文件的读取
- read([size]):从文件中读取size个字符,并作为字符返回。若不指定size,则会读取整个文件。
- readline():读取一行内容作为结果返回。
- readlines():每一行作为一个字符串存入列表中,并返回该列表。
#读取文本内容
with open(r"a.txt","r",encoding="GBk") as f:
str=f.read()
print(str)
#按行读取一个文件
with open(r"a.txt","r",encoding="utf-8") as f:
while True:
fragment=f.readline()
if not fragment: #读取行内容为空
break
else:
print(fragment,end='') #不写end=‘’,那么执行print后,就会自动空一行
#按行读取一个文件(使用迭代器)
with open(r"a.txt","r") as f:
for a in f:
print(a,end='')
(七)enumerate()函数和推导式生成列表
将文件中的每一行加上行号,例如将[“i love you”,“爱你”],变成[“i love you #0”,“爱你 #1”]
>>>a=["i love you","爱你"]
>>>b=enumerate(a)
>>>print(list(b))
[(0,"i love you"),(1,"爱你")]
>>>c=[temp+"#"+str(index) for index,temp in enumerate(a)]
>>>c
["i love you #0","爱你 #1"]
with open(r"a.txt","r",encoding="utf-8") as f:
lines=f.readlines() #把文件中每一行的信息读取到lines中,并返回一个列表
c=[temp.rstrip()+" #"+str(index) for index,temp in enumerate(lines)] #把列表lines中的每一行信息加上行号,再组成一个列表
with open("e.txt","w",encoding="utf-8") as f:
f.writelines(c)
(八)(二进制文件)图片文件的拷贝
with open("aa.gif","rb") as f: #打开aa图片
with open("aacopy.gif","wb") as w: #新建图片
for line in f.readline(): #读取aa中的内容
w.write(line) #将每一行的内容写入到新建的文件中
(九)文件对象常用方法和属性的总结
with open("a.txt","r",encoding="utf-8") as f:
print("文件的名字是:{0}".format(f.name))
print(f.tell()) #返回当前指针在文件中的位置
print("文件的内容是:{0}".format(str(f.readline())) #读取一行内容
f.tell()
f.seek(5,1) #从当前位置向后偏移5个位移量
print("文件的内容是:{0}".format(str(f.readline()))
(十)使用pickle实现序列化和反序列化
通过实现对象的序列化和反序列化,可以将内存块的数据保存到硬盘上,或通过网络传输给其他计算机。
序列化:将对象转化成为“串行化”数据形式;
反序列化:将“串行化”数据形式转化成为对象。
(把信息变成一串,需要的话,就像流水一样转到其他地方,再将一串数据复原)
pickle.dump(obj,file)
pickle.load(file)
#将信息序列化
import pickle
with open(r"d:/data.dat","wb") as f: #拓展名(这里是.dat)可以随便起,没有也可以。不过这里一定是wb,表示写入二进制文件
a1='hello' #假设有很多信息
a2=20
a3=[20,50]
pickle.dump(a1,f) #将信息分别存入文件中
pickle.dump(a2,f)
pickle.dump(a3,f)
#反序列化
with open(r"d:/data.dat","rb") as f:
b1=pickle.load(a1,f) #按照存入的顺序,再分别取出
b2=pickle.load(a2,f)
b3=pickle.load(a3,f)
print(b1);print(b2):print(b3) #这里a1和b1是两个不同的对象
(十一)csv文件的读取和写入
csv文件是excel表格的简单版,里面的值没有类型,都是字符串。
import csv
#读取csv文件
with open("dd.csv","r") as f:
a_csv=csv.reader(f)
for i in a_csv:
print(list(i))
#写入csv文件
with open("ee.csv","w") as f:
b_csv=csv.writer(f)
b_csv.writerow(['ID','NAME'])
b_csv.writerow(['10020','judy'])
c=[['10021','edision'],['10023','mandy']]
b_csv.writerows(c)
二、os模块
os模块可以帮助我们对操作系统进行操作,比如直接操作文件、目录等等。
- os调用操作系统文件和命令
#使用os.system调用windows系统的记事本程序
import os
os.system("notepad.exe")
#使用os.system查看是否能够连接(ping)百度网页
import os
os.system("ping www.baidu.com")
- os调用可执行的文件
os.startfile(r"C:\Program Files (x86)\Tencent\WeChat\WeChat.exe")
注1:os.rename(“电影”,“movie”) 将电影重新命名为movie
注2:os.listdir(‘movie’) 列出movie下的所有一级子目录
注3:rmdir和removedirs只能删除空目录
注4:os.makedirs("…/音乐/周杰伦") …/指的是在上一级目录中建立新的目录
import os
import os.path #from os import path
#------判断:绝对路径、是否目录、是否文件、文件是否存在-----------
print(os.path.isabs('d:/a.txt'))
print(os.path.isdirs('d:/a.txt'))
print(os.path.isfile('d:/a.txt'))
print(os.path.exists('d:/a.txt'))
#-------------获得文件基本信息-----------
print(os.path.getsize('d:/a.txt'))
print(os.path.abspath('d:/a.txt'))
print(os.path.dirname('d:/a.txt'))
print(os.path.getatime('d:/a.txt')) #这里返回的是从1970年到现在的总毫秒数
print(os.path.getmtime('d:/a.txt'))
#-------------对文件路径做操作-----------
path=os.path.abspath('d:/a.txt')
print(os.path.split(path)) #以文件名为分界点对路径进行切割,然后放在元组内返回
print(os.path.splitext(path)) #以拓展名为分界点对路径进行切割,然后放在元组内返回
print(os.path.join('a','b','c')) #a\b\c
练习
#列出指定目录下的所有.py文件,并输出文件名
import os
path = getcwd()
file_list = os.listdir(path) #返回当前文件夹下所有的目录和文件
for file_name in file_list:
if file_name.endwith('py'):
print(file_name)
#--------------用列表推导式生成列表------------------
list_file=[file_name for file_name in file_list if file_name.endwith('py')]
for file_name in list_file:
print(file_name,end='\t') #打印列表
- work()递归遍历所有文件和目录
os.walk()返回一个3个元素的元组,(dirpath,dirnames,filenames)-> (指定目录的路径,路径下所有文件夹,路径下所有文件)
#coding=utf-8
list=[]
import os
path=os.getcwd()
list_files=os.walk(path)
for dirpath,dirnames,dirfiles in list_files:
for dir in dirnames:
list.append(os.path.join(dirpath,dir))
for file in dirfiles:
list.append(os.path.join(dirpath,file))
for f in list:
print(f)
三、shutil模块(拷贝和压缩)
shutil模块主要用来做文件的拷贝、压缩和删除。
import shutil
#----------------拷贝---------------------
shutil.copyfile("1.txt","1.copy.txt")
shutil.copytree("movie/港台","电影",ignore=shutil.igore_patterns("*.html")) #将movie/港台底下的所有东西,拷贝到目录“电影”中,但不拷贝拓展名为html的文件
#----------- ----压缩-----------------------
shutil.make_achieve("电影/gg","zip","movie/港台") #将港台压缩成gg.zip,放在电影文件夹下
#将1.txt和1.copy.txt压缩成a.zip,w表示写入模式
z1=zipfile.ZipFile("d:/a.zip","w")
z1.write("1.txt")
z1.writ("1.copy.txt")
z1.close()
#将a.zip解压缩到“电影”文件夹下,r表示读取模式
z2=zipfile.ZipFile("d:/a.zip","r")
z2.extractall("电影")
z2.close()