• python之道08


    1.有如下文件,a1.txt,里面的内容为:


    某某是最好的学校,

    全心全意为学生服务,

    只为学生未来,不为牟利。

    我说的都是真的。哈哈


    分别完成以下的功能:

    a,将原文件全部读出来并打印。

    答案

    f = open('a1.txt',mode='r')
    print(f.read())
    f.close()
    '''
    输出结果
    老男孩是最好的学校,
    全心全意为学生服务,
    只为学生未来,不为牟利。
    我说的都是真的。哈哈
    
    '''
    

    b,在原文件后面追加一行内容:信不信由你,反正我信了。

    答案

    f = open('a1.txt',mode='a')
    f.write('信不信由你,反正我信了')
    f.close()
    '''
    老男孩是最好的学校,
    全心全意为学生服务,
    只为学生未来,不为牟利。
    我说的都是真的。哈哈信不信由你,反正我信了
    '''
    
    

    c,将原文件全部读出来,并在后面添加一行内容:信不信由你,反正我信了。

    答案

    f = open('a1.txt',mode='r+')
    f.read()
    f.write('信不信由你,反正我信了')
    f.close()
    '''
    老男孩是最好的学校,
    全心全意为学生服务,
    只为学生未来,不为牟利。
    我说的都是真的。哈哈信不信由你,反正我信了
    '''
    

    d,将原文件全部清空,换成下面的内容:


    每天坚持一点,

    每天努力一点,

    每天多思考一点,

    慢慢你会发现,

    你的进步越来越大。

    答案

    f = open('a1.txt',mode='w')
    f.write('''
    每天坚持一点,
    
    每天努力一点,
    
    每天多思考一点,
    
    慢慢你会发现,
    
    你的进步越来越大。
    ''')
    f.close()
    

    2.有如下文件,t1.txt,里面的内容为:


    葫芦娃,葫芦娃,

    一根藤上七个瓜

    风吹雨打,都不怕,

    啦啦啦啦。

    我可以算命,而且算的特别准:

    上面的内容你肯定是心里默唱出来的,对不对?哈哈


    分别完成下面的功能:

    a,以r的模式打开原文件,利用for循环遍历文件句柄。

    答案

    f = open('t1.txt',mode='r')
    for i in f:
        print(i)
    f.close()
    

    b,以r的模式打开原文件,以readlines()方法读取出来,并循环遍历 readlines(),并分析b,与c 有什么区别?深入理解文件句柄与 readlines()结果的区别。

    c,以r模式读取‘葫芦娃,’前四个字符。

    答案

    b.
    f = open('t1.txt',mode='r')
    print(f.readlines())
    f.close()
    '''
    ['葫芦娃,葫芦娃,
    ', '
    ', '一根藤上七个瓜
    ', '
    ', '风吹雨打,都不怕,
    ', '
    ', '啦啦啦啦。
    ', '
    ', '我可以算命,而且算的特别准:
    ', '
    ', '上面的内容你肯定是心里默唱出来的,对不对?哈哈']
    '''
    
    c. 
    f = open('t1.txt',mode='r')
    print(f.read(4))
    f.close()
    '''
    葫芦娃,
    '''
    
    b,与c 有什么区别:
    1. readlines()一行一行读取全部文件,且结尾会有换行符
    
    2. read()是一口气读取全部内容,如果文件文很大容易内存溢出
    

    d,以r模式读取第一行内容,并去除此行前后的空格,制表符,换行符。

    答案

    f = open('t1.txt',mode='r')
    f1 = f.readline().strip().split('
    ')
    print(f1)
    f.close()
    '''
    ['葫芦娃,葫芦娃,']
    '''
    
    

    e,以a+模式打开文件,先追加一行:‘老男孩教育’然后在从最开始将 原内容全部读取出来。

    答案

    f = open('t1.txt',mode='a+')
    f.write('
    '+'老男孩教育')
    f.seek(0)
    print(f.read())
    f.close
    '''
    葫芦娃,葫芦娃,
    
    一根藤上七个瓜
    
    风吹雨打,都不怕,
    
    啦啦啦啦。
    
    我可以算命,而且算的特别准:
    
    上面的内容你肯定是心里默唱出来的,对不对?哈哈
    
    老男孩教育
    '''
    
    

    3.文件a.txt内容:每一行内容分别为商品名字,价钱,个数。


    apple 10 3

    tesla 100000 1

    mac 3000 2

    lenovo 30000 3

    chicken 10 3


    通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。

    答案

    lis = []
    key_list = ['name','price','amount']
    num = 0
    with open('a.txt',mode='r') as f:
        for l in f:
            l_list = l.strip().split()
            dic = {key_list[0]:l_list[0],key_list[1]:l_list[1],key_list[2]:l_list[2]}
            lis.append(dic)
            num = num + int(l_list[1]) * int(l_list[2])
    print(lis)
    print('总价格为:',num)
    
    '''
    [{'name': 'apple', 'price': '10', 'amount': '3'}, {'name': 'tesla', 'price': '100000', 'amount': '1'}, {'name': 'mac', 'price': '3000', 'amount': '2'}, {'name': 'lenovo', 'price': '30000', 'amount': '3'}, {'name': 'chicken', 'price': '10', 'amount': '3'}]
    总价格为: 196060
    '''
    

    4.有如下文件:


    alex是老男孩python发起人,创建人。

    alex其实是人妖。

    谁说alex是sb?

    你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。


    将文件中所有的alex都替换成大写的SB(文件的改的操作)。

    答案

    with open('a.txt',mode='r') as f,
        open('a.txt_bak',mode='w+') as f2,
        open('new_a.txt',mode='a') as f1:
    
        for i in f:
            content = i.replace('alex','SB')
            f1.write(content)
    import os
    os.rename('./a.txt_bak','a.txt')
    os.rename('new_a.txt','a.txt')
    

    5.文件a1.txt内容(升级题)


    name:apple price:10 amount:3 year:2012

    name:tesla price:100000 amount:1 year:2013



    .......


    通过代码,将其构建成这种数据类型:

    [{'name':'apple','price':10,'amount':3,year:2012},

    {'name':'tesla','price':1000000,'amount':1}......]

    并计算出总价钱。

    答案

    # 方法一:
    
    lis = []
    my_sum = 0
    with open('a1.txt',mode='r') as f:
        for i in f:
            x = i.split()
            dic1 = {}
            for i1 in x:
                k = i1.split(':')[0]
                v = i1.split(':')[1]
                dic1[k]=v
            lis.append(dic1)
    print(lis)
    for em in lis:
        sum = int(em['price'])* int(em['amount'])
        my_sum += sum
    print(my_sum)
    
    '''
    输出结果
    [{'name': 'apple', 'price': '10', 'amount': '3', 'year': '2012'}, {'name': 'tesla', 'price': '100000', 'amount': '1', 'year': '2013'}]
    100030
    '''
    
    # 方法二:
    result_list=[]
    sum=0
    with open('a1.txt',encoding='gbk') as f:
        for line in f:
            line_list=line.strip().split()
            d={}
            for i in line_list:
                key, value=i.split(':')
                if value.isdecimal():
                    value=int(value)
                d.setdefault(key,value)
            sum+=d['price']*d['amount']
            result_list.append(d)
    print(result_list)
    print(sum)
    '''
    输出结果
    [{'name': 'apple', 'price': 10, 'amount': 3, 'year': 2012}, {'name': 'tesla', 'price': 100000, 'amount': 1, 'year': 2013}]
    100030
    '''
    

    6.文件a1.txt内容(升级题)


    序号 部门 人数 平均年龄 备注

    1 python 30 26 单身狗

    2 Linux 26 30 没对象

    3 运营部 20 24 女生多


    .......


    通过代码,将其构建成这种数据类型:

    [{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},

    ......]

    答案

    # 方法一
    l1 = []
    dic = {}
    with open('a1.txt',mode='r') as f:
        f1 = f.readline()
        for i in f:
            a= i.split()
            # print(a)
            dic={'序号':a[0],'部门':a[1],'人数':a[2],'平均年龄':a[3],'备注':a[4]}
            l1.append(dic)
    print(l1)
    '''
    输出结果
    [{'序号': '1', '部门': 'python', '人数': '30', '平均年龄': '26', '备注': '单身狗'}, {'序号': '2', '部门': 'Linux', '人数': '26', '平均年龄': '30', '备注': '没对象'}, {'序号': '3', '部门': '运营部', '人数': '20', '平均年龄': '24', '备注': '女生多'}]
    '''
    # 方法二
    count=0
    keys_list=[]
    class_list=[]
    result_list=[]
    with open('a1.txt',encoding='gbk') as f:
        for line in f:
            count += 1
            if count==1:
                keys_list=line.strip().split()
                continue
            else:
                class_list=line.strip().split()
            d = {}
            for j in range(len(keys_list)):
                if class_list[j].isdecimal():
                    d.setdefault(keys_list[j],int(class_list[j]))
                else:
                    d.setdefault(keys_list[j], class_list[j])
            result_list.append(d)
        print(result_list)
    
    '''
    [{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'}]
    '''
    # 方法三:
    
    思绸之路(附代码)
    '''
    再看一遍要求哇,原来的文件是以下这种的
    a1.txt原文件:
    序号 部门 人数 平均年龄 备注
    1 python 30 26 单身狗
    2 Linux 26 30 没对象
    3 运营部 20 24 女生多
    
    要求: 让你给处理成在种的,仔细看两遍,发现里头有[]这么个玩意儿,人家起名叫列表,最后头还有几个...意思是后面还有很多在样的信息,只要往进加就能处理的了,一句话:能扩展,做哇
    [{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'}...]
    
    
    1.首先,要处理成列表形式的,那就得先得有个列表[]哇
    
    l1 = [] # 前定义一个空的列表,然后打开人家给的那个文件
    
    with open('a1.txt',mode = 'r', encoding = 'utf-8')    # 这串串意思是要打开一个叫a1.txt的文件, 打开方式是读取,意思是不能修改,只能读, 编码用的是utf-8, 一般都用这个就行了.
    
    2. 看第一行行,仔是一个表头:序号 部门 人数 平均年龄 备注 是砸们暂时不需要用到的,先办了他,怎么办?老办法,掐头去尾,把他两边的空格去掉以空格分隔(.strip().split()),处理成了一个列表的形式,列表好控制,字典也是,后头肯定都能用,然后让光标往下挪挪,就是再从第二行开始处理
    title = f.readline().strip().split()
    
    
    3. 按照2的想法,接下来把剩下的也给她处理了,前循环读她
    for i in f:
    	lis = i.strip().split()
    	print(lis)
    因为split处理完字符串,且只能给字符串进行处理,之后会变成一个列表,咋们看看处理成的这个列表是个什样子了
    咦,变成个在种的了:
    她:
    ['1', 'python', '30', '26', '单身狗']
    ['2', 'Linux', '26', '30', '没对象']
    ['3', '运营部', '20', '24', '女生多']
    
    4. 一看上头的又不知道该咋处理她了,似乎离目标越来越远了
    回头想一想,那个title被处理成什个样子了黑没看了,咱们就前看一看
    print(title)
    咦,是个在种的:
    他:
    ['序号', '部门', '人数', '平均年龄', '备注']
    
    仔细看看好像跟上头的有点儿规律了,对应要处理成的样子,索引都是一一对应的,索引就是'1'在的位置跟'序号'在的位置好像是一样的,都是第一个也就是0,因为位置是从0开始么,后头也对应
    
    5. 
    然后开始循环她们的位置,从0开始怎么循环?当然是for,位置的数量你不知道有多少,因为后头还有很多可能,那就len她,len谁?len 信息最多的那个,还要扩展的那个,因为就她要扩展,就她后来要增加信息
    for em in range(len()):
    循环出来了,看看她都有那些数量?
    	print(em,end='')
    咦,发现是个在种的:
    012340123401234
    什么意思? 就是看上头那个信息最多的什么单身狗之类那个,是不是有3个列表,每个里头都循环一个遍,每个里头都是从0开始到4结束,一共5个数字,3个表就3回,所以是上头是那么一串串数字
    
    6. 
    接下来咋闹呀?
    他的位置就是她的位置,她是0,那他也是个0,再看看要求,人家是要处理成一个大列表,里头还包括一堆字典,那得先闹个字典出来哇,咱们先定义一个字典
    dic1 = {}
    dic1[title[em]] = lis[em] 这个就充分体现了,他的位置等于她的位置,也就是字典的创建的中键值对.
    然后咱们看看这个字典是个什么样子的:
    {'序号': '1', '部门': 'python', '人数': '30', '平均年龄': '26', '备注': '单身狗'}
    {'序号': '2', '部门': 'Linux', '人数': '26', '平均年龄': '30', '备注': '没对象'}
    {'序号': '3', '部门': '运营部', '人数': '20', '平均年龄': '24', '备注': '女生多'}
    咦,是3个列表而且好像他们都归位了,而且放的还刚刚好
    
    7. 别忘了,人家是要把所有的字典都放在一个列表当中的,咱们最早定义的那个l1的列表终于排上用途了
    l1.append(dic1)
    在种已操作,字典他就进去了,进去了...进到哪里去了? 进到列表了,额...是我想太多,
    看效果:
    [{'序号': '1', '部门': 'python', '人数': '30', '平均年龄': '26', '备注': '单身狗'}, {'序号': '2', '部门': 'Linux', '人数': '26', '平均年龄': '30', '备注': '没对象'}, {'序号': '3', '部门': '运营部', '人数': '20', '平均年龄': '24', '备注': '女生多'}]
    嗯对比对对比上头人家要求的,好像是这个样子,但是再看看,数字每个囊头都有引号,好像人家没有要求哇,不行还是不太完美,咋可是一个完美主义者,盘他
    只能判断了,要是数字,在这个里头机器认得是十进制数,就让他给改了,改成int型也就是整型,就是咱们看到的没有引号的数字,要不是,就不动把原先的插到字典中
    if lis[em].isdecimal():
    		dic1[title[em]] = int(lis[em])
    else:
    		dic1[title[em]] = lis[em]
    最后重新把新的字典添加到l1人家要求的列表中,再回再看看效果哇
    [{'序号': 1, '部门': 'python', '人数': 30, '平均年龄': 26, '备注': '单身狗'}, {'序号': 2, '部门': 'Linux', '人数': 26, '平均年龄': 30, '备注': '没对象'}, {'序号': 3, '部门': '运营部', '人数': 20, '平均年龄': 24, '备注': '女生多'}]
    果然跟人家要求的一模一样了,搞定,交差
    
    上头那么多废话,我下面就这么一串串
    l1 = []
    with open('a1.txt',mode='r',encoding='utf-8') as f :
        title = f.readline().strip().split()
        for i in f:
            lis = i.split()
            dic1 = {}
            for em in range(len(lis)):
                if lis[em].isdecimal():
                    dic1[title[em]] = int(lis[em])
                else:
                    dic1[title[em]] = lis[em]
            l1.append(dic1)
    print(l1)
    
    
    
  • 相关阅读:
    Java核心技术(初阶)知识点复习——[2]面向对象思想
    Java核心技术(初阶)知识点复习——[1]Java的类结构和main函数
    printStream与printWriter
    java反射的初步探索
    JDKJREJVM的关系
    树链剖分模板
    树状数组模板2
    树状数组模板1
    树状数组+欧拉降幂
    线段树模板二
  • 原文地址:https://www.cnblogs.com/zanao/p/11026035.html
Copyright © 2020-2023  润新知