前言
IO就是输入流和输出流,概念在java里写过了不写了。
在py中io操作那真是相当的简单,回想起java的io那真是太痛苦了,哈哈。
介绍
文件读写(字符流)
关于文件可以直接操作字节流和字符流了。
先通过open函数以不同模式打开文件对象,默认是只读模式’r’,在本案例中是读取了文件全部内容。
# 读取文件中的内容(字符)
try:
f = open("c:/aaa.txt", 'r')
print(f.read())
except IOError as e:
print(e)
finally:
f.close() # 最后关闭释放资源
'''
abcdefghijk
ad
fff
'''
也可以一行一行的读取(如读取配置文件的情况下)
try:
f = open("c:/aaa.txt", 'r')
while True:
s = f.readline()
if s == '':
break
print(s.strip())
except IOError as e:
print(e)
finally:
f.close()
'''
abcdefghijk
ad
fff
'''
因为io异常需要捕捉太麻烦了,可以用with as语句代替,并且不用写close方法了。
这里顺便介绍写东西到文件,只需要将读文件模式改为写模式:
# 只写模式(字符串)
with open("c:/aaa.txt", "w", encoding="gbk" ,errors='ignore') as f:
f.write("aaa")
注意:
- 这里的’w’模式是覆盖的写,如果想要追加应该用’a’模式。
- 文件的读写默认是utf-8格式,如果写入其他格式需要用encoding改写格式。
文件读写(字节流)
以上是将文本文件的内容通过字符流进行读写,但是如果是视频或图片之类的就需要字节流了,实际上字符流的本质也就是字节流,我们还是可以通过open函数完成字节流的读写的。
with open(r"C:\Users\Administrator\Pictures\tutu\java.png", "rb") as f:
print(f.read())
# feJ\x8f\xc1\x83e\x87\x0f?\xa6>O?\xf9-\xcd2{\xf8\xb5\x98\xf7\xe6,代码太多不写了
b,就是byte,通过’rb’读取字节流的方式读取图片。注意:这里直接复制用的图片的路径所以记得使用转义字符。
再写一个案列,复制文件;当时写的时候我还想能不能r模式和w模式放在一起,结果自然是不行的啦!应该这样写:
with open("c:/aaa.txt", "rb") as f:
with open("c:/ok.txt", "wb") as of:
of.write(f.read())
StringIO、BytesIO
从内存中读写字符和字节;
from io import StringIO
f = StringIO()
f.write("aa")
f.write("ccc")
l = f.getvalue()
print(l) # aaccc
f = StringIO(l)
print(f.read()) # aaccc
在BytesIO中要写入字节,需要规定encode
from io import BytesIO, StringIO
f = BytesIO()
f.write("aa".encode("utf-8"))
l = f.getvalue()
print(l) # b'aa'
f = BytesIO(l)
print(f.read()) # b'aa'
目录与文件
通过os和os.path模块我们可以操作文件和目录
import os
print(os.path.abspath('.')) # 获取当前的绝对路径,如D:\workspace(python)\Test1\example
os.chdir("c:/") # 切换路径
print(os.listdir('.')) # 获取当前路径下的文件
print(os.path.isfile("c:/aaa.txt")) # 判断当前文件对象是否为文件,True
print(os.path.isdir("c:/aaa.txt")) # 判断当前文件是否为文件夹,False
l=os.path.join("c:/","/newdir")
print(l) # join拼接目录 #c:/newdir
os.mkdir(l) # 创建文件夹
os.rmdir(l) # 删除一个文件夹
os.rename("c:/aaa.txt","c:/abc.txt") # 重命名文件
os.remove("c:/ok.txt") # 删除文件
这里写一个遍历目录下所有文件的例子(非常简陋,也没非空判断)
# 遍历文件
def listFile(filepath):
for x in os.listdir(filepath):
if os.path.isfile(os.path.join(filepath, x)):
print(x)
else:
listFile(os.path.join(filepath, x))
f = listFile(r"c:/aaa")
总结
py的IO相比java真是简单,os功能也好强大