python核心编程v2.0 第9章习题答案(上)

1.
tr.txt放在项目目录下,eachline自带换行符,故在print后需要添加逗号。

if __name__ == '__main__':
    f = open('tr.txt','r')
    for eachline in f:
        if eachline[0]!='#':
            print eachline,

加上处理注释不出现在开头的情况,eg: doge # this is a dog

if __name__ == '__main__':
    f = open('tr.txt','r')
    for eachline in f:
        index = eachline.find('#')
        if index != -1:
            print eachline[0:index]
        else:
            print eachline,
    f.close

2.

if __name__ == '__main__':
    name = raw_input('file name :')
    number = int(raw_input('hangshu :'))
    f = open(name,'r')
    i = 0
    for eachline in f:
        if i <= number-1:
            print eachline,
        i = i+1
    f.close

3.
readlines函数会读取所有剩余的行然后返回一个字符串列表

if __name__ == '__main__':
    name = raw_input('file name :')
    f = open(name,'r')
    alllines = f.readlines()
    f.close
    print len(alllines)

4.
先将文件读到字符串数组alllines中,再按行数读取,分别处理整页部分及最后剩下不足一页的行

if __name__ == '__main__':
    name = raw_input('file name :')
    number = 3
    f = open(name,'r')
    pass
    alllines = f.readlines()
    #处理整页部分
    index = len(alllines)/number
    i = 0
    while i < index:
        j = i*number
        while j < i*number+number:
            print alllines[j],
            j = j+1
        if i != index-1:
            order = raw_input('press any key to continue')
            if order != '':
                i = i+1
            else:
                break
        else:
            i = i+1
    #处理最后剩下不足一页的部分
    order = raw_input('press any key to the rest part')
    if order != '':
        j = i*number
        while j < len(alllines):
            print alllines[j],
            j = j + 1

5.
在6-4的基础上改动完成,数据为一行以逗号隔开的字符串

#coding=utf-8
from __future__ import division #floor除法

def grade(number1) :
    grd = ''
    if 90<=number1<=100 :
        grd = 'A'
    elif 80<=number1<=89 :
        grd = 'B'
    elif 70<=number1<=79 :
        grd = 'C'
    elif 60<=number1<=69 :
        grd = 'D'
    elif number1<=60 :
        grd = 'F'
    else:
        print "not vaild"
    return grd

if __name__ == '__main__' :
    list = []
    while True:
        name = raw_input('filename:')
        if name == '':
            break
        else:
            f = open(name,'r')
            line = f.readline()
            li = line.split(',')
            #向序列添加序列使用extend函数
            list.extend(li)


    i = 0
    sum = 0
    while i < len(list):
        #list[i]此时是字符串,需要转化为int
        print grade(int(list[i]))
        sum = sum + int(list[i])
        i = i + 1
    print sum / len(list)

结果

filename:tr.txt
filename:ar.txt
filename:
F
C
F
F
F
F
F
B
39.125

6.
未处理文件行数不一样的情况。未处理每行字符串的长短比较问题,若需要处理,可以在较短的文本处补空格,处理为长度完全相同的两个文本。

def compare(str1,str2):
    i = 0
    while i < len(str1):
        if str1[i] != str2[i]:
            return i
            break
        else:
            i = i+1
    else:
        return 'same'

if __name__ == '__main__':
    f1 = open('ar.txt','r')
    f2 = open('tr.txt','r')
    allline1 = f1.readlines()
    allline2 = f2.readlines()

    i = 0
    while i <len(allline1):
         #每行比较,若有不同返回index
         index = compare(allline1[i],allline2[i])
         if index != 'same':
             print i,index
             break
         else:
             i = i+1
    else:
        print 'same'

7.

if __name__ == '__main__':
    option={}
    f=open('c:\windows\win.ini','r')
    for line in f:
        if line.startswith(';'):
            print line,
        if line.startswith('['):
            print line,
        if '=' in line:
            li = line.split('=')
            option[li[0]]=li[1]
    f.close()
    print option

结果:

