python之IO操作

  1. 文件读写

(1)读取文件

文件的读写和大部分语言的文件的读写类似,都是有抛出异常,通try来进行异常的检查,检查完成后,来进行读文件,对文件的操作完成后将文件进行关闭

#进行文件的读操作
try :
    filename="D:\\example.txt"
    f=open(filename)
    message=f.read()
    print(message)
finally :
    f.close()

 还有一种更加简单的方式来进行文件的读写操作,是使用with进行的

#进行文件的读操作
filename="D:\\example.txt"
with open(filename,'r') as f : #用只读方式打开文档
    print(f.read())

 (2)二进制文件的读取

我们刚才讲的是对文本文件的读取,用的是utf-8编码,当我们读取像图片,音频等文件的时候要‘rb’打开文件

#进行文件的读操作
filename="D:\\picture.jpg"
with open(filename,'rb') as f : #
    print(f.read())

 (3)读取字符

对于读取非utf-8编码的字符,当我们进行读取的时候要传入encoding="   "参数

with open("D:/file.txt","r",encoding="gbk",) as f:

遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:

with open("D:/math.txt",'r',encoding="utf-8",errors="ignore")
  1.  文件操作读写练习代码
#文件读写操作练习


#读取文档
def readTextFile(filename) :
    with open(filename,'r') as f :
        str=f.read()
        print(str)

#读取二进制文档
def readBinaryFile(filename) :
    with open(filename,'rb') as f :
        str=f.read() 
        print(str) 

#写入文件
def writeInFile(filename,str) :
    with open(filename,'w') as f :
        f.write(str) 

#尾部添加内容
def appendFile(filename,str) :
    with open(filename,'a') as f :
        f.write(str) 

#测试文件
sign=True 
filename="D:/example.txt"
while sign :
    print("1--读取文档,2--读取二进制文档,3--写入文档,4--尾部添加文档")
    a=input("your input :")
    if a=='1' :
       readTextFile(filename)
    elif a=='2' :
        readBinaryFile(filename)
    elif a=='3' :
        str=input("输入您要存档的内容:")
        writeInFile(filename,str)
    elif a=='4' :
        str=input("输入您要尾部添加的内容:")
        appendFile(filename,str)
    else :
        sign=False

 2.StringIO和BytesIO 使用

很多的时候数据读写不一定在文件上,也可以在内存中读写

StringIO故名思议实在内存中读写str

现创建StringIO再使用

#导入需要的模块
from io import StringIO 


#StringIO使用方法
f=StringIO()  

#正常读写
str="hello this is a string io file "
f.write(str)
f.write("hello this is a new file ")
#获得f中的值
print(f.getvalue())

 

这个使用类似于文件的操作(读写),只不过是存储再内存中的

BytesIO的使用

#导入需要的模块
from io import StringIO 
from io import BytesIO

#StringIO只能操作字符串,如果操作二进制数据仍要使用BytesIO 
f=BytesIO(('中文').encode('utf8')) #进行编码转换
print(f.getvalue()) 

 

果然转化成了二进制编码

 3.文件操作和目录

(1)查看环境变量

#导入需要的模块
import os 

#操作文件和目录

#输出所有名称的环境变量
allpath=os.environ
print(allpath)
#输出某个特定名称的环境变量
keyname=input("输入环境变量的名称")
path=os.environ.get(keyname) 
print(path) 

 (2)操作目录和文件

操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中,这一点要注意一下。查看、创建和删除目录可以这么调用:

#导入需要的模块
import os 

#操作文件和目录
#查看目录,当前路径等功能

#查看当前目录的绝对路径
nowpath=os.path.abspath('.')  #其中.表示当前

#在某个目录下创建一个新的目录
#第一步先表示出新创建目录的名称
dictname="newdictname"
newpath=os.path.join(nowpath,dictname)
print("要创建的目录为%s"% newpath)
#创建一个新目录
os.mkdir(newpath)
#删除一个目录
os.rmdir(newpath)

 (3)合并路径和拆分路径

#合并路径使用到的语句
newpath=os.path.join(os.path.abspath('.'),'dictoryname') 


#拆分路径---拆分后分为两部分,最后一部分是最后的目录命或文件名
path,filename=os.path.split(newpath)
print("路径名为%s,文件名为%s"%(path,filename)) 

os.path.splitext()可以直接让你得到文件扩展名,很多时候非常方便:

>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')

这些合并、拆分路径的函数并不要求目录和文件要真实存在,它们只对字符串进行操作。

文件操作使用下面的函数。假定当前目录下有一个test.txt文件:

# 对文件重命名:
>>> os.rename('test.txt', 'test.py')
# 删掉文件: >>> os.remove('test.py') 

但是复制文件的函数居然在os模块中不存在!原因是复制文件并非由操作系统提供的系统调用。理论上讲,我们通过上一节的读写文件可以完成文件复制,只不过要多写很多代码。

幸运的是shutil模块提供了copyfile()的函数,你还可以在shutil模块中找到很多实用函数,它们可以看做是os模块的补充。

最后看看如何利用Python的特性来过滤文件。比如我们要列出当前目录下的所有目录,只需要一行代码:

#拆分路径---拆分后分为两部分,最后一部分是最后的目录命或文件名
path,filename=os.path.split(newpath)
print("路径名为%s,文件名为%s"%(path,filename)) 

#过滤目录
dict=[x for x in os.listdir('.') if os.path.isdir(x)]
for d in dict :
    print(" %s\n"%d)

要列出所有的.py文件,也只需一行代码:

>>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py'] ['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py', 'urls.py', 'wsgiapp.py'] 

是不是非常简洁?

猜你喜欢

转载自www.cnblogs.com/sunchongwei/p/9571764.html
今日推荐