您的位置:首页 > 编程语言 > Python开发

Python文件I/O

2015-11-16 21:34 661 查看


文件的创建

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:
break
f.close()

#以下也可以:
f = open("love.txt")
while(True):
line = f.readline()
if line:
print(line)
f.close()

#输出结果:
I Love You

Baoxin

My name is Xiaobai

Xiaobai
'''
这样不可以:
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 You

Baoxin

My name is Xiaobai

Xiaobai

#3.一次性读取方式read()
'''
读取文件最简单的方法是使用read(),将从文件中一次性读出所有内容,并赋值给1个字符串变量
'''

f = open("love.txt")
context = f.read()
print(context)
f.close()

#输出:
I Love You
Baoxin
My name is Xiaobai
Xiaobai

#通过控制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 Love
6
You
B
13

#文件love.txt内容:
I Love You
Baoxin
My name is Xiaobai
Xiaobai


文件的写入

#writelines()方法可以把列表中存储的内容写入文件:

f = open("hello.txt","w+")
li = ["Hello world\n","Hello Baoxin\n"]
f.writelines(li)
f.close()

#文件内容:
Hello world
Hello Baoxin

'''
write(),writelines()在写入前会清除文件中原有的内容,再重新写入新的内容,相当于覆盖了;
如果要保留文件中原有的内容,只是追加新的内容,可以使用模式“a+”打开文件;
'''

f = open("hello.txt","a+")
new_context = "I love You"
f.write(new_context)
f.close()

#文件内容:
Hello world
Hello Baoxin
I love You

#多次执行文件内容为:
Hello world
Hello Baoxin
I love YouI love YouI love YouI love You

#如果写入字符串非常多可以使用writelines();


文件的删除和复制

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

#文件的删除操作:

import os
file("hello.txt","w")               #Python内置模块没有file属性,将file改为open
if 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 shutil

shutil.copyfile("hello.txt","hello3.txt")       #把hello.txt的内容复制给hello3.txt
shutil.move("hello.txt","../")                  #把hello.txt剪切到当前目录的父目录
shutil.move("hello3.txt","hello4.txt")          #把hello3.txt移动到当前目录并改名hello4.txt

#文件的重命名:
'''
os模块的函数rename()可以对文件或目录进行重命名
'''

import os
li = 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 os
files = os.listdir(".")
for filename in files:
pos = filename.find(".")
if filename[pos + 1:] == "html":
newname = filename[:pos + 1] + "htm"
os.rename(filename,newname)
'''

#文件内容的搜索和替换:
import re

f1 = open("hello.txt","r")
count = 0
for 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 os
os.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 sys

sys.stdin = open("hello.txt","r")
for line in sys.stdin.readlines():
print(line)

#2.stdout
#流的标准输出;
#前面的程序都是把程序运行后的结果输出到控制台
#这里通过stdout对象重定向输出,把输出结果保存到文件中;

import sys
sys.stdout = open(r"./hello.txt","a")
#以追加模式打开当前目录下的文件hello.txt,并把hello.txt设置为终端输出设备,默认终端是控制台
print("goodbye")
sys.stdout.close()

#3.stderr
#Pyhton的srderr对象用于记录输出异常信息,通过srderr对象可以实现日志文件的功能

import sys,time
sts.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 + "异常信息"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: