第13章:文件和流
大纲:
1.读文件和写文件
r:读
w:写
r+:文件可读写,如果文件不存在,会抛出异常,存在则会从当前位置写入新内容,通过seek函数可以改变当前位置,也就是改变文件的指针
w+:文件可读写,如果文件不存在,会创建一个新文件,存在则会清空文件,并写入新内容
a+:文件可读写,如果文件不存在,会创建一个新文件,存在则将新写入的内容加到原文件的后面,也就是说,使用a+打开已经存在的文件,文件指针已经在文件的结尾了
2.管道输出
3.读行和写行
4.使用FileInput对象读取文件
write(string):向文件写入内容,该函数会返回写入文件的字节数
read([n]):读取文件的内容,n是一个整数,表示从文件指针指定的位置开始读取的n个字节,如果不指定n,该函数会读取从当前位置往后的所有字节,该函数会返回读取的数据。
seek(n):重新设置文件指针,也就是改变文件的当前位置,如果使用write函数,需要使用seek(0)重置文件指针
close():关闭文件,对文件进行读写操作后,关闭文件是一个好习惯
(1)读文件和写文件
#以写模式打开test.txt文件
f=open('F:\\test1.txt','w')
#向test1.txt文件中写入“I love”
print(f.write("I love "))
print(f.write("python"))
f.close()
#以读模式打开test.txt文件
f=open('F:\\test1.txt','r')
print(f.read(7))
print(f.read(6))
f.close()
try:
f=open('F:\\test1.txt','r+')#不存在则抛出异常,存在则从当前位置写入
except Exception as e:
print(e)
finally:
f.close()
#不存在则创建一个新文件,存在则将新写入的内容加到原文件的后面
f=open('F:\\test1.txt','a+')
print(f.write('hello'))
f.close()
f=open('F:\\test1.txt','a+')
print('---1-----')
print(f.read())#为空,因为此致指针在末尾
f.seek(0)
print('---2-----')
print(f.read())
f.close()
try:
f = open('F:\\test1.txt', 'w+')#不存在则创建一个新文件,存在则会清空文件,并写入新内容
print(f.read())#为空
f.write('song')
f.seek(0)
print(f.read())
finally:
f.close()
(2)管道输出( | )
前一个命令的输出会作为后一个命令的输入
```python
#从标准输入读取所有的数据,并按行将数据保存在列表中,然后过滤出所有包含‘readme’的行,并输出这些行
import sys
import os
import re
#从标准输入读取所有的数据
text=sys.stdin.read()
files=text.split(os.linesep)#os.linesep 行分隔符
for file in files:
result=re.match('.*readme.*',file)
if result!=None:
print(file)
print('-------')
(3)读行与写行
import os
f=open('F:\\test1.txt','r+')
url=''
while True:
url=f.readline()
url=url.rstrip()#rstrip() 去掉前后空格
if url=='':
break
else:
print(url)
print('-----')
f.seek(0)
print(f.readline())
f.write('http://baidu.com'+os.linesep)#os.linesep 行分隔符
f.close()
f=open('F:\\test1.txt','a+')
urlList=['https://google.com'+os.linesep,'http://jd.com'+os.linesep]
f.writelines(urlList)
f.close()
print('-----')
(4)使用FileInput对象读取文件
readLines:全部读出到内存里,会占用大量内存
FileInput:会进入缓存,用多少出多少
import fileinput
fileobj=fileinput.input('F:\\test1.txt')#用于返回fileinput对象的
print(type(fileobj))
print(fileobj.readline().rstrip())#rstrip() 去掉前后空格
for line in fileobj:
line=line.rstrip()
if line !='':
print(fileobj.lineno(),':',line)#lineno() 行号
else:
print(fileobj.filename())