python 文件

一、打开文件
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负责程序退出时自动关闭文件对象,只要不再写入文件

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值