一、打开文件
1.要打开文件,使用函数open,它位于自动导入的模块io中。函数open将文件名作为唯一必不可少的参数,并返回一个文件对象。
f = open('somefile.txt')
如果文件位于其他地方,可指定完整的路径。如果指定的文件不存在,则会报错。
2.文件模式
值 | 描述 |
---|---|
‘r’ | 读取模式(默认值) |
‘w’ | 写入模式 |
‘x’ | 独占写入模式 |
‘a’ | 附加模式(在既有文件末尾继续写入) |
‘b’ | 二进制模式(与其他模式结合使用) |
‘t’ | 文本模式(默认值,与其他模式结合使用) |
‘+’ | 读写模式(与其他模式结合使用) |
二、文件的基本方法
1.读取和写入
1.1写入数据到文件
f = open('somefile.txt', 'w')
f.write('Hello, ')
f.write('World!')
f.close()
1.2读取文件数据
f = open('somefile.txt', 'r')
print(f.read(4)) #可以根据需要指定读取多少个字符(在二进制模式下是多少字节),接下来读取文件中余下的全部内容(不指定要读取多少个字符)
print(f.read())
1.3随机存取(可在文件中移动,只访问感兴趣的部分)
方法seek(offset[, whence])将当前位置(执行读取或写入的位置)移到offset和whence指定的地方。参数offset指定了字节(字符)数,而参数whence默认为io.SEEK_SET(0),这意味着偏移量是相对于文件开头的(偏移量不能为负数)。参数whence还可设置为io.SEEK_CUR(1)或io.SEEK_END(2),其中前者表示相对于当前位置进行移动(偏移量可以为负),而后者表示相对于文件末尾进行移动。
f = open('E:\python-code\somefile.txt', 'w') #在写入模式下打开文件时,就有内容将被删除(截断)并从文件开头出开始写入,如果要在既有文件末尾继续写入可使用附加模式 'a'
f.write('01234567890123456789')
print(f.seek(5))
f.write('Hello, World!')
f.close()
f = open('E:\python-code\somefile.txt')
print(f.read())
方法tell()返回当前位于文件的什么位置
f = open('E:\python-code\somefile.txt') #调用open时, 原本可以不指定模式,因为其默认值就是'r'
print(f.read(3))
print(f.read(2))
print(f.tell()) #输出 5
f.close()
f = open('E:\python-code\somefile.txt', 'w') #在写入模式下打开文件时,就有内容将被删除(截断)并从文件开头出开始写入,如果要在既有文件末尾继续写入可使用附加模式 'a'
f.write('01234567890123456789')
print(f.seek(5))
f.write('Hello, World!')
f.close()
2.读取和写入行
方法readline()读取文件中的一行(从当前位置到下一个分行符的文本)。
方法readlines()读取文件中的所有行,并以列表的方式返回它们。
方法writelines()接受一个字符串列表(实际上,可以是任何序列或可迭代对象),并将这写字符串都写入到文件中。注意:写入时不会添加换行符,必须自行添加。
with open('somefile.txt') as f:
for line in f.readlines():
print(line)
输出结果:
this
isn't a
haiku
输出结果中行与行之间多了一个空行,因为文件每一行的默认都有换行符,而print()方法也会输出换行,所以就多了一个空行。可以使用line.rstrip()去除字符串右边的换行符,也可以通过print(line, end=’’)避免print方法造成的换行。
3.关闭文件
对于写入过的文件,一定要将其关闭,因为Python可能缓冲你写入的数据(将数据暂时存储在某个地方,以提高效率)。因此如果程序一旦因某种原因崩溃,数据可能根本不会写入到文件中。安全做法是,使用完文件后就将其关闭。
要确保文件得以关闭,可使用一条try/finally语句,并在finally子句中调用close。
#在这里打开文件
try:
#将数据写入到文件中
finally:
file.close()
实际上,with语句是专门为此设计的语句
with open('somefile.txt') as somefile: #with语句能够打开文件并将其赋给一个变量。在语句体,将数据写入文件。到达该语句末尾时,将自动关闭文件,即便出现异常亦如此。
do_something(somefile)
4.使用文件的基本方法
f = open('E:\python-code\somefile.txt')
print(f.read(7))
print(f.read(4))
f.close()
f = open('E:\python-code\somefile.txt')
print(f.read()) #一次读入所有的内容,返回一个str
f.close()
f = open('E:\python-code\somefile.txt')
for i in range(3):
print(str(i) + ': ' + f.readline(), end='') #按行读取
f.close()
import pprint
pprint.pprint(open('E:\python-code\somefile.txt').readlines()) #readlines()读取文件中的所有行,并以列表的形式返回它们
使用pprint()输出结果:
['Welcome to this file\n',
'There is nothing here except\n',
'This stupid haiku']
末尾有换行符
f = open('E:\python-code\somefile.txt', 'w')
f.write('this\nis no\nhaiku')
f.close()
f = open('E:\python-code\somefile.txt')
lines = f.readlines()
f.close()
lines[1] = "isn't a\n" #修改了第二行
f = open('E:\python-code\somefile.txt', 'w')
f.writelines(lines)
f.close()
三、迭代文件内容
注:使用一个名为process的虚构函数来表示对每个字符或行所做的处理。
def process(string):
print('Processing:', string)
1.每次一个字符(或字节)
with open(filename) as f:
char = f.read(1) # 如果每次读取多个字符(字节), 可指定要读取的字符(字符)数。
while char: #当到达文件末尾时,方法read()将返回一个空字符串。
process(char)
char = f.read(1)
with open(filename) as f: #另一实现方式,较之上例,没有代码重复,更优雅
while True:
char = f.read(1)
if not char: break
process(char)
2.每次一行
with open(filename) as f:
while True:
line = f.readline()
if not line: break
process(line)
3.读取所有内容(文件大不适合)
with open(filename) as f: #使用read 迭代字符,方法read不提供任何参数,将整个文件读取到一个字符串中
for char in f.read():
process(char)
with open(filename) as f: #使用readlines迭代行
for line in f.readlines(): #优先使用for循环
process(line)
4.使用fileinput实现延迟行迭代
import fileinput
for line in fileinput.input(filename):
process(line)
四、文件迭代器(最常见的方法)
with open(filename) as f:
for line in f:
process(line)
for line in open(filename): #在不将文件对象赋给变量的情况下迭代文件
process(line) #python负责程序退出时自动关闭文件对象,只要不再写入文件