python的模块提供了许多文件处理方法_【Python】解析Python中的文件操作

目录结构:

contents structure [-]

1.简介

在Python中无需引入额外的模块来进行文件操作,Python拥有内置的文件操作函数(除了内置文件操作函数,Python语言也提供了额外的文件操作模块,它们具有更加强大的功能)。

os模块提供了在操作系统上可移植的文件操作方法。如果只是想要读取和写入数据,那么可以用内置的open()方法。如果想要操作路径,可以使用os.path模块。如果想要在命令行上读取所有的数据行,那么可以使用fileinput模块。如果想要创建一个临时文件或路径,那么可以使用tempfile模块。如果想要更高级别的文件和目录操作,那么可以使用shutil模块。

下面开始介绍内置的Open方法(在本文的后面还有关于os和fileinput模块的讲解):

首先需要用Python中的内置open函数获得一个文件对象(file object)。

内置open函数可以直接打开一个文件(file),然后返回一个文件对象(file object),文件对象包含了的大量方法和属性,可以用这些方法和属性操作被打开的文件。

文件对象的closed属性,表示一个文件是否关闭(如果已关闭返回True,否则返回False)。mode,获取文件的打开模式。name,获取文件的名称。

2.Python中的文件类型

在Windows操作系统中,文件可以是图像、文本、可执行、音频、视频等等文件格式。但是在python中,文件被分为两类:一类是文本文件,另一类是二进制文件。文本文件由一行行的字符构成,每一行文本的末尾都有一个EOL字符(End Of Line Character)。EOL标志着当前行的结束和新的一行的开始。二进制文件不同与文本文件,二进制文件也只能由知道文件格式的应用程序处理。

3.内置函数的文件操作

3.1 open()函数

Python中的内置函数open会打开一个文件,并且返回一个文件对象。

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

file:打开文件的路径,必需提供。

mode:打开模式,默认为r(只读访问)

buffering:缓冲模式,值为0表示没有缓冲,1表示行缓冲,大于1就表示缓冲区域的大小,负数表示默认为系统的缓冲区大小。设置了缓冲后,可以用flush()方法刷新缓冲。

encoding:文件的操作的编码名称

errors:一个可选字符串,指定如何处理编码和解码的错误

newline:控制换行符模式的行为

closefd:如果为false,那么应该传入一个文件描述符(file descripter)而不应该传入文件名称。如果是True,那么必须传入文件名称。否则会出现错误。

opener:一个可调用对象,

上面的参数中只有file参数是必需提供的,mode参数指定了文件的打开模式,接下来笔者会详细介绍它的所有取值。

3.2 Mode

Mode代表文件的打开模式,在上面介绍的open方法就需要用到文件的打开模式(Mode),open的参数中mode是可选的,下面的表阐述了Mode的取值。

模式

描述

r

以只读的方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

rb

以二进制格式打开一个文件只用于读。文件指针将会放在文件的开头。

r+

打开文件用于读写。文件指针将会放在文件的开头。

rb+

以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。

w

打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

wb

以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

w+

打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

wb+

以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

a

打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会写入到已有的内容之后。如果该文件不存在,创建新文件进行写入。

ab

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会写入到已有的内容之后。如果该文件不存在,创建新文件进行写入。

a+

打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。在文件打开时会使用追加模式。如果该文件不存在,创建新文件用于读写。

ab+

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

下面是一个使用案例:

f = open("test.txt","r")print(f)

f.close()

在上面介绍过,open函数会返回一个文件对象(File Object)。一旦我们拿到这个文件对象,就可以调用这个对象上的属性和方法了。最常用的方法就是read和write了。

3.3 创建文本文件

为了增加对文本文件的熟悉程度,接下来我们将会创建自己的文本文件,并且在上面做一些练习。用一个文本编辑器,创建一个名为testfile.txt的文件。然后在同一级目录下,就可以使用如下的代码进行文件写入操作了

file =open(“testfile.txt”,”w”)

file.write(“Hello World”)

file.write(“Thisisour new text file”)

file.write(“and this isanother line.”)

file.write(“Why? Because we can.”)

file.close()

当我们打开testfile.txt后,就可以文件内容如下:

$ cat testfile.txt

Hello World

This is our new text file

and this is another line.

Why? Because we can.

3.4 读取文本文件

读取文件的内容的方式是多种多样的,如果需要读取一个文件中的所有的内容,那么可以使用read方法。

file =open(“testfile.txt”, “r”)printfile.read()

file.close()

你会看见testfile.txt的所有文件内容都会被输出。

我们也可以只读取指定数量的字符,只需要将需要读取的字符数量传递给read方法便可以了。

file =open(“testfile.txt”, “r”)print file.read(5)

file.close()

输出:

Hello

如果想一行行的读取文本文件的内容,那么可以使用readline方法。

file =open(“testfile.txt”, “r”)printfile.readline()

file.close()

输出:

Hello World

如果想返回文件中的每行数据,那么可以使用readlines方法。

file =open(“testfile.txt”, “r”)printfile.readlines()

file.close()

输出:

[‘Hello World’, ‘This is our new text file’, ‘and this is another line.’, ‘Why? Because we can.’]

3.5 循环文件对象

如果想要更有效率的循环文件中的每一行数据,那么可以使用循环语句,使用循环语句代码不仅简单而且易读。