; for 16-bit app support
[fonts]
[extensions]
[mci extensions]
[files]
[Mail]
[Aliim]
{'MAPIXVER': '1.0.0.1\n', 'CMCDLLNAME32': 'mapi32.dll\n', 'MAPI': '1\n', 'CMC': '1\n', 'MAPIX': '1\n', 'OLEMessaging': '1\n', 'ImageManClear': '1\n'}

8.
参考了网上的博客,dir()函数显示对象的属性,getattr()用于返回一个对象属性或者方法

if __name__ == '__main__':
    name = raw_input('module')

    module = __import__(name)
    ml = dir(module)
    print ml
    for i in ml:
        print 'name: ', i
        print 'type: ', type(getattr(module, i))
        print 'value: ', getattr(module, i)

9.
网上的答案是在py文档中查找了doc字符串。检查了几个py文件发现没有规则的doc(Lib中),选择输出的是py文件属性中的__doc,如第8题的属性一样。也可以直接在py文件中通过找三引号的方式来查找文档字符串

import os.path

if __name__ == '__main__':
    #进入到python标准库内
    path = 'D:/python/pythoninstall/Lib/'
    os.chdir(path)
    cwd = os.getcwd()

    #列出在path路径下以py结尾的文件
    pyfiles = [f for f in os.listdir(path) if f.endswith('.py')]

    db={}

    for y in pyfiles:
        dirfile = dir(y)
        # print y.__doc__
        state = getattr(y,'__doc__','defalut')
        db[y] = state

    for key in db:
        print key,db[key]

查找类及函数的直接在py文档中找的class和def

#coding=utf-8
import os
import os.path

if __name__ == '__main__':
    #进入到python标准库内
    path = 'D:/python/pythoninstall/Lib/'
    os.chdir(path)
    cwd = os.getcwd()

    #列出在path路径下以py结尾的文件
    pyfiles = [f for f in os.listdir(path) if f.endswith('.py')]

    db={}
    dbdef={}

    for y in pyfiles:
        st = ''
        stdef=''
        f = open(y)
        for lines in f:
            if lines.startswith('class'):
                st = st+lines
            if lines.startswith('def'):
                stdef = stdef+lines
        f.close()
        db[y] = st
        dbdef[y] = stdef

    for key in db:
        print key,db[key]
    for keys in dbdef:
        print keys,dbdef[keys]

10.
暂时没什么做GUI的需求,就不写图形界面了。只写逻辑。只写了储蓄的,如果需要加上支票,金融等,可以在类里面扩充。在每次写入文件前会保存一个变量的temp做备份。如果取消或发生情况,会使用该temp。不是很完善

class chuxu:
    def __init__(self,money,jie,dai):
        self.money = money
        self.jie = jie
        self.dai = dai

    def cunkuan(self,cunkuan):
        self.money = self.money + cunkuan
        return self.money

    def qukuan(self,qukuan):
        self.money = self.money - qukuan
        return self.money

    def jiekuan(self,jiekuan):
        self.jie  = self.jie + jiekuan
        self.money = self.money + jiekuan
        return self.money,self.jie

    def daikuan(self,daikuan):
        self.dai  = self.dai + daikuan
        self.money = self.money + daikuan
        return self.money,self.dai

    def save(self,file):
        f = open(file,'w')
        f.write(str(self.money)+'\n')
        f.write(str(self.jie)+'\n')
        f.write(str(self.dai)+'\n')
        f.close()

    def quxiao(self,money,daikuan,jiekuan):
        self.money = money
        self.dai = daikuan
        self.jie = jiekuan
        return self.money,self.dai,self.jie

