(本文仅作为学习记录使用)  
01 昨日内容回顾
02 作业讲解
03 编码的进阶
04 文件操作的初识
05 文件的读
06 文件的写
07 文件的追加
08 其他操作方法
09 文件的改
10 深浅copy

01 昨日内容回顾
  小数据池:
  数据类型的补充:
  集合的一些定义和概念:

  小数据池:  
    id 是获取该对象的内存地址. 如果内存地址相同则代表指向的元素相同.
    is 是确保两者之间的id是否相同.
    == 是判断两边的数值是否相等.
    
    同一代码块的缓存机制:如果是同一代码块,那么赋值相同的变量id相同. 改变其中一个值,另一个也会发生变化.
    不同代码块:(小数据池)即使是赋值相同,id不同,那也无能为力.改变其中一个值,另一个不会发生变化.(-5~256之间还是相同的)
    
  数据类型的补充:
    空值('')的bool是False.
    bool,str,bool可以相互转化.(各有条件)
    用fromkeys时,如果赋值是可变的,那么id相同.(如果是不可变类型的数据,id不同)
    tuple单个元素时候是其本身,类型不变. 2个元素以上的如(a,b)为元组.
#fromkeys()
#说明:用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值'''
>>> help(dict.fromkeys)
Help on built-in function fromkeys:

