第九章 文件和输入输出
1.open()函数
内建函数 open()提供了初始化输入\输出操作的通用接口。open()成功打开文件后会返回一个文件对象,否则引发一个错误
file_object=open(file_name,access_mode='r',buffering=-1)
file_name是包含要打开的文件的名字字符串(可以是相对路径或绝对路径。)
access_mode也是一个字符串,代表文件打开的模式(默认为‘r’)。(文件使用模式‘r’、‘w’、‘a’分别代表读取、写入、和追加,'U'代表通用换行符支持。)。
‘r’、‘U’模式打开的文件必须是已经存在的,‘w’模式打开的文件若存在则先清空,然后重新创建。‘a’模式打开的文件是为追加数据准备的,所有写入数据追加至文件末尾。若文件不存在,则自动创建。
buffering用于指示文件采用的缓冲方式。0表示不缓冲,1表示只缓冲一行数据。
2.输入
read()用来读取字节到字符串中,最多读取给定数目个字节。
readline()读取打开文件的一行(读取下个行结束符之前的所有字节),然后整行(包括行结束符)作为一个人字符串返回。
readlines()读取所有行,然后把它们作为一个字符串列表返回。
3.输出
write() 把含有文本数据或二进制数据块的字符串写到文件中去。
writelines() 和readlines一样,是针对列表的操作,接受一个字符串列表作为参数,将它们写入文件。行结束符并不会自动加入,必须在调用writelines()之前,给每行结尾加上行结束符。
4.文件内移动
seek(off,whence) 可以在文件中移动文件指针到不同的位置。从whence(0:文件起始,1:当前位置,2:文件末尾)开始偏移off字节。
text()告诉你当前文件指针在文件中的位置。
5.文件迭代
for eachline in f: //一行 一行访问文件(文件迭代比readlines()更高效)
6.其他
close() 关闭文件,结束访问
fileno() 返回打开文件的描述符。
flush() 直接把内部缓冲区的数据写入文件。
truncate(size) 截取文件到最大size字节,默认为当前位置。
7.os模块
可以仔细看一下书上的例子,里面的各个方法都在书上的表里。
习题
9.1文件过滤。显示一个文件的所有行,忽略以#号开头的行
fobj=open('test_9_1.txt','r')
for eachline in fobj:
if eachline[0]=='#':
continue
else:
print eachline,
附加题只需再加一个for循环遍历每一行即可。
9.2文件访问,提示输入数字N和文件F,然后显示文件的前N行。
N=int(raw_input('enter the number N:'))
filename=raw_input('enter the filename:')
fobj=open(filename,'r')
for i in range(N):
print fobj.readline(),
9.3文件信息。提示输入一个文件名,然后显示总行数。
filename=raw_input('enter a file name:')
fobj=open(filename,'r')
List=fobj.readlines()
print 'the rows of this file is:',len(List)
9.4文件访问,写一个逐页显示文本文件的程序,提示输入文件名,每次显示25行,暂停并向用户提示按任意键继续
filename=raw_input('输入文件名:')
i=0
fobj=open(filename,'r')
for eachline in fobj:
print eachline,
i+=1
if(i==24):
stop=raw_input('按任意键继续')
i=0
9.6 文件比较,写一个比较两个文件的程序,若果不同,给出第一个不同处的行号和列号。
(这里有个问题,题目应该默认两个文本行数和每行长度都会一样的吧,所以我就这么写了。)
不太明白题目的意思,不过搜了一下程序,并不难。
(这里有个问题,题目应该默认两个文本行数和每行长度都会一样的吧,所以我就这么写了。)
fobj1=open('9_6_1.txt','r')
fobj2=open('9_6_2.txt','r')
List1=fobj1.readlines()
List2=fobj2.readlines()
result=[]
for i in range(len(List1)):
for j in range(len(List1[i])):
if List1[i][j]!=List2[i][j]:
print '第一个不同处位于第',i+1,'行第',j+1,'列'
break
9.7解析文件。协议额解析特定结构的系统配置文件的程序。
不太明白题目的意思,不过搜了一下程序,并不难。
def parseIni(filename):
f=open(filename,'r')
dict1={}
for eachLine in f:
index=eachLine.find('=');
if index!=-1:
key=eachLine[:index].strip()
value=eachLine[index+1:].strip()
dict1[key]=value
for key in dict1:
print key,'=',dict1[key]
f.close()
parseIni('desktop.ini')
9.8模块研究。提取模块的属性资料。
先介绍两个函数
(1)str()
你可以使用内建的dir
函数来列出模块定义的标识符。标识符有函数、类和变量。
当你为dir()
提供一个模块名的时候,它返回模块定义的名称列表。如果不提供参数,它返回当前模块中定义的名称列表。
作用:返回object的名称为name的属性的属性值,如果属性name存在,则直接返回其属性值;如果属性name不存在,则触发AttribetError异常或当可选参数default定义时返回default值。
name = raw_input('module name: ')
obj = __import__(name)
List=dir(obj)
for item in List:
print 'name:',item,
print 'type:',type(item),
print 'value',getattr(obj,item)
9.9 Python文档字符串。进入Python标准库所在的目录....(题目越来越难啊.....)
import os
bpath=r'c:\python27\lib'#r表示保持字符串原始意思,不对其进行转义。
files=os.listdir(bpath)
List1=[]
List2=[]
i=0
for eachfile in files:
if os.path.splitext(eachfile)[1]=='.py':
mpath=os.path.join(bpath,eachfile)
filename=open(mpath,'r')
sign='_doc_'
for eachline in filename:
if eachline.find(sign)!=-1:
List1.append(os.path.basename(mpath))
break
if i==len(List1):
List2.append(os.path.basename(mpath))
i=len(List1)
print '含有‘_doc_’字符串的.py文件有:'
for i in List1:
print i
print '不含‘_doc_’字符串的.py文件有:'
for j in List2:
print j