if __name__ == '__main__':

    user = chuxu(1000,0,0)
    tempmoney = user.money
    tempjie = user.jie
    temdai = user.dai
    index = True
    while index:
        print 'cunkuan:c'
        print 'qukuan:q'
        print 'jiekuan:j'
        print 'daikuan:d'
        print 'cancel:a'
        print 'quit: other key '
        order = raw_input('order:')
        if order == 'c':
            cunkuan = int(raw_input('cunkuan:'))
            money = user.cunkuan(cunkuan)
            print 'now money is %d' % money

        elif order == 'q':
            qukuan = int(raw_input('qukuan:'))
            money = user.qukuan(qukuan)
            print 'now money is %d' %money

        elif order == 'j':
            jiekuan = int(raw_input('daikuan:'))
            (money, jie) = user.jiekuan(jiekuan)
            print 'now money is %d and jiekuan is %d' % (money, jie)

        elif order == 'd':
            daikuan = int(raw_input('daikuan:'))
            (money, dai) = user.daikuan(daikuan)
            print 'now money is %d and daikuan is %d' % (money ,dai)

        elif order == 'a':
            (money ,jie ,dai ) = user.quxiao(tempmoney,tempjie,temdai)
            print money,jie,dai

        else:
            tempmoney = user.money
            tempjie = user.jie
            temdai = user.dai
            user.save('tr.txt')
            index = False

11.
在html文件那里应该将网址处理为html格式定义的,本代码未做处理直接写的字符串
正则表达式留在后面学习了这部分再做补充

#coding = utf-8

def readfile():
    f = open('tr.txt', 'r')
    record = f.readlines()

    li = []
    for i in record:
        i = i.rstrip()
        li.append(i.split(','))
    return li

def savefile(lis):
    f = open('tr.txt','w')
    for i in lis:
        for j in range(len(i)):
            f.write(str(i[j]))
            if j != len(i)-1:
                f.write(',')
        f.write('\n')
    f.close()

if __name__ == '__main__':

    index = True
    while True:
        lis = readfile()
        print 'add:a'
        print 'fix:b'
        print 'delete:d'
        print 'find:f'
        print 'html:h'
        print 'wenjia:w'
        order = raw_input('order:')
        if order == 'a':
            li = []
            if len(lis)!= 0:
                num = int(lis[len(lis)-1][0])+1
            else:
                num = 1
            name = raw_input('name:')
            url = raw_input('url:')
            statement = raw_input('state:')
            li.append(num)
            li.append(name)
            li.append(url)
            li.append(statement)
            lis.append(li)
            savefile(lis)
            print 'add suceessfully'

        elif order == 'b':
            for i0 in lis:
                print i0
            order = int(raw_input('choose which to fix'))-1
            name = raw_input('name:')
            url = raw_input('url:')
            statement = raw_input('state:')
            lis[order][1] = name
            lis[order][2] = url
            lis[order][3] = statement
            savefile(lis)
            print 'fix suceessfully'

        elif order == 'd':
            for i0 in lis:
                print i0
            order = int(raw_input('choose which to delete'))-1
            lis.remove(lis[order])
            savefile(lis)
            print 'delete suceessfully'

        elif order == 'f':
            name = raw_input('name:')
            url = raw_input('url:')
            for i1 in lis:
                if i1[1] == name and i1[2] == url:
                    print i1
                    break
                else:
                    print 'have no such mark'

        elif order == 'h':
            html = open('tr.html','w')
            html.write('<html>'+'\n')
            html.write('<head>'+'\n')
            html.write('<meta charset="UTF-8">'+'\n')
            html.write('<title>'+'mark'+'</title>'+'\n')
            html.write('</head>' + '\n')
            html.write('<body>' + '\n')

            for i2 in lis:
                html.write('<p>')
                for j in range(len(i2)):
                    html.write(str(i2[j]))
                    if j != len(i2) - 1:
                        html.write(',')
                html.write('</p>'+'\n')
            html.write('</body>'+'\n')
            html.write('</html>'+'\n')
            html.close()

        elif order == 'w':
            for i0 in lis:
                print i0
            order = raw_input('choose which to put in one file').split(',')
            orderli = []
            for i3 in order:
                orderli.append(int(i3)-1)

            filename = raw_input('filename:')
            fil = open(filename,'w')
            for i4 in orderli:
                for i5 in range(len(lis[i4])):
                    fil.write(str(lis[i4][i5]))
                    if i5!= len(lis[i4])-1:
                        fil.write(',')
                fil.write('\n')
            fil.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值