Python

Python 知识量:10 - 41 - 150

8.3 文本文件><

逐行读取- 8.3.1 -

处理文件的基本步骤一般是: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的设置,每打印一行文字将多出一空行。

文件打开模式- 8.3.2 -

Python的文件打开模式如下所示:

字符含义
r只读模式(默认)。文件指针位于文件的开头。
w写入模式。以清空原文件的方式写入;文件不存在就创建新文件。
a追加模式。文件指针位于文件的结尾。如果文件不存在,就创建新文件。
r+不清空写入的读写模式,指针位于文件的开头,写入多少就从开头覆盖多少。
w+清空写入的读写模式。
a+追加写入的读写模式。
b二进制模式。

以上模式中,二进制模式b还可以分为rb、wb、ab、rb+、wb+、ab+等,是二进制下的各类模式。

整体读取- 8.3.3 -

整体读取就是将文本文件作为一个大型字符串进行读取。

# 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())

写入文件- 8.3.4 -

如果要写入文本文件,只需要将文件打开模式设为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模式打开文件后写入,会将原文件全部内容直接覆盖。

追加文件- 8.3.5 -

追加文件即在文本文件的末尾继续添加内容。对此,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)

在文件开头插入内容- 8.3.6 -

与追加文件相对应的是在文件开头插入内容。对此,暂时没有可用的文件打开模式来直接完成该任务。但是我们可以通过拼接方式,将新旧内容合并,再写入文件。

# 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+模式,该模式会在打开文件后,清空原有内容,成为一个新的空文件。其读写是指对这个空文件具有读写权限。