文件:数据存储的设备;持久性的存储数据内容;
文件组成:
文件名(同级目录下,不能有两个相同的文件名)
扩展名(.txt,.docx,.jpg)(不同的扩展名对应不同的文件格式,不同的文件格式有着不同的存储方式,方便程序处理)
文件内容(txt,dox等)
打开文件 (通过一个管道)- 读写(有的管道只可以读,有的写,有的可读可写) - 关闭文件 (拔掉管道)
打开: open(‘文件’,‘模式’)
—文件:指定文件路径
– 模式:
f = open('a.txt','r') #相对路径,当前目录下的指定文件 #f 类似我们加的管道
content = f.read()
print(content) #打印原文件的全部内容--即开始时指针放在了开头
#f.write('123456') 报错,r只能读不能写
f.close() #关闭通道
f = open('b.txt','w')
f.write('123456') #写入内容加在开头,且把原文件内容全部覆盖掉 #无论原内容如何,这个输出只会是123456
#原内容abcdef
#content = f.read() 报错,不能读取
f.close() #关闭通道
f = open('b.txt','w')
f.write('123456') #写入内容加在结尾
#原内容abcde,写入123456,输出:abcde123456
#content = f.read() 报错,不能读取
f.close() #关闭通道
#1,打开(图.jpg)文件,取出内容,获取内容的前面半部分
#1.1打开文件
fromfile = open('xx.jpg','rb') #jpg文件要用rb。因为图片是rgb数转成了二进制数据,不是文本文件
#1.2读取文件内容
formContent = fromfile.read()
#1.3关闭文件
fromfile.close()
#2,打开另外一个文件xx2.jpg,然后,把取出的半部分内容,写入xx2.jpg文件里去
#2.1 打开目标文件
toFile = open('xx2.jpg','wb')
#2.2 写入操作
content = formContent[0:len(formContent)//2] #利用切片进行截取
toFile.write(content)
#1.3关闭文件
toFile.close()
例子:
f = open('a.txt','r+') #a文件中原内容是 abcdefg
c = f.read() #先读后写
print(c) #输出abcdefg
f.write('8888') #a文件内容变成了abcdefg8888
#原因,在读后指针会变到最后!!!!所以不会产生覆盖
当前指针放的位置
f.seek(偏移量,[0,1,2])
f.tell() 查看当前指针位置
f = open('b.txt','r') #原内容:abcde123456
print(f.tell()) #打印出当前指针的位置 输出:0
print(f.read()) #输出:abcde123456
f.seek(2) #从开头开始往后移动两个字节,同f.seek(2,0)
#f.seek(2,1)第二个参数是1--从当前位置出发。2-从结尾位置出发,
# 注意:选1,2 只能是在二进制文件中。类似现在这样的文本文件只能用0
#同时:不是r模式,是rb模式下(把此文件当成二进制文件处理)可以用1,2
print(f.tell()) #输出:2
print(f.read()) #输出:cde123456
f.close()
f.read(字节数) – 从当前文件指针开始,读取字节数n个字节。默认读全文件
f = open('b.txt','r') #要读不能填a与w 原内容123456789
content = f.read(2)
print(content) #输出:12
f.seek(4)
content = f.read(2)
print(content) #输出:56
f.close()
f.readline([limit]) —读取行
f = open('b.txt','r') #原内容1 换行 2 换行 3 换行 4
content = f.readline()
print(content,end="") #输出1
content = f.readline() #读取过程中,指针在变
print(content,end="") #输出2 一行一行的输出
f.close()
f.readlines() —自动处理换行文件,并以列表形式输出
f = open('b.txt','r') #原内容1 换行 2 换行 3 换行 4
content = f.readlines()
print(content)
#输出:['1\n', '2\n', '3\n', '4\n', '5\n', '6']
f.close()
for in 可以遍历f本身与行列表
import collections
f = open('b.txt','r') #要读不能填a与w 原内容123456789
print(isinstance(f,collections.Iterator)) #判断是否是迭代器
# for i in f:
# print(i,end='')#print(i)
content = f.readlines()
for i in content:
print(i,end='')
f.close()
if f.readable():
虽然没有输出,但至少不会报错,即不会影响后续的代码
f = open('b.txt','a') #a不能读
if f.readable():
content = f.readlines()
for i in content:
print(i,end='')
#虽然没有输出,但至少不会报错
f.close()
f.read(字节数)与f.readlines() 全部读取,即全部加载到内存中去了,内存占大,但是下次处理会更快,性能高
f.readline([limit])与for in 节省内存空间,适合文件特别大的时候
f.write() --返回值:写入内容的字节长度
print(f.write(‘abc’)) #输出3
f = open('b.txt','a')
if f.writable():#容错处理
print(f.write('abcd')) #输出4
f.close()
为什么需要关闭?
f = open('b.txt','a')
#一步步调试
f.write('abcd') #执行该语句后,文件还没出现abcd
f.flush() #该语句后,出现abcd
f.close() #不用f.flush()也能让文件出现abcd
os.rename(“old”,‘new’) #修改单极
os.renames(“old”,‘new’) #修改多极
import os
os.rename("b.txt",'bb.txt') #修改文件名b.txt ,改为bb.txt
os.rename("aafirst",'aaone') #修改文件夹aafirst,改为aaone
os.renames('aaone/one.txt','two/two.txt') #修改多级,文件夹与文件名同时被更改
删除文件: os.removw(‘文件路径’)
删除目录:
os.rmdir(path) 不能递归删除目录,如果文件夹非空,会报错
os.removedirs(path) 可以递归的删除目录,如果文件夹非空会报错
os.remove('xx2.jpg') #删除当前目录下的xx2文件
os.rmdir('one/one2') #删除one文件夹下的one2空文件夹
os.removedirs('one/one2') #删除one2文件夹后,继续删除one文件夹
os.mkdir(‘文件夹名称’[,mode]) 不能递归创建
import os
os.mkdir('a')
os.mkdir('b/c') #报错,不能创建多级目录
os.mkdir('b',0o777) #对文件拥护者、同组用户、其他用户都开放了读、写、可执行
mode数字模式权限: 三个7

os.getcwd() – 获得当前路径
os.chdir(‘a’) – 进入当前目录下的a文件夹
print(os.listdir(‘a’)) --列举当前目录下a文件夹里的文件
print(os.listdir(‘./’)) — 列举当前目录下的文件名
print(os.listdir(‘…/’)) – 列举上一级目录的文件名