文章目录
文件操作(IO技术)
1 读取和关闭
文本文件:存储字符的文件 python默认使用unicode(两个字节一个符号,最多可以表示65536)
二进制文件:用“字节”进行存储
创建文件对象open()
f = open(r’d\b.txt’,‘a’)
r 读模式
w 写入,如果文件存在,重写内容(处理字符)
a 追加模式,文件不存在创建,文件存在末尾追加内容
b 二进制模式(处理字节)
‘+’ 读、写模式
- 创建文件对象
- 写入数据
- 关闭文件对象
f.witelines() 把字符串列表写入文件中,不添加换行符
2 中文乱码问题
windows系统默认的编码是GBK,linux默认的UTF-8,python默认的unicode
打开的时候使用GBK,或者建文件的时候就指定
f = open(r’b.txt’,‘w’,encoding=‘utf-8’)
3 close()
try:
f = open(r'c.txt','w')
str = ['aa\n','bb\n','cc\n']
f.writelines(str)
except BaseException as e:
print(e)
finally:
f.close()
4 with(上下文管理器)
s = ['wy\n','wy\n','wy\n']
with open(r'bb.txt','w') as f:
f.writelines(s)
5 文本文件的读取
- read([size]) 默认从文件一开始读到末尾
- readline() 读取一行内容作为结果返回,返回空字符串
- readlines() 每一行作为一个字符串存入列表中,返回该列表
with open('e.txt',encoding='GBK') as f:
for a in f:
print(a,end='')
6 enumerate()
a = ['我love u!\n','仍然\n','哦哦\n']
b= enumerate(a)
print(a)
print(list(b))
c = [ temp.rstrip()+' #'+str(index) for index,temp in enumerate(a)]
print(c)
with open(r'e.txt','r',encoding='GBK') as f:
lines = f.readlines()
lines = [line.rstrip() + ' #' + str(index+1)+'\n'for index,line in enumerate(lines)]
with open('e.txt','w',encoding='GBK')as f:
f.writelines(lines)
I love u! #1
防护额 #2
扶额 #3
7 二进制文件的读取和写入
f = open(r'd:\a','wb')
f = open(r'd:\a','ab')
f = open(r'd:\a','rb')
with open('aa.gig','rb') as f:
with open('aa_copy.gif','wb') as w:
for line in f.readlines():
w.write(line)
print('图片拷贝完成......')
8 文件对象的常用属性和方法
seek 把文件指针移动到新的位置 0:头的位置开始计算,1:从当前位置开始计算,2:从文件尾开始计算
tell 返回文件指针的当前位置
truncate 不论指针在什么位置,只留下指针前size个字节的内容,其余全部删除,如果没有传入size,则当指针当前位置到文件末尾的内容全部删除
with open('e.txt','r',encoding='utf-8') as f:
print('文件名:{0}'.format(f.name))
print(f.tell()) #打印指针位置
print('读取的内容:{0}'.format(str(f.readline())))
f.seek(3)
print('读取的内容:{0}'.format(str(f.readline())))
#运行结果
文件名:e.txt
0
读取的内容:我love u! #1
读取的内容:love u! #1
9 pickle序列化
序列化核心:把对象转化成串行化
import pickle
a1 = 'wy'
a2 = 234
a3 = [10,20,30,40]
with open('data.dat','wb') as f:
pickle.dump(a1,f)
pickle.dump(a2, f)
pickle.dump(a3, f)
with open('data.dat','rb') as f:
b1=pickle.load(f)
b2=pickle.load(f)
b3=pickle.load(f)
print(b1);print(b2);print(b3)
print(id(a1),id(b1))
#运行结果
wy
234
[10, 20, 30, 40]
2986226031024 2986226148720
10 csv文件的操作
用逗号隔开,可以表示表格信息
import csv
with open('csv_3.csv','r',encoding='utf-8-sig') as f:
a_asv = csv.reader(f)
# print(list(a_asv))
for row in a_asv:
print(row)
with open('ee.csv','w') as f:
b_csv = csv.writer(f)
b_csv.writerow(['ID','姓名','年龄'])
b_csv.writerow(['1001','wy','22'])
c = [['1002'],['ji'],['56']]
b_csv.writerow(c)
11 os模块-调用操作系统可执行文件
import os
#os.system('notepad.exe')
#os.system("regedit")
#os.system("ping www.baidu.com")
#os.system('cmd')
#直接调用可执行的文件
os.startfile(r'F:\各种软件\WeChat\WeChat.exe')
12 os模块-文件和目录操作
remove(path)
rename()
stat() #返回文件属性
listdir(path) #返回path目录下的文件和目录列表
mkdir(path) #创建目录
makedirs() #创建多级目录
rmdir() #删除一个目录
removedirs #删除多级目录,目录里面有内容删不了
getcwd() #返回当前工作目录
chdir(path) 把path设为当前工作目录
walk() #遍历目录树
seq #当前操作系统所使用的路径分隔符
import os
###########获取文件和文件夹相关的信息#################
print(os.name) #windows nt linux/unix posix
print(os.sep) #windows \ linux/unix /
print(repr(os.linesep)) #windows \r \n linux/unix \n\
print(os.stat('io_mppy10.py')) #文件的相关信息
###########关于工作目录的操作######################
#print(os.getcwd())
#os.chdir('d:') #改变工作目录为d盘
#os.mkdir('书籍')
##########创建目录,创建多级目录,删除################
#os.mkdir('书籍')
#os.rmdir('书籍') #相对路径都是相对于当前的工作目录
#os.makedirs('电影/港台/周星驰')
#os.removedirs('电影/港台/周星驰') #只能删除空目录
#os.makedirs('../音乐/港台/刘德华') #../上一级目录
#os.removedirs('../音乐/港台/刘德华')
#os.remove('电影','movie')
dirs = os.listdir('movie')
print(dirs)
13 os.path
import os
import os.path
print(os.path.isabs('d:/a.txt'))
print(os.path.isdir('d:/'))
print(os.path.isfile('d:/a.txt'))
print(os.path.exists('d:/a.txt'))
##########获得文件基本信息###############################
print(os.path.getsize('b.txt')) #字节数
print(os.path.abspath('b.txt')) #获得绝对路径
print(os.path.dirname('b.txt'))
print(os.path.getctime('b.txt')) #文件创建时间
print(os.path.getatime('b.txt')) #文件最近访问时间
print(os.path.getmtime('b.txt')) #文件最近修改时间
##########对路径的操作###############################
path = os.path.abspath('b.txt')
print(os.path.split(path))
print(os.path.splitext(path))
print(os.path.join('aa','bb','cc'))
import os
path = os.getcwd()
file_list = os.listdir(path) #列出子目录,子文件
print(file_list)
for filename in file_list:
if filename.endswith('py'):
print(filename,end='\t')
print('\n'+'############################')
file_list2 = [filename for filename in os.listdir(path)if filename.endswith('py')]
for f in file_list2:
print(f,end='\t')
14 walk()递归遍历所有文件和目录
os.walk()方法:
返回一个3个元素的元组,(dirpath,dirnames,filenames)
dirname:列出指定目录的路径
dirnames:目录下的所有文件夹
filenames:目录下的所有文件
import os
all_files =[]
path = os.getcwd()
list_files = os.walk(path)
for dirpath,dirnames,filenames in list_files:
for dir in dirnames:
all_files.append(os.path.join(dirpath,dir))
for file in filenames:
all_files.append(os.path.join(dirpath,file))
print(all_files)
15 shutil模块(拷贝和压缩)
import shutil
#shutil.copyfile("1.txt",'1_copy.txt')
#shutil.copytree('movie/港台','电影') #拷贝到的目录不能提前存在
shutil.copytree('movie/港台','电影',ignore=shutil.ignore_patterns('*.txt','*.html'))
import shutil
import zipfile
#拷贝
#shutil.copyfile("1.txt",'1_copy.txt')
#shutil.copytree('movie/港台','电影') #拷贝到的目录不能提前存在
#shutil.copytree('movie/港台','电影',ignore=shutil.ignore_patterns('*.txt','*.html'))
#压缩
#shutil.make_archive('电影/gg','zip','movie/港台')
#z1 = zipfile.ZipFile('a.zip','w')
#z1.write('1.txt')
#z1.write('1_copy.txt')
#z1.close()
#解压缩
z2 = zipfile.ZipFile('a.zip','r')
z2.extractall('电影')
z2.close()
16 递归算法
递归基本思想:自己掉自己
递归头+递归体
num = 1
def a1():
global num #函数内改变全局变量的值
num += 1
print('a1')
if num <3:
a1()
def b1():
print('b1')
a1()
def factorial(n):
if n==1:
return n
else:
return n*factorial(n-1)
print(factorial(5))
import os
allfiles = []
def getAllFiles(path,level):
childFiles = os.listdir(path)
for file in childFiles:
filepath = os.path.join(path,file)
if os.path.isdir(filepath):
getAllFiles(filepath,level+1)
allfiles.append('\t'*level + filepath )
getAllFiles('test_os',0)
for f in reversed(allfiles):
print(f)