Python文件I/O

来源:互联网 发布:工业企业分行业数据 编辑:程序博客网 时间:2024/05/01 10:38

文件的创建

Python3中没有file()函数;
文件的打开或创建可以使用函数open()函数;
文件的打开模式:
模式描述r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。r+打开一个文件用于读写。文件指针将会放在文件的开头。rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
对于图片,视频等文件必须使用“b”的模式读写。

file()类用于文件管理;
属性描述file.closed返回true如果文件已被关闭,否则返回false。file.mode返回被打开文件的访问模式。file.name返回文件的名称。file.softspace如果用print输出后,必须跟一个空格符,则返回false。否则返回true。
文件的处理一般分为以下3个步骤:
1.创建并打开文件,使用file()函数返回1个file对象;
2.调用file对象的read(),write()等方法处理文件;
3.调用close()关闭文件,释放file对象占用的资源;
#open()函数的声明:open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closedf=True,opener=None) -->file object'''file是打开文件的名称,如果文件file不存在,open()将创建名为name的文件然后打开;mode是文件的打开模式;buffering设置缓存模式。0表示不缓存,1表示行缓冲;open返回file对象'''文件的创建,写入和关闭操作:context = "I Love You"f = open('love.txt','w')        #打开文件f.write(context)                #把字符串写入文件f.close()                       #关闭文件


write()写入直接在行后面添加,不会另起一行写入;

文件的操作

文件的读取

#1.按行读取方式 readline()'''readline()每次读取文件中的一行,需要使用永真表达式循环读取文件;当文件指针移动到文件的末尾时,依然使用readline()读取文件会出现错误,因此程序中需要添加1个判断文件指针是否移动到文件的尾部,并且通过该语句的中断循环'''f = open("love.txt")while(True):    line = f.readline()    if line:        print(line)    else:        breakf.close()#以下也可以:f = open("love.txt")while(True):    line = f.readline()    if line:        print(line)f.close()#输出结果:I Love YouBaoxinMy name is XiaobaiXiaobai
'''这样不可以:f = open("love.txt")while(True):    line = f.readline()    print(line)f.close()'''#2.多行读取方式 readlines()'''使用readlines()读取文件,需要通过循环访问readlines()返回列表中的元素;函数readlines()一次性读取文件中多行数据'''f = open('love.txt')lines = f.readlines()               #把文件love.txt中所有内容存储在列表lines中for line in lines:    print(line)f.close()#输出结果:I Love YouBaoxinMy name is XiaobaiXiaobai#3.一次性读取方式read()'''读取文件最简单的方法是使用read(),将从文件中一次性读出所有内容,并赋值给1个字符串变量'''f = open("love.txt")context = f.read()print(context)f.close()#输出:I Love YouBaoxinMy name is XiaobaiXiaobai#通过控制read()参数的值,返回指定字节的内容:f = open('love.txt')context = f.read(6)       #读取前5个字节的内容print(context)print(f.tell())           #返回文件对象当前的指针位置context = f.read(6)     #继续读取5个字节的内容print(context)print(f.tell())           #输出文件当前的指针位置f.close()#输出内容:I Love6 YouB13#文件love.txt内容:I Love YouBaoxinMy name is XiaobaiXiaobai


文件的写入

#writelines()方法可以把列表中存储的内容写入文件:f = open("hello.txt","w+")li = ["Hello world\n","Hello Baoxin\n"]f.writelines(li)f.close()#文件内容:Hello worldHello Baoxin'''write(),writelines()在写入前会清除文件中原有的内容,再重新写入新的内容,相当于覆盖了;如果要保留文件中原有的内容,只是追加新的内容,可以使用模式“a+”打开文件;'''f = open("hello.txt","a+")new_context = "I love You"f.write(new_context)f.close()#文件内容:Hello worldHello BaoxinI love You#多次执行文件内容为:Hello worldHello BaoxinI love YouI love YouI love YouI love You#如果写入字符串非常多可以使用writelines();


文件的删除和复制

文件的删除需要使用os模块和os.path模块;
os模块提供了对系统环境,文件,目录等操作系统级的接口函数;
os函数模块的open()函数与内建open()函数的用法不相同;
文件的删除需要调用remove()函数实现。删除之前要先判断文件是否存在,存在删除,否则不进行任何操作;

