IO在计算机中指的是Input/Output,也就是输入输出。凡是用到数据交换的地方,都会涉及IO编程。在IO编程中,Stream(流)是一种重要的概念,分为输入流( Input Stream)和输出流( Output Stream)。
1 文件读写
1.1 文件打开
open (文件路径,打开模式,编码方式)
1)文件路径:
绝对路径:从盘符开始到具体文件具体路径,如:C:/abc?1.txt
相对路径:以操作的程序文件所在路径为参照物
标记: . 当前文件所在目录
.. 当前文件所在上一级目录
路径分隔符: \\ / ,使用 'r' 标记(r'\text\a\a\a')
2) 打开模式:
字符形式 r --只读 w --只写 ,先清空再写入 a --只写,续写
字节 rb wb ab
写时不存在会创建一个文件
3) 编码方式:
字节不需编码
1.2 文件读取
f = open(r'c:\a.txt')
f.read() 读全部
f.read(10) 指针标到10,再读在指针之后
f.readline() 读取文本文件
f.readlines() 读取所有的行f.close()
由于文件操作可能会出现IO异常,一旦出现IO异常,后面的close()方法就不会调用,所以可以使用try方法:
try:
f = open (r 'c:\text.txt','r')
print(f.read())
finally :
if f:
f.close ()
或者使用with语句,自动调用close()方法关闭文件
with open('/path/to/file', 'r') as f:
f.read()
如小文件可以直接采取read()方法读到内存,大文件更加安全的方式是连续调用read(size):
src_path = r'.\01.jpg'
if os.path.exists(src_path):
filename = os.path.basename(src_path)
desc_path = os.path.join(r'.\img',filename)
with open(src_path,'rb') as read_han,open(desc_path, 'wb') as write_han:
file_size = os.path.getsize(src_path)
has_read = 0
read_size = 1024
while has_read <= file_size:
data = read_han.read(read_size)
has_read += read_size
write_han.write(data)
write_han.flush()
print('文件拷贝成功')
else:
print('未找到源文件')
而对于配置文件等文本文件,使用readline()方法更加合理:
with open(r'c:\textlqiye.txt','r ') as fileReader:
for line in fileReader.readlines () :
print line.strip ( )
1.3 文件写入
写文件和读文件是一样的,唯一的区别是在调用open方法时,传入标识符'w'或者'wb'。
write()方法和read()方法对应,是将字符串写入到文件中。write()方法不用写换行符/n。
writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符。
2 操作文件和目录
OS模块提供了访问操作系统服务和操作文件目录的功能。
2.1 OS操作文件目录
获得当前Python脚本工作的目录路径:os.getcwd()。
返回指定目录下的所有文件和目录名:os.listdir()。os.listdir("C:\l"")
删除一个文件:os.remove(filepath)。
删除多个空目录:os.removedirs(r"d:\python")。
检验给出的路径是否是一个文件:os.path.isfile(filepath)
检验给出的路径是否是一个目录:os.path.isdir(filepath)。
判断是否是绝对路径:os.path.isabs()。
检验路径是否真的存在:os.path.exists)。
分离一个路径的目录名和文件名:os.path.split()。
分离扩展名: os.path.splitext()。
获取路径名: os.path.dirname(filetpah)。
获取文件名: os.path.basename(filepath)。
重命名文件或者目录:os.rename(old,new)。
重命名文件或者目录:os.rename(old,new)。
创建多级目录:os.makedirs(r"c:\python\test")。
创建单个目录:os.mkdir("test")。
获取文件属性:os.stat(file)。
修改文件权限与时间戳: os.chmod(file)。
获取文件大小:os.path.getsize(filename)。
删除目录: os.rmdir("dir"),只能删除空目录;
shutil.rmtree("dir"),空目录、有内容的目录都可以删。
2.2 OS操作系统服务
os.sep —————————————————可以取代操作系统特定的路径分隔符。windows下为 “\\”
os.name ————————————————正在使用的平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'。
os.getcwd()—————————————函数得到当前工作目录,即当前Python脚本工作的目录路径。
os.getenv()—————————————获取一个环境变量,如果没有返回none
os.putenv(key, value)———设置一个环境变量值
os.system(command)——————函数用来运行shell命令。
os.linesep——————————————给出当前平台使用的行终止符。例如,Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'。
3 序列化操作
程序运行时,所有变量都在内存中,程序一结束或意外中断,程序中的内存变量都会被操作系统进行回收。
把内存中的变量变成可存储或可传输的过程,就是序列化;把变量内容从序列化的对象重新读取到内存,就是反序列化。
在Python中提供了两个模块:cPickle和 pickle来实现序列化:
try:
import cPickle as pickle
except ImportError :
import pickle
d = dict (url= 'index.html ' ,title='首页', content='首页')
f = pickle.dumps(d)#dumps方法可以将任意对象序列化成str
print(f)
v = pickle.loads(f)
print(v)
#使用dump方法,可以将序列化后的对象直接写入文件中
f=open (r'E:\dump.txt','wb ')
pickle.dump(d,f)
f.close()
f=open (r'E:\idump.txt','rb')
d=pickle.load(f)
f.close ( )