fromkeys(...)
dict.fromkeys(S[v]) -> New dict with keys from S and values equal to v.
v defaults to None.
'''
formkeys用法:
dic = dict.fromkeys([1,2,3],'太白')
dic = dict.fromkeys('abcd','太白')
dic = dict.fromkeys('abcd',[1,])
# 坑: 如果你的值是一个可变的数据类型, 他在内存中是一个.id相同.
dic = dict.fromkeys('abcd',[])
dic['a'].append(666)
dic['b'].append(111)
dic['c'].append(222)
print(dic)

tuple注意事项:
t = (1)
print(type(t))#<class 'int'>
t = (1,2)
print(type(t))#<class 'tuple'>

    注意,有三种方法创建一个字典:

      1.dic = {'k1':'v1','k2':'v2','k3':'v3'}

      2.dic =dict.fromkeys()      

      3.dic = dict()

 

    set:看昨日链接。https://www.cnblogs.com/smithpath/articles/10492741.html

 

2.作业讲解

 

# 用三种方式创建一个字典:
# dic = {'name':'太白','age': 18}
#
# dic = dict([(1,2),('name', 'alex')])
# print(dic)
#
# # dict.fromkeys()
# dic = dic.fromkeys([1,2,3],'alex')
# print(dic)
#
# dic = dict()
# for 循环 构建.

# 1,列表去重.
# l1 = [1, 2, 3, 1, 2, 3, 4, 4,]
# s1 = set(l1)
# print(s1)   # 21 数字之前.
# l1 = list(s1)
# print(l1)

# 2,关系测试.
# | & - ^


# Day6作业及默写
# 1.
# 使⽤循环打印以下效果:
# 1:
# *
# **
# ** *
# ** **
# ** ** *
# 2:
# ** ** *
# ** **
# ** *
# **
# *
# 3:
# *
# ** *
# ** ** *
# ** ** ** *
# ** ** ** ** *
#
# 2.
# 输入⼀个⼴告标语.判断这个广告是否合法.根据最新的⼴告法来判断. ⼴告法内容过
# 多.我们就判断是否包含
# '最', '第⼀', '稀缺', '国家级'
# 等字样.如果包含.提⽰, ⼴告不
# 合法
# 例如,
# (1)
# 老男孩python世界第⼀.不合法
# (2)
# 今年过年不收礼啊.收礼只收脑⽩⾦.合法
#
# 3.
# 敲七游戏.从1开始数数.遇到7或者7的倍数(不包含17, 27, 这种数)要在桌上敲⼀下.编程来完成敲七.
# 给出⼀个任意的数字n.从1开始数.数到n结束.把每个数字都放在列表中, 在数的过程中出现7或
# 者7的倍数(不包含17, 27, 这种数).则向列表中添加⼀个
# '咣'
# 例如, 输⼊10.
# lst = [1, 2, 3, 4, 5, 6, '咣', 8, 9, 10]
#
# 4.
# 念数字给出一个字典.在字典中标识出每个数字的发音.包括相关符号.然后由用户输入一个数字.让程序读出相对应的发音(不需要语音输出.单纯的打印即可)
#
# 5.
# 电影投票程序:先给出⼀个⽬前正在上映的电影列表.由⽤户给每⼀个电影投票.最终将该⽤户投票信息公布出来 。
# 要求:
# 1,用户输入序号,进行投票。比如输入序号 1,给肖申克的救赎投票1。
# 2,每次投票成功,显示给哪部电影投票成功。
# 3,退出投票程序后,要显示最终每个电影的投票数。
#
lst = ['肖申克的救赎', '流浪地球', '驯龙高手3', '西西里的美丽传说']
dic = dict.fromkeys(lst,0)
while 1:
    print('请给以下电影投票:')
    for index in range(len(lst)):
        print('电影序号:{}, 电影名称:{}'.format(index+1,lst[index]))

    num = input('请输入电影序号:q或者Q退出').strip()
    '''
       q Q 退出 break
       非数字元素: 重新输入.
       输入数字: 对数字进行范围的判断.
       '''
    if num.upper() == 'Q':
        print('感谢您参与!')
        break

    elif num.isdigit():
        num = int(num)
        if 0 < num <= len(lst):  # 1
            '''
            如果要是没有肖申克的救赎这个部电影: 我要增加一个键值对,设置为   肖申克的救赎: 0
            如果要是有肖申克的救赎这部电影:肖申克的救赎 对应的值 + 1 
            '''
            # # if not dic.get(lst[num-1]):
            # #     dic[lst[num-1]] = 1
            # # else:
            # #     dic[lst[num-1]] += 1
            # dic[lst[num-1]] = dic.get(lst[num-1],0) + 1   # dic[lst[num-1]] = 1
            print('您已经给{}电影投票成功'.format(lst[num-1]))

        else:
            print('您输入超出范围,重新输入')

    else:
        print('输入错误,请重新输入')

for movie_name, movie_num in dic.items():
    print('电影:{}最终票数:{}'.format(movie_name,movie_num))

# 结果: {'肖申克的救赎': 99, '解救吴先生': 80, '美国往事': 6, '西西里的美丽传说': 23}
#
# 明日默写内容:
# 1,l1 = [11, 22, 33, 44, 55]
# 用代码将列表的索引的偶数位对应的元素删除。
# (不能使用del
# l1[::2]
# 这种方法)
# 2,dic = {“k1”: “v1”, “k2”: “v2”, “k3”: “v3”, “name”: “太白”} 将字典中含有k元素的所有key全部删除。

 

  

今日作业:
# 1.有如下文件,a1.t面:
# --------------------------------------------------------------------------------
# 老男孩是最好的学校,
# 全心全意为学生服务,
# 只为学生未来,不为牟利。
# 我说的都是真的。哈哈
# --------------------------------------------------------------------------------
# 分别完成以下的功能:
# with open('a1.txt',encoding='utf8',mode='w') as f :
#     f.write('''老男孩是最好的学校,\n全心全意为学生服务,\n只为学生未来,不为牟利。\n我说的都是真的。哈哈''')
# a,将原文件全部读出来并打印。
# with open('a1.txt',encoding='utf8') as f :
#     print(f.read())
# b,在原文件后面追加一行内容:信不信由你,反正我信了。
# 带输出:
# with open('a1.txt',encoding='utf8',mode='a+') as f :
#     f.write('\n信不信由你,反正我信了。')
# 带输出:
# with open('a1.txt',encoding='utf8',mode='a+') as f :
#     f.write('\n信不信由你,反正我信了。')
#     f.seek(0)
#     print(f.read())
# c,将原文件全部读出来,并在后面添加一行内容:信不信由你,反正我信了。
# with open ('a1.txt',encoding='utf8',mode='r+') as f:
#     print(f.read())
#     f.write('\n信不信由你,反正我信了。')
# d,将原文件全部清空,换成下面的内容:
# --------------------------------------------------------------------------------
# 每天坚持一点,
# 每天努力一点,
# 每天多思考一点,
# 慢慢你会发现,
# 你的进步越来越大。
# --------------------------------------------------------------------------------
# with open('a1.txt',encoding='utf8',mode='w') as f :
#     f.write('每天坚持一点,\n每天努力一点,\n每天多思考一点,\n慢慢你会发现,\n你的进步越来越大。')

# 2.有如下文件,t1.txt,里面的内容为:
# --------------------------------------------------------------------------------
# 葫芦娃,葫芦娃,
# 一根藤上七个瓜
# 风吹雨打,都不怕,
# 啦啦啦啦。
# 我可以算命,而且算的特别准:
# 上面的内容你肯定是心里默唱出来的,对不对?哈哈
# --------------------------------------------------------------------------------
# 分别完成下面的功能:
# with open('t1.txt', encoding='utf8', mode='w') as f:
#     f.write('葫芦娃,葫芦娃,\n一根藤上七个瓜\n风吹雨打,都不怕,\n啦啦啦啦。\n我可以算命,而且算的特别准:\n上面的内容你肯定是心里默唱出来的,对不对?哈哈')
# a,以r+的模式打开原文件,判断原文件是否可读,是否可写。
# with open('t1.txt', encoding='utf8', mode='r+') as f:
#     print(f.readable())
#     print(f.writable())
# b,以r的模式打开原文件,利用for循环遍历文件句柄。
# with open('t1.txt',encoding='utf8',) as f:
#     for i in f:
#         print(i)
# c,以r的模式打开原文件,以readlines()方法读取出来,并循环遍历  readlines(),
# 并分析b,与c 有什么区别?深入理解文件句柄与readlines()结果的区别。
# with open('t1.txt', encoding='utf8') as f:
#     for i in f.readlines():
#         print(i)
# read:如果指定了参数 size,就按照该指定长度从文件中读取内容,否则,就读取全文。
# 被读出来的内容,全部塞到一个字符串里面。这样有好处,就是东西都到内存里面了,随时取用;但如果文件内容太多了,内存会吃不消
#
# • readline:可选参数 size 的含义同上。它是以行为单位返回字符串,
# 也就是每次读一行,依次循环,如果不限定 size,直到最后一个返回的是空字符串,意味着到文件末尾了(EOF)。
#
# • readlines:size 同上。它返回的是以行为单位的列表,
# 即相当于先执行 readline() ,得到每一行,然后把这一行的字符串作为列表中的元素塞到一个列表中,最后将此列表返回。
# b的话是遍历文件中的str. c的话是遍历文件中每一句话.
# readlines打印出来有\n,read没有.
# d,以r模式读取'葫芦娃,'前四个字符。
# with open('t1.txt',encoding='utf8') as f:
#     print(f.read(4))
# e,以r模式读取第一行内容,并去除此行前后的空格,制表符,换行符。
# with open('t1.txt',encoding='utf8') as f:
#     print(f.readline().strip())
# f,以r模式打开文件,从'风吹雨打.....'开始读取,一直读到最后。
# 法一:数出来
# with open('t1.txt', encoding='utf8') as f:
#     f.seek(43)
#     print(f.read())
# 法二:
# with open('t1.txt', encoding='utf8') as f:
#     for i in f :
#         if '风吹雨打' in i :
#             print(i,end='')
#             print(f.read())
# 法三:
# with open('t1.txt', encoding='utf-8', mode='r') as f:
#     for line in f.readlines()[2:]:
#         print(line,end='')

# g,以a+模式打开文件,先追加一行:'老男孩教育'然后在从最开始将原内容全部读取出来。
# with open('t1.txt',encoding='utf8',mode='a+') as f :
#     f.write('\n老男孩教育')
#     f.seek(0)
#     print(f.read())

# h,截取原文件,截取内容:'葫芦娃,葫芦娃,'
# with open('t1.txt',encoding='utf8',mode='r+') as f :
#     f.truncate(22)

# 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}......]
# 并计算出总价钱。

# 老师写的:
# with open('a.txt', encoding='utf8', mode='w') as f:
#     f.write('name\tprice\tamount\napple\t10\t\t3\ntesla\t100000\t1\nmac\t\t3000\t2\nlenovo\t30000\t3\nchicken\t10\t\t3')
# li = []
# num_sum = 0
# with open('a.txt', encoding='utf8') as f:
#     for i in f:
#         name, price, num = i.split()
#         print(name, price, num)
#         dic = {'name':name,'price':price,'num':num}
#         li.append(dic)
#         sum =int( price )* int(num)
#         num_sum += sum
# print(li)
# print(num_sum)


# 原答案:
# with open('a.txt', encoding='utf8', mode='w') as f:
#     f.write('name\tprice\tamount\napple\t10\t\t3\ntesla\t100000\t1\nmac\t\t3000\t2\n'
#             'lenovo\t30000\t3\nchicken\t10\t\t3')
# with open('a.txt', encoding='utf8') as f:
#     l = []
#     for line in f.readlines():
#         l.append(line.strip().split())
#     dic1 = dict(zip(l[0], l[1]))
#     dic2 = dict(zip(l[0], l[2]))
#     dic3 = dict(zip(l[0], l[3]))
#     dic4 = dict(zip(l[0], l[4]))
#     sum1 = int(dic1['price']) * int(dic1['amount'])
#     sum2 = int(dic2['price']) * int(dic2['amount'])
#     sum3 = int(dic3['price']) * int(dic3['amount'])
#     sum4 = int(dic4['price']) * int(dic4['amount'])
#     sum = sum1 + sum2 + sum3 + sum4
#     print(dic1, dic2, dic3, dic4,sum)

# 4.有如下文件:
# alex是老男孩python发起人,创建人。
# alex其实是人妖。
# 谁说alex是sb?
# 你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
# --------------------------------------------------------------------------------
# 将文件中所有的alex都替换成大写的SB(文件的改的操作)。
# 五步:
#     1.以读的模式打开原文件.
#     2.以写的模式打开新文件.
#     3.将原文件内容读取出来,按照你的要求改成新内容,写入新文件.
#     4.删除原文件.
#     5.把新文件名改为原文件.
# with open('a1', encoding='utf8', mode='w') as f1:
#     f1.write('alex是老男孩python发起人,创建人。\nalex其实是人妖。\n谁说alex是sb?\n你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。')
# import os
# with open('a1', encoding='utf8') as f1,\
#         open('a1.bak', encoding='utf8', mode='w') as f2:
#     for old_conment in f1:
#         new_conment = old_conment.replace('alex', 'sb')
#         f2.write(new_conment)
# os.remove('a1')
# os.rename('a1.bak','a1')

# 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}......]
# 并计算出总价钱。
# 老师讲的


# 自己做的
#  l = []
# with open('a2', encoding='utf8', mode='r+') as f:
#     for i in f.readlines():
# l1 = i.strip().split()
# print(l)
# 6.文件a1.txt内容(升级题)
# 序号  部⻔  人数  平均年龄 备注
# 1   python  30    26     单身狗
# 2   Linux   26    30     没对象
# 3  运营部   20    24     女生多
# .......
# 通过代码,将其构建成这种数据类型:
# [{'序号': '1', '部⻔': Python, '人数': 30, '平均年龄': 26, '备注': '单身狗'},
#  ......]
# 老师讲的
# l = []
# with open('t', encoding='utf8') as f:
#     title_list = f.readline().split()
#     for i in f:
#         em = i.split()
#         d = {title_list[0]: em[0],
#              title_list[1]: em[1],
#              title_list[2]: em[2],
#              title_list[3]: em[3],
#              title_list[4]: em[4]}
#         l.append(d)
# print(l)

# 明日默写内容:
# 就是第4题的代码(课上讲过)。

  

 

03.编码进阶

侧重于encode和decode的理解。

encode:编码。  decode:解码。

在Python3x版本中,s1 = '老男孩',如何将s1转化成utf-8的bytes    类型?转化成功之后,得到了s2,如何将s2转化成gbk的bytes类型(请写出具体代码)?
s1 = "老男孩"
s2 = s1.encode("utf-8")
s3 = bs.decode("utf-8")
bs2 = s2.encode("gbk")

 

04.文件操作的初识

f.tell() #获取文件中当前“光标”位置
f.seek(5) #光标定位到指定位置
f.encoding #当前文件的编码格式
f.fileno() #返回文件在内存中的编号
f.name #当前打开文件的文件名
f.seekable() #判断光标在文件是否可移动
f.readable() #判断文件是否可读
f.writable() #判断文件是否可写
f.flush() #强制刷新,把内存里的内容立即写入硬盘
f.truncate(10) #从第10个字符开始清除后面数据
f.close() #关闭文件,文件读取结束自动关闭

 

05.文件的读、写和追加

r:读模式;
w:写模式;
a:追加模式,在文件最后写入内容;
r+:读写模式,读取文件内容,并在末尾添加记录;
w+:写读模式,新建文件并添加记录;
a+:追加写读;
rb:以二进制格式读取文件;(可打开图片等非文字文件)
rw:以二进制格式写入文件(可打开图片等非文字文件)
注:读模式时,不能写,写模式时,不能读。

r模式:  n 字符
rb模式: n 字节

文件的读:
f1 = open('r模式',encoding='utf-8')
print(f1.read(3))
f1.close()

f1 = open('r模式',mode='rb')
print(f1.read(3))
f1.close()

  

文件的写:
f = open('w模式',encoding='utf-8',mode='w')
# f.write('alex is a  man\n')

f1 = open('美女.jpg',mode='rb')
content = f1.read()
f1.close()

f2 = open('美女1.jpg',mode='wb')
f2.write(content)
f2.close()

  

09.文件的改

import os
with open('alex自述',encoding='utf-8') as f1,\
open('alex自述.bak',encoding='utf-8',mode='w') as f2:
for old_line in f1:
new_line = old_line.replace('alex','sb')
f2.write(new_line)
os.remove('alex自述')
os.rename('alex自述.bak','alex自述')

 

10.深浅copy

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果.     这个是由于共享内存导致的结果

拷贝:原则上就是把数据分离出来,复制其数据,并以后修改互不影响。

先看 一个非拷贝的例子

=赋值:数据完全共享(=赋值是在内存中指向同一个对象,如果是可变(mutable)类型,比如列表,修改其中一个,另一个必定改变

如果是不可变类型(immutable),比如字符串,修改了其中一个,另一个并不会变

 

浅拷贝:数据半共享(复制其数据独立内存存放,但是只拷贝成功第一层)

 

深拷贝:数据完全不共享(复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享)

 

 深拷贝就是完完全全复制了一份,且数据不会互相影响,因为内存不共享。

 

 

 

    




















 
posted on 2019-03-13 09:29  流云封心  阅读(287)  评论(0编辑  收藏  举报