9–1. 文件过滤. 显示一个文件的所有行, 忽略以井号( # )开头的行. 这个字符被用做Python , Perl, Tcl, 等大多脚本文件的注释符号.附加题: 处理不是第一个字符开头的注释.
f=open('test.txt','r')
for eachline in f:
if eachline.startswith('#'):
continue
elif '#' in eachline:
loc=eachline.find('#')
print eachline[:loc]
else:
print eachline,
f.close()
9–2. 文件访问. 提示输入数字 N 和文件 F, 然后显示文件 F 的前 N 行.
N=int(raw_input('pls input a number:'))
F=raw_input('pls input a file name:')
f=open(F,'r')
alllines=f.readlines()
f.close()
for i in range(N):
print alllines[i],
9–3. 文件信息. 提示输入一个文件名, 然后显示这个文本文件的总行数.
F=raw_input('pls input a file name:')
f=open(F,'r')
alllines=f.readlines()
f.close()
print len(alllines)
9–4. 文件访问.
写一个逐页显示文本文件的程序. 提示输入一个文件名, 每次显示文本文件的 25 行, 暂停并向用户提示"按任意键继续.", 按键后继续执行.
import os
F=raw_input('pls input a file name:')
n=0
f=open(F,'r')
for i in f:
print i,
n+=1
if n==25:
n=0
os.system('pause')
f.close()
9-5 考试成绩,改进你的考试成绩问题(练习5-3和6-4),要求能从多个文件中读入考试成绩。文件的数据格式由你自己决定。
f=open('test.txt','r')
scores=[]
for i in f:
if 0<=int(i.strip())<=100:
scores.append(int(i.strip()))
if int(i.strip())<60:
print 'score is F' ,i
elif 60<=int(i.strip())<=69:
print 'score is D',i
elif 70<=int(i.strip())<=79:
print 'score is C',i
elif 80<=int(i.strip())<=89:
print 'score is B',i
elif 90<=int(i.strip())<=100:
print 'score is A',i
else:
print 'score wrong,please input again',i
f.close()
print 'average score is %f' %(sum(scores)//len(scores))
9–6. 文件比较. 写一个比较两个文本文件的程序. 如果不同, 给出第一个不同处的行号和列号.
F1=raw_input('pls input a file name:')
F2=raw_input('pls input a file name:')
f1=open(F1,'r')
f1alllines=f1.readlines()
f1.close()
f2=open(F2,'r')
f2alllines=f2.readlines()
f2.close()
len1=len(f1alllines)
len2=len(f2alllines)
smallfile=len1 if len1<=len2 else len2
for i in range(smallfile):
if cmp(f1alllines[i],f2alllines[i])!=0:
print 'row is %d ' %(i+1)
len3=len(f1alllines[i])
len4=len(f2alllines[i])
smallstr=len3 if len3<=len4 else len4
for j in range(smallstr):
if cmp(f1alllines[i][j],f2alllines[i][j])!=0:
print 'column is %d ' %(j+1)
break
break
else:
if len1==len2:
print '2 files equal'
else:
print 'row is %d ' %(i+2)
9–7. 解析文件. Win32 用户: 创建一个用来解析 Windows .ini 文件的程序. POSIX 用户:创建一个解析 /etc/serves 文件的程序. 其它平台用户: 写一个解析特定结构的系统配置文件的程序.
option={}
f=open(r'c:\windows\win.ini')
for line in f:
if line.startswith(';'):
continue
if line.startswith('['):
iterm=[]
name = line[1:line.rfind(']')]
option.setdefault(name,iterm)
continue
if '=' in line:
option[name].append(line.strip())
print option
9–8. 模块研究. 提取模块的属性资料. 提示用户输入一个模块名(或者从命令行接受输入).然后使用 dir() 和其它内建函数提取模块的属性, 显示它们的名字, 类型, 值.
m=raw_input('pls input a module name: ')
module=__import__(m)
ml=dir(module)
print ml
for i in ml:
print 'name: ',i
print 'type: ',type(getattr(module,i))
print 'value: ',getattr(module,i)
print
9–9. Python 文档字符串.
进入 Python 标准库所在的目录. 检查每个 .py 文件看是否有__doc__ 字符串, 如果有, 对其格式进行适当的整理归类. 你的程序执行完毕后, 应该会生成一个漂亮的清单. 里边列出哪些模块有文档字符串, 以及文档字符串的内容. 清单最后附上那些没有文档字符串模块的名字.附加题: 提取标准库中各模块内全部类(class)和函数的文档.
import os
pymodules={}
path=r'D:\Program Files\Python27\Lib'
pyfiles=[f for f in os.listdir(path) if f.endswith('.py')]
for f in pyfiles:
module=f[:-3]
pymodules.setdefault(module,'')
pyfile=path+os.sep+f
fobj=open(pyfile)
doc=False
for line in fobj:
if line.strip().startswith('"""') and line.strip().endswith('"""'):
pymodules[module]+=line
fobj.close()
break
elif (line.strip().startswith('"""') or line.strip().startswith('r"""')) and len(line)>3:
doc=True
pymodules[module]+=line
continue
elif doc:
if line=='"""':
pymodules[module]+=line
fobj.close()
doc=False
break
else:
pymodules[module]+=line
else:
continue
else:
fobj.close()
hasdoc=[]
nodoc=[]
for module in pymodules:
if pymodules[module]:
hasdoc.append(module)
else:
nodoc.append(module)
print 'module has no doc:'
for key in nodoc:
print key,
print '\n'
print 'module has doc:'
for key in hasdoc:
print 'module:',key
print 'doc:',pymodules[key]
9-10 不会
9–11. Web 站点地址.
a) 编写一个 URL 书签管理程序. 使用基于文本的菜单, 用户可以添加, 修改或者删除书签数据项. 书签数据项中包含站点的名称, URL 地址, 以及一行简单说明(可选). 另外提供检索功能,可以根据检索关键字在站点名称和 URL 两部分查找可能的匹配. 程序退出时把数据保存到一个磁盘文件中去; 再次执行时候加载保存的数据.