python操作文本文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python操作文本文件相关的知识,希望对你有一定的参考价值。
参考技术A 在磁盘上读写文件之前,必须先打开这个文件。打开文件就需要提供文件的路径。在与Python程序同一个目录下,我们有一个名为 pi.txt 的文件,它的内容如下:
现在使用Python来打开和关闭它:
执行此程序不会有任何输出,这表示着打开和关闭文件都得到了正确执行。
可以看到,使用 open() 函数打开文件,参数为文件名(或文件路径);该函数会返回一个文件句柄,文件句柄并不会实际保存文件的内容,而是代表着一种操作,在上面的例子中,文件句柄被赋值给变量 fhand 。
打开文件后,程序具有读(默认)该文件的权限。
最后,使用文件句柄的 close() 方法关闭文件。这非常重要,因为使用完而没有关闭的文件会占用内存或造成安全问题。
如果Python找不到该文件,则会返回错误,比如下面这样:
Python提示我们没有相应的文件或者目录: 'pii.txt'。
打开文件后就可以对文件进行操作:
fhand.read() 方法将文件内容作为一个字符串返回。
文件中的每一行末尾使用换行符 \n 表示换行,例子中方法 rstrip() 去掉文本中的换行符,然后输出。
程序的运行效果如下:
如果在文件关闭之前程序发生BUG意外退出,则文件不会关闭,为了避免此类事件的发生,可以使用 with 语句:
with 语句的特点是即便在操作文件时发生错误,文件也会自动被清理。
fhand.read() 虽然可以读取文本内容,但是当我们想要逐行处理文件内容,或者文件很大而无法一次性加载进内存的时候,就不适用了。
可以使用 for 语句逐行处理文件内容:
本程序中将文件名保存在变量 filename 中。
打开文件后,使用 for 语句按行读取文件内容。例子中,每次循环依次取一行文本以字符串的格式保存在变量 line 中,每次循环中变量 count 自增1。
这个程序的作用是,打开程序所在目录的 when_old.txt 文件,然后统计行数,并输出结果。
when_old.txt 文件的内容是:
可以使用其他方法操作字符串 line :
程序将以 'And' 开头的行打印出来。
打开文件后,默认的权限是读(r),如果要写文件,则需要使用写(w)或者追加(a)权限。
w权限,打开一个文件用于写入。如果该文件存在,则覆盖该文件;如果该文件不存在,则创建该文件。
a权限,打开一个文件用于追加。如果该文件存在,在文件末尾追加;如果该文件不存在,则创建该文件。
下面是一个使用w权限打开文件的例子:
例子中使用w权限打开该文件,并写入两行。(如果该文件存在,则内容会被覆盖)
fhand.write() 不会自动添加换行符,所以如果需要换行,需在末尾添加 \n 。
下面我们写一个统计文件中词频的程序。
它会统计文件中各个词的出现的次数,然后由高到低显示出前5个词。
首先我们完成打开和关闭文件的程序内容:
在例子中,由用户输入文件名,并且使用异常捕获以处理文件打开时的错误。
下面对内容进行统计:
这个程序:
如此,我们就在字典中存放了 单词:次数 的键值对。
由于字典不能保存顺序,所以不能对其进行排序。为此,将每个键值对都添加到一个列表中:
在列表 word_list 中,每一项都是一个元组,每个元组第一个值是单词出现的次数,第二个值是单词内容。
对其进行逆向(由大到小)排序:
打印最终结果:
整个程序如下:
下面是程序运行结果的示例:
Python解析Python中的文件操作
目录结构:
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:缓冲模式
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(“This is our new text file”) file.write(“and this is another 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”) print file.read() file.close()
你会看见testfile.txt的所有文件内容都会被输出。
我们也可以只读取指定数量的字符,只需要将需要读取的字符数量传递给read方法便可以了。
file = open(“testfile.txt”, “r”) print file.read(5) file.close()
输出:
Hello
如果想一行行的读取文本文件的内容,那么可以使用readline方法。
file = open(“testfile.txt”, “r”) print file.readline() file.close()
输出:
Hello World
如果想返回文件中的每行数据,那么可以使用readlines方法。
file = open(“testfile.txt”, “r”) print file.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 in file: print line 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 in f: print line,
4.os模块
os模块提供了许多与操作系统相交互的函数,OS是Python的标准组件模块。该模块提供了可移植性的文件操作方法。os和os.path模块包含了许多能够与文件操作系统相交互的方法。
os.name
导入该模块的操作系统的名称,windows是nt,linux是posix
import os print(os.name) #windows是nt,linux是posix
输出:
posix
os.getcwd()
os.getcwd()函数返回当前的工作目录(Current Working Directory,CWD)
import os print(os.getcwd()) # 打印当前的绝对路径 # os.path.abspath(‘.‘) # 打印当前路径下的文件和文件夹 # os.listdir(‘.‘)
输出:
/home/user/test
os.popen()
该方法会打开一个连接到命令行的管道,该管道的读写性依赖于打开模式。
os.popen(command[, mode[, bufsize]])
mode(打开模式)和bufsize不是必须要提供的。如果为打开模式为提供,那么默认为"r",也就是只读模式(read only)。
案例:
import os 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()打开的文件,那么会抛出错误:
import os 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()重命名文件的名称,被命名的文件必需存在而且用户应该具有改变文件名称的权限。
import os 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对文件进行循环遍历,格式化输出,查找、替换等操作,非常方便。
典型用法:
import fileinput for line in fileinput.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 #---样本文件--- import fileinput def process(line): return line.rstrip() + ‘ line‘ for line in fileinput.input([‘1.txt‘,‘2.txt‘],inplace=1): print process(line) #---结果输出--- c:Python27>type 1.txt first line second line c:Python27>type 2.txt third line fourth line #---结果输出---
参考文章:
https://www.pythonforbeginners.com/files/reading-and-writing-files-in-python
https://www.geeksforgeeks.org/os-module-python-examples/
https://www.2cto.com/kf/201412/361320.html
以上是关于python操作文本文件的主要内容,如果未能解决你的问题,请参考以下文章