Python 知识量:10 - 41 - 150
处理文件的基本步骤一般是:1、打开文件。2、处理文件。3、关闭文件。
在处理文本文件时可以一次读取一行,也可以一次全部读取。一次读取一行即逐行读取,例如:
# rw.py def print_f(fname): f=open(fname,'r') for line in f: print(line,end='') f.close()
运行结果为:
>>> ======================= RESTART: D:\PythonTestFile\rw.py ======================= >>> print_f('English.txt') Cambridge Primary English Stage 1 Learner's Book Cambridge Primary English Stage 1 Activity Book Cambridge Primary English Stage 2 Learner's Book Cambridge Primary English Stage 2 Activity Book Cambridge Primary English Stage 3 Learner's Book Cambridge Primary English Stage 3 Activity Book
在以上代码中,对于有关函数,需要知道以下几点:
函数open()用于打开文件,使用时必须指定文件名称和打开模式。如果不指定打开模式,默认将以只读模式(r)打开文件。
函数open()将返回一个特殊的文件对象,表示对应的文件。
函数open()不会将文件读取到内存中,而是每循环一次,读取并打印一行。
close()函数用于关闭文件,但不是必须的,Python通常会自动关闭不再使用的文件,只是关闭的时间不确定。
print()函数中,end设置为'',这是因为文件各行都以字符\n结尾。如果去掉end的设置,每打印一行文字将多出一空行。
Python的文件打开模式如下所示:
字符 | 含义 |
---|---|
r | 只读模式(默认)。文件指针位于文件的开头。 |
w | 写入模式。以清空原文件的方式写入;文件不存在就创建新文件。 |
a | 追加模式。文件指针位于文件的结尾。如果文件不存在,就创建新文件。 |
r+ | 不清空写入的读写模式,指针位于文件的开头,写入多少就从开头覆盖多少。 |
w+ | 清空写入的读写模式。 |
a+ | 追加写入的读写模式。 |
b | 二进制模式。 |
以上模式中,二进制模式b还可以分为rb、wb、ab、rb+、wb+、ab+等,是二进制下的各类模式。
整体读取就是将文本文件作为一个大型字符串进行读取。
# rw.py def print_f(fname): f=open(fname,'r') print(f.read()) f.close()
运行结果为:
>>> ======================= RESTART: D:\PythonTestFile\rw.py ======================= >>> print_f('English.txt') Cambridge Primary English Stage 1 Learner's Book Cambridge Primary English Stage 1 Activity Book Cambridge Primary English Stage 2 Learner's Book Cambridge Primary English Stage 2 Activity Book Cambridge Primary English Stage 3 Learner's Book Cambridge Primary English Stage 3 Activity Book
与逐行读取相比,整体读取更加简便。但是需要注意的是,整体读取的方式会将文件读入内存中,对于较大的文件,需要确保有足够的内存。
以上代码还可以进一步简化,形式将更为紧凑:
# rw.py def print_f(fname): print(open(fname).read())
如果要写入文本文件,只需要将文件打开模式设为w,并调用write()函数。
# rw.py def wf(fname): f=open(fname,'w') f.write('It\'s all changed.\n') f.write('It\'s all new.')
运行结果为:
>>> ======================= RESTART: D:\PythonTestFile\rw.py ======================= >>> print(open('English.txt').read()) Cambridge Primary English Stage 1 Learner's Book Cambridge Primary English Stage 1 Activity Book Cambridge Primary English Stage 2 Learner's Book Cambridge Primary English Stage 2 Activity Book Cambridge Primary English Stage 3 Learner's Book Cambridge Primary English Stage 3 Activity Book >>> wf('English.txt') >>> print(open('English.txt').read()) It's all changed. It's all new.
以w模式打开文件后写入,会将原文件全部内容直接覆盖。
追加文件即在文本文件的末尾继续添加内容。对此,Python提供了追加(a)文件打开模式。这种模式不会覆盖原文件,其文件指针在打开文件后会位于文件末尾,用以继续添加内容。
# rw.py def af(fname,what): f=open(fname,'a') f.write(what)
运行结果为:
>>> ======================= RESTART: D:\PythonTestFile\rw.py ======================= >>> print(open('English.txt').read()) It's all changed. It's all new. >>> af('English.txt','This is new content') >>> print(open('English.txt').read()) It's all changed. It's all new.This is new content
指针位于原文件内容的最末尾,但不会指向下一行。如果需要换行以分隔新旧内容,可以在正式写入新内容前,先写入一个换行符:
# rw.py def af(fname,what): f=open(fname,'a') f.write('\n') #写入一个换行符 f.write(what)
与追加文件相对应的是在文件开头插入内容。对此,暂时没有可用的文件打开模式来直接完成该任务。但是我们可以通过拼接方式,将新旧内容合并,再写入文件。
# rw.py def inf(title,fname): f=open(fname,'r+') old=f.read() old=title+'\n'+old f.seek(0) #指针指向文件起始位置 f.write(old)
运行结果为:
>>> ======================= RESTART: D:\PythonTestFile\rw.py ======================= >>> print(open('English.txt').read()) Cambridge Primary English Stage 1 Learner's Book Cambridge Primary English Stage 1 Activity Book Cambridge Primary English Stage 2 Learner's Book Cambridge Primary English Stage 2 Activity Book Cambridge Primary English Stage 3 Learner's Book Cambridge Primary English Stage 3 Activity Book >>> inf('Here is the title.','English.txt') >>> print(open('English.txt').read()) Here is the title. Cambridge Primary English Stage 1 Learner's Book Cambridge Primary English Stage 1 Activity Book Cambridge Primary English Stage 2 Learner's Book Cambridge Primary English Stage 2 Activity Book Cambridge Primary English Stage 3 Learner's Book Cambridge Primary English Stage 3 Activity Book
文件打开模式r+表示读写文件,且指针一开始会位于文件起始位置。因为函数read()调用后,指针将移动到文件末尾,因此,f.seek(0)的作用是将文件指针再次指向文件起始位置。
因为修改后的内容比原内容要多,所以r+模式可以保证文件被完全重写。如果修改后的内容比原先更少,为保证不残留原文件内容,应该将合并后的内容写入新建文件。
以上代码中不能使用w+模式,该模式会在打开文件后,清空原有内容,成为一个新的空文件。其读写是指对这个空文件具有读写权限。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6