file =open(“testfile.txt”, “r”)for line infile:printline

file.close()

输出:

Hello World

This is our new text file

and this is another line.

Why? Because we can.

3.6 关闭文件

当完成对文件的操作后,就可以使用close()方法关闭文件。它将会彻底关闭文件,中断正在使用资源,并且将这些资源返还给系统。

在使用完文件之后,记得要调用close()方法。在调用close()后,任何对文件对象(file object)的操作都是非法的。

在上面的所有案例中,我们在每次使用完文件对象后都调用过close()方法,这是非常好的习惯。

3.7 With语句

可以将with语句应用到文件对象(file object)上,使用with语句语法更清晰。使用with语句的优点在于任何打开的文件都会自动关闭,因此使用with不必担心资源的释放问题。

使用with语句打开文件的格式:

with open("filename") as file:

下面是一个完整的案例:

with open(“testfile.txt”) as file:

data=file.read()//do something with data

在上面的案例代码中,我们并没有使用close()关闭文件对象。这是因为with语句会自动帮我们关闭,编程人员便可以更专注业务逻辑代码。

下面是循环文件内容的案例:

with open(“testfile.txt”) as f:for line inf:print line,

4.os模块

os模块提供了许多与操作系统相交互的函数,OS是Python的标准组件模块。该模块提供了可移植性的文件操作方法。os和os.path模块包含了许多能够与文件操作系统相交互的方法。

os.name

导入该模块的操作系统的名称,windows是nt,linux是posix

importosprint(os.name) #windows是nt,linux是posix

输出:

posix

os.getcwd()

os.getcwd()函数返回当前的工作目录(Current Working Directory,CWD)

importosprint(os.getcwd())#打印当前的绝对路径#os.path.abspath('.')

#打印当前路径下的文件和文件夹#os.listdir('.')

输出:

/home/user/test

os.popen()

该方法会打开一个连接到命令行的管道,该管道的读写性依赖于打开模式。

os.popen(command[, mode[, bufsize]])

mode(打开模式)和bufsize不是必须要提供的。如果为打开模式为提供,那么默认为"r",也就是只读模式(read only)。

案例:

importos

fd= "a.txt"

#popen() 和 open() 相似

file = open(fd, 'w')

file.write("Hello")

file.close()

file= open(fd, 'r')

text=file.read()print(text)#popen() 提供了直接访问文件的管道

file = os.popen(fd, 'w')

file.write("Hello")#其他的一些操作#关闭文件

file.close()

os.close()

如果一个文件是使用open()打开的,那么只能使用close()关闭。但是如果一个文件是通过os.popen()的,那么可以使用close()或os.close()方法。如果我们试图用os.close()去关闭一个open()打开的文件,那么会抛出错误:

importos

fd= "a.txt"file= open(fd, 'r') #使用open打开文件

text =file.read()print(text)

os.close(file)#使用os.close()关闭文件

输出:

Traceback (most recent call last):

File "/home/user/test/a.py", line 6, in

os.close(file)

TypeError: an integer is required (got type _io.TextIOWrapper)

os.rename()

可以使用os.rename()重命名文件的名称,被命名的文件必需存在而且用户应该具有改变文件名称的权限。

importos

fd= "a.txt"os.rename(fd,'New.txt')

os.rename(fd,'New.txt')

输出:

Traceback (most recent call last):

File "/home/user/test/a.py", line 3, in

os.rename(fd,'New.txt')

FileNotFoundError: [WinError 2] The system cannot find the

file specified: 'a.txt' -> 'New.txt'

5.fileInput模块

fileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作。该模块的input()函数有点类似文件readlines()方法,区别在于前者是一个迭代对象,需要用for循环迭代,后者是一次性读取所有行。

用fileinput对文件进行循环遍历,格式化输出,查找、替换等操作,非常方便。

典型用法:

importfileinputfor line infileinput.input():

process(line)

基本格式:

fileinput.input([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])

参数说明:

files:                  #文件的路径列表,默认是stdin方式,多文件['1.txt','2.txt',...]

inplace:                #是否将标准输出的结果写回文件,默认为0不返回,设置为1时返回

backup:                 #备份文件的扩展名,只指定扩展名,如.bak。如果该文件的备份文件已存在,则会自动覆盖。

bufsize:                #缓冲区大小,默认为0,如果文件很大,可以修改此参数,一般默认即可

mode:                   #读写模式,默认为只读

openhook:               #该钩子用于控制打开的所有文件,比如说编码方式等;

常用函数

函数

描述

fileinput.input()

返回能够用于for循环遍历的对象

fileinput.filename()

返回当前文件的名称

fileinput.lineno()

返回当前已经读取的行的数量(或者序号)

fileinput.filelineno()

返回当前读取的行的行号

fileinput.isfirstline()

检查当前行是否是文件的第一行

fileinput.isstdin()

判断最后一行是否从stdin中读取

fileinput.close()

关闭队列

#test.py#---样本文件---

c:Python27>type 1.txt

first

second

c:Python27>type 2.txt

third

fourth#---样本文件---

importfileinputdefprocess(line):return line.rstrip() + 'line'

for line in fileinput.input(['1.txt','2.txt'],inplace=1):printprocess(line)#---结果输出---

c:Python27>type 1.txt

first line

second line

c:Python27>type 2.txt

third line

fourth line#---结果输出---

参考文章:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值