一、磁盘文件
1.1 打开、关闭磁盘文件
(1)open()函数
文件对象=open(文件名,访问模式='r',缓冲方式='-1')
#以'w+'模式打开文件,再写入内容并读出
myfile=open('d:\\firstfile.txt','w+')
myfile.write('my firstfile\n')
myfile.write('hello cc\n')
myfile.seek(0,0)
for eachline in myfile:
print eachline
myfile.close()
文件访问模式:
r | 以读取方式打开文件 |
rU或U | 读取方式,同时提供通用换行符支持 |
w | 写入 |
a | 追加 |
r+ | 读写 |
w+ | 读写 |
a+ | 读写 |
rb | 二进制读取 |
wb | 二进制写入 |
ab | 二进制追加 |
rb+ | 二进制读写 |
wb+ | 二进制读写 |
ab+ | 二进制读写 |
1)使用'r'、'U'、'r+'、'rb+'模式打开的文件必须已经存在,否则报错
2)使用'w'、'w+'、'wb'、'wb+'模式打开的文件,若不存在则自动创建,若存在则清空再写入
3)使用'a'、'a+'、'ab'、'ab+'模式打开的文件,若不存在则自动创建,若存在则在文件末尾追加,即使使用seek()移动文件指针也会追加到末尾
4)文件路径:d:\\myfile.txt 或 r'd:\myfile' 或 d:/myfile.txt
(2)file()函数
建议打开文件进行操作时使用open()函数,处理文件对象时使用file()函数
(3)close()函数
(4)with语句
引入with语句保证退出时调用close()函数
with open(r'd:\myfile.txt','w') as myfile:
myfile.write('hello\n')
myfile.write('cc\n')
等价于:
myfile=open(r'd:\myfile.txt','w')
try:
myfile.write('hello\n')
myfile.write('cc\n')
finally:
myfile.close()
1.2 写文件
(1)write()函数
写字符串
(2)writelines()函数
写字符串列表
listh=['天中','一','你说呢','螃中尼']
myfile.writelines(listh)
1.3 读文件
(1)read()函数
read([size])
(2)readlines()函数、readline()函数
readline()函数读取一行,包含结束符
readlines()函数读取所有行,返回值为一个字符串列表
myfile=open(r'd:\myfile.txt','r')
yu=myfile.readlines()
for eachline in yu:
print eachline
myfile.close()
输出结果中间有两次换行,这是因为读出的字符串本身带有换行符,而print后面没有“,”,也自动换行导致的。可以改成:
print eachline,
这样就不会多换行了。
(3)文件迭代
文件对象也是迭代器,前面的代码可以写成:
myfile=open(r'd:\myfile.txt','r')
#yu=myfile.readlines()省略
for eachline in myfile:
print eachline
myfile.close()
1.4 文件指针操作
seek(偏移量[,相对位置])
seek()用于移动文件指针到不同的位置,相对位置默认为0,表示从开头算起,1表示当前位置,2表示末尾。
tell()用于检测文件指针的位置。
偏移量的单位为字节。
二、StringIO类文件
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。
文件处理接口不仅能处理磁盘文件,其中的处理函数还可用于与文件对象类似的对象,凡是提供了read()和write()这两个面向文件操作函数的对象,被统称为类文件对象(file-like Object)。
python的标准库中有许多类文件,如sys.stdin、sys.stdout、sys.stderr。sys.stdin(标准输入)为解释器提供输入字符流,sys.stdout(标准输出)接收print语句的输出。sys.stderr(标准错误)接收出错信息。sys.stdin通常被映射到用户键盘输入;stdout和stderr产生屏幕输出。
StringIO就是在内存中创建的fili-like Object,经常被用来作字符串的缓存,即StringIO能将内存数据当成文件来操作。因为StringIO的一些接口和文件操作是一致的,也就是说同样的代码,可以同时当成文件操作或者StringIO操作。
2.1 创建StringIO类文件
使用构造函数StringIO()创建StringIO类文件。
Python2:
import StringIO as sio
f=sio.StringIO()
ff=sio.StringIO("StringIO Example\n")
Python3:
from io import StringIO
f=StringIO()
ff=StringIO("StringIO Example\n")
2.2 读写StringIO类文件
读写StringIO文件与读写普通磁盘文件类似
import StringIO as sio
ff=sio.StringIO()
#写入一行
ff.write('have a nice day\n')
#写入多行
ff.writelines(['well begun is half done\n','every thing is ok\n'])
ff.read()#此时因为指针在文件末尾,所以读出空字符
#移到指针到文件头
ff.seek(0,0)
ff.read()#读出所有内容
ff.seek(0,0)
#读出第一行
ff.readline()
#读出剩余行
for eachline in ff.readlines():
print eachline,
可以看到,使用read()比较费劲,为了便于获取内存文件的内容,StringIO提供了getvalue()函数,这样就不用再移动指针了。
2.3 使用StringIO模块捕获输出
通常,输出是默认输出到显示器,但是通过修改标准文件sys.stdout,可以将标准输出改为输出到内存。
#将print输出的内容先输入到内存,检查并替换后再输出到显示器
import sys
import StringIO as sio
f=sio.StringIO()
stdout=sys.stdout
#将标准输出改为输出到内存
sys.stdout=f
print 'matlab'
print 'c++'
print 'computer'
print 'java'
#在内存中进行替换
strf=f.getvalue().replace('computer','python')
#标准输出到显示器
sys.stdout=stdout
print u'原始输出'
print f.getvalue()
print u'替换后输出'
print strf
f.close()
三、文件系统操作
文件操作中,除了读写文件,还会用到其他功能,如删除文件、重命名文件、创建目录、删除目录、遍历目录树、管理文件访问权限、管理文件路径等。python中的os模块和os.path模块可以完成这些操作。
3.1 os模块
os模块提供了Python访问操作系统功能的主要接口,其实os模块只是包装了不同操作系统的通过接口,用户可以使用相同的函数接口,操作不同的操作系统,并返回相同的结果。不同的操作系统,真正加载的模块不同。
#使用name属性查看加载的模块
import os
os.name#‘nt'
(1)os模块的跨平台属性
不同的操作系统间有很多差异,如不同操作系统所支持的分隔符不同,在Python中,程序员不需要考虑这些差异,os模块提供了相应的跨平台属性。
os模块属性 | 描述 |
linesep | 行分隔符 |
extsep | 扩展名分隔符 |
sep | 路径分隔符 |
pathsep | 多路径分隔符 |
curdir | 返回当前目录 |
(2)os模块的文件/目录/操作函数
文件操作函数:
remove(filename)/unlink(filename) | 删除文件 |
rename(旧文件名,新文件名) | 更改文件名和路径 |
renames(旧文件名,新文件名) | 更改文件名和路径,如果路径中不存在目录会自动建立 |
stat(文件名) | 返回文件信息 |
utime(文件名,(访问时间,修改时间)) | 更新访问时间和修改时间,如果指定为None,则用当前时间来更新 |
tmpfile() | 创建并打开一个新的临时文件 |
import os
#创建文件并写入内容
f=open('d:\\we.txt','w')
f.write('hello\n')
f.close()
#显示文件信息
os.stat('d:\\we.txt')
#更新访问时间和修改时间
os.utime('d:\\we.txt',None)
#重命名,此时路径不存在,用rename会报错
os.renames('d:\\we.txt','d:\\python1\\we.txt')
目录操作函数:
chdir(目录) | 改变当前工作目录 |
listdir(目录) | 列出指定目录中文件 |
getcwd() | 返回当前工作目录 |
mkdir(目录) | 创建目录 |
mkdirs(目录) | 可创建多层目录 |
rmdir(目录) | 删除目录 |
removedirs(目录) | 删除多层目录 |
walk(目录,topdown=True,onerror=None) | 参数目录:指定要遍历的目录。 |
#目录操作函数
import os
#显示当前工作目录
os.getcwd() #C:\\Users\\cheng
#更改当前目录
os.chdir('d:\\python')
#显示当前工作目录
os.getcwd() #d:\\python
#显示当前目录下文件
os.listdir('.')
#创建子目录
os.mkdir('tyu')
#更改当前目录
os.chdir('.\\tyu')
#显示当前工作目录
os.getcwd() #d:\\python\\tyu
#创建多级子目录
os.makedirs('d1\d2\d3')
#更改当前目录
os.chdir('d1')
#显示当前目录
os.getcwd()
#更改当前目录
os.chdir('d2\\d3')
#显示当前目录
os.getcwd() #d:\\python\\tyu\\d1\\d2\\d3
#删除子文件夹d3
os.rmdir('d:\\python\\tyu\\d1\\d2\\d3')
#上面的报错:WindowsError: [Error 32] : 'd:\\python\\tyu\\d1\\d2\\d3'不知道为什么报错
#下面也报错了。。。。[Error 3] : 'tyu\\d1\\d2'
os.removedirs('tyu\d1\\d2')
#遍历目录
for i in os.walk('d:\\python'):
print i
os.chdir('d:\\python')
#创建子目录
os.mkdir('we')
os.chdir('we')
os.getcwd()#d:\\python\\we
#在目录下创建文件
f=open('f1.txt','w')
f.write('file one')
f.close()
#遍历目录
for i in os.walk('d:\\python'):
print i
权限管理函数:
access(文件名,模式) | 检验文件权限模式 |
chmod(文件名,模式) | 更改文件权限模式 |
umask(权限模式) | 设置新权限模式,并返回旧权限模式 |
3.2 os.path模块
os.path模块提供对文件路径操作的函数,可以操作文件路径的各个部分。
路径查询函数
exists(路径) | 查询路径是否存在,返回True或False |
isabs(路径) | 查询路径是否为绝对路径,返回True或False |
isdir(路径) | 查询路径是不是已存在路径,如果路径中有文件名,则返回False |
isfile(路径) | 查询路径是不是已存在文件,如果路径中有文件名,则返回False |
文件信息查询函数
getatime(文件名) | 查询文件最近访问时间 |
getctime(文件名) | 查询文件创建时间 |
getmtime(文件名) | 查询文件最近修改时间 |
getsize(文件名) | 查询文件大小(以字节为单位) |
路径分隔函数
basename(路径) | 取路径中的文件名 |
dirname(路径) | 去文件名,取路径中的目录路径 |
join(路径1[,路径2[.....]]) | 将多个路径组合组合后返回,第一个绝对路径之前的参数将被忽略 |
split(路径) | 返回(目录路径,文件名)元组 |
splitdrive(路径) | 返回(盘符,不含盘符路径)元组 |
splitext(路径) | 返回(路径和主文件名,扩展名)元组 |
3.3 shutil模块
shutil模块提供了高级的文件和文件夹访问功能,包括复制文件、删除文件、复制文件的访问权限、递归地复制目录树等。
(1)目录和文件操作
copyfileobj(源类文件名,目标类文件名[,长度]) | 将源类文件对象的内容复制到目标类文件对象 |
copyfile(源文件名,目标文件/目录名) | 将源类文件的内容复制到目标文件 |
copymode(源文件名,目标文件名) | 将权限信息从源文件复制至目标文件,其他信息不受影响 |
copystat(源文件名,目标文件名) | 将权限信息、最后访问时间、最后修改时间、文件状态复制 |
copy(源文件名,目标文件名) | 将源文件复制到目标文件 |
copy2(源文件名,目标文件名) | 相当于先调用copy(),再调用copystat()函数 |
copytree(源目录,目标目录) | 将源目录下的整个目录树复制到目标目录下,目标目录必须原来不存在 |
rmtree(目录) | 删除整个目录 |
move(源文件/目录,目标目录) | 将源文件或目录移至目标目录下 |
(2)压缩函数
make_archive(文件名,格式,[根目录,[基础目录]]) | 创建归档文件(zip或tar),文件名需包含路径,格式参数可以是zip、tar、 bztar、gztar,根目录和基础目录默认都是当前目录 |
get_archive_formats() | 返回支持的列表格式,默认支持zip、tar、bztar、gztar |
四、Python读写Excel文件
4.1 xlwt库
4.2 xlrd库
4.3 xlutils库