七、文件管理

本文详细介绍Python中文件操作的方法,包括磁盘文件的读写、StringIO类文件的使用、文件系统操作,以及如何利用xlwt、xlrd和xlutils库进行Excel文件的读写和修改。

一、磁盘文件

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,οnerrοr=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(源文件/目录,目标目录)将源文件或目录移至目标目录下
import shutil
import os
#更改目录
os.chdir('d:\\python')
#显示当前目录下文件和文件夹
os.listdir('.')
#复制文件
shutil.copy('we.txt','we_copy.txt')
#复制目录
shutil.copytree('d:\\python','e:\\book\\python33')

(2)压缩函数

make_archive(文件名,格式,[根目录,[基础目录]])

创建归档文件(zip或tar),文件名需包含路径,格式参数可以是zip、tar、

bztar、gztar,根目录和基础目录默认都是当前目录

get_archive_formats()返回支持的列表格式,默认支持zip、tar、bztar、gztar
#查看支持类型
shutil.get_archive_formats()
'''结果为
[('bztar', "bzip2'ed tar-file"),
 ('gztar', "gzip'ed tar-file"),
 ('tar', 'uncompressed tar file'),
 ('zip', 'ZIP file')]
'''
shutil.make_archive('we.txt','zip')
#显示当前目录下文件和文件夹
os.listdir('.')

四、Python读写Excel文件

在python中处理excle文件,常用的库有xlwt库(写)、xlrd库(读)、xlutils库(修改,需要依赖前两个)。

4.1 xlwt库

import xlwt
#写文件前,先创建一个空白工作簿
b1=xlwt.Workbook()
#添加工作表
sheet1=b1.add_sheet('mysheet1')
sheet2=b1.add_sheet('mysheet2')
#写入内容,第一个参数为行号,第二个为列号
sheet1.write(0,0,'cell(0,0)')
sheet1.write(0,2,'hello cc')
#也可通过工作表的行对象来访问单元格
row1=sheet2.row(2)
row1.write(3,'mmm')
#也可通过工作表的列对象对列进行操作,但不能调用write()函数,设置列宽
coll=sheet2.col(4)
coll.width=1000
#保存
b1.save('d:\\python\\myfirstbook.xls')

4.2 xlrd库

import xlrd
#打开工作簿
efile=xlrd.open_workbook('d:\\python\\myfirstbook.xls')
#根据工作表编号获取工作表
esheet1=efile.sheet_by_index(0)
#根据工作表名称获取工作表
esheet2=efile.sheet_by_name('mysheet2')
#获取单元格内容
print esheet1.cell_value(0,0)

4.3 xlutils库

import xlrd
from xlutils.copy import copy
#打开工作簿
efile=xlrd.open_workbook('d:\\python\\myfirstbook.xls')
#复制工作簿
cfile=copy(efile)
#使用get_sheet()函数获得工作表对象
ws=cfile.get_sheet(0)
ws.write(0,0,'mmmmmmmmm')
# 保存
cfile.save('d:\\python\\mysecondbook.xls')

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值