#文件的删除操作:import osfile("hello.txt","w")               #Python内置模块没有file属性,将file改为openif os.path.exists("hello.txt"):    os.remove("hello.txt")#文件的复制:#file类并没有提供直接复制文件的方法,但是可以使用read(),write()方法:src = open("hello.txt","w")li = ["hello Baoxin\n","hello Xiaobai\n"]src.writelines(li)src.close()src = open("hello.txt","r")dst = open("hello2.txt","w")dst.write(src.read())src.close()dst.close()'''shutil模块:此模块是另一个文件目录的管理接口,提供了一些用于复制文件,目录的函数;copyfile()可以实现文件的复制,声明如下:copyfile(src,dst)src表示源文件的路径,src是字符串类型;dst是目标文件的路径,dst是字符串类型;把src指向的文件复制到dst文件中文件的剪切可以使用move()函数实现:move(src,dst,*,follow_symlinks=True)与copyfile()参数相同,移动一个人间或目录到指定位置,并且可以根据参数dst重命名移动后的文件'''import shutilshutil.copyfile("hello.txt","hello3.txt")       #把hello.txt的内容复制给hello3.txtshutil.move("hello.txt","../")                  #把hello.txt剪切到当前目录的父目录shutil.move("hello3.txt","hello4.txt")          #把hello3.txt移动到当前目录并改名hello4.txt#文件的重命名:'''os模块的函数rename()可以对文件或目录进行重命名'''import osli = os.listdir(".")                #调用listdir()返回当前目录的文件列表,“.”表示当前目录print(li)if "hello.txt" in li:    os.rename("hello.txt","Baoxin.txt")elif "hello4.txt" in li:    os.rename("hello4.txt","Xiaobai.txt")#输出:['7_1.py', 'hello2.txt', 'hello4.txt', 'love.txt']'''可以不看~修改后缀名:import osfiles = os.listdir(".")for filename in files:    pos = filename.find(".")    if filename[pos + 1:] == "html":        newname = filename[:pos + 1] + "htm"        os.rename(filename,newname)'''#文件内容的搜索和替换:import ref1 = open("hello.txt","r")count = 0for s in f1.readlines():    li = re.findall("hello",s)                  #使用re模块的findall()函数查询变量s,把查到的结果存储到列表li中    if len(li) > 0:        count = count + li.count("hello")       #调用列表的count()方法,统计hello在列表里个个数print("找到" + str(count) + "个hello")f1.close()#替换:下面的代码把hello.txt中的hello全部替换为love,并把结果保存到文件hello2.txt中f1 = open("hello.txt","r")f2 = open("hello2.txt","w")for s in f1.readlines():    f2.write(s.replace("hello","love"))f1.close()f2.close()#文件的比较:'''Python提供了模块difflib实现对序列,文件的比较;如果要比较两个文件,可以使用difflib模块的SequenceMatcher类实现;其中get_opcodes()方法可以返回两个序列的比较结果;调用get_opcodes()前需要先生成1个SequenceMatcher对象,声明如下:class SequenceMatcher([isjunk[,a[,b]]])isjunk表示比较过程中是否匹配知道的字符或字符串,a,b表示待比较的两个序列;生成序列比较对象后调用该对象的get_opcodes()方法,将返回一个元祖~!@#¥%……&*()——'''



目录的常见操作

Python的os模块和os.path模块也提供了对目录操作的函数;
如果要一次性创建,删除多个目录,应使用函数makedirs()和removedirs();
mkdir()和rmdir()一次只能创建或删除一个目录;
import osos.mkdir("hello")os.rmdir("hello")os.makedirs("hello/world")os.removedies("hello/world")目录的遍历:'''os.walk()可以用于目录的遍历,声明如下:walk(top,topdown=True,onerror=None,followlinks=False)top表示需要遍历的目录树的路径;'''



文件和流

#1.stdin#对象stdin表示流的标准输入;#通过流对象读取文件hello.txt的内容如下:import syssys.stdin = open("hello.txt","r")for line in sys.stdin.readlines():    print(line)#2.stdout#流的标准输出;#前面的程序都是把程序运行后的结果输出到控制台#这里通过stdout对象重定向输出,把输出结果保存到文件中;import syssys.stdout = open(r"./hello.txt","a")#以追加模式打开当前目录下的文件hello.txt,并把hello.txt设置为终端输出设备,默认终端是控制台print("goodbye")sys.stdout.close()#3.stderr#Pyhton的srderr对象用于记录输出异常信息,通过srderr对象可以实现日志文件的功能import sys,timests.stderr = open("record.log","a")f = open(r"./hello.txt","r")t = time.strftime("%Y-%m-%d %X",time.localtime())context = f.read()if context:    sys.stderr.write(t + " " + context)else:    raise Exception, t + "异常信息"



0 0