zoukankan      html  css  js  c++  java
  • python 04 文件操作、编码转码

    Python基础学习04


    文件操作

    字符编码字符转码

    简单三级菜单

    简单购物车


    一、文件操作

    1、文件打开操作

     1 f = open("text.txt",encoding = "utf-8")   #文件句柄
     2 data = f.read()               #读文件内容
     3 data_2 = f.read()
     4 print( data )                 #正常输出
     5 print("aaaaaaaaaaa")        #输出:aaaaaaaaaaa
     6 print(data_2)                #无输出(文件读完之后光标移动到最后,在次读不会有新的内容)
     7 f.close()                    #关闭文件
     8 #此为非规范书写,没有书写读写模式,默认为读模式
     9 f = open("text.txt","r",encoding = "utf-8")   #标准书写(只能读文件)
    10 f.close()
    11 
    12 f = open("text_1.txt","w",encoding = "utf-8")   #创建一个新文件,并以写模式打开,若之前存在同名的文件则会覆盖
    13 f.write("你不面对现实
    ")                         #只能对文件进行写操作,不能读取
    14 f.write("现实就会面对你")
    15 f.close()
    16 '''文档内容:
    17 你不面对现实
    18 现实就会面对你
    19 '''
    20 
    21 f = open("text_1.txt","a",encoding = "utf-8")   #以写模式打开一个文件,并在文件末尾追加新内容
    22 f.write("
    勿以恶小而为之
    ")                         #只能对文件进行写操作,不能读取
    23 f.write("勿以善小而不为")
    24 f.close()
    25 '''文档内容:
    26 你不面对现实
    27 现实就会面对你
    28 勿以恶小而为之
    29 勿以善小而不为
    30  '''
    31 # r:只读模式(默认)。
    32 # w:只写模式。(不可读;不存在则创建;存在则删除内容;)
    33 # a:追加模式。(不可读;不存在则创建;存在则只追加内容;)
    34 
    35 #预先读取文件内容到内存中(少用)
    36 f = open("text.txt","r",encoding = "utf-8")
    37 for i in range(3):
    38     print(f.readline())         #逐行读取,读取前3行
    39 for line in f.readlines():     #预先读取文件内容并把文件中所有内容以列表的形式存到内存中(不适用于大文件)
    40     print(line.strip())         #逐行打印全部文件内容(strip()去掉换行空格)
    41 
    42 for index,line in enumerate(f.readlines()):
    43     if index == 5 :                     #当文件读取到第5行时
    44         print('----------')            #用"----------"来替换第6行的内容
    45         continue                       #继续读取
    46     print(line.strip())                 #打印读取内容
    47 
    48 #逐行读取文件内容到内存中(常用)
    49 count = 0
    50 for line in f:
    51     if count == 5:
    52         print('----------')
    53         count += 1
    54         continue
    55     print(line.strip())
    56     count += 1
    57 f.close()
    58 
    59 
    60 
    61 # "+" 表示可以同时读写某个文件
    62 # r+,可读写文件。(可读;可写(追加写模式))
    63 # w+,写读(先新建文件,然后写入新内容,之后读自己写的内容)
    64 # a+,追加读写
    65 
    66 f = open("text.txt","r+",encoding = "utf-8")   #常用
    67 f.close()
    68 
    69 f = open("text_2.txt","w+",encoding = "utf-8")  #不常用
    70 f.write("________________
    ")
    71 f.write("++++++++++++++++
    ")
    72 f.write("================
    ")
    73 f.seek(0)
    74 print(f.readline())      #输出:________________
    75 print(f.readline())      #输出:++++++++++++++++
    76 print(f.readline())      #输出:================
    77 f.close()
    78 
    79 #"b"表示处理二进制文件(bytes类型)
    80 # rb
    81 # wb
    82 # ab
    83 #网络传输会用到,网络传输只能用二进制模式
    84 f = open("text.txt","rb")       #二进制读
    85 print(f.readline())              #输出:# b'When you are old
    '
    86 f.close()
    87 
    88 f = open("text_2.txt","wb")       #二进制写
    89 f.write("当你老了".encode())
    90 f.close()
    View Code

     2、其他操作

     1 f = open("text_1.txt","r",encoding = "utf-8")
     2 print(f.tell())             #文件句柄指针指向的位置 输出:0
     3 print(f.readline())         #读1行内容
     4 print(f.tell())             #输出:20
     5 
     6 print(f.readline())         #在读一行内容 输出:现实就会面对你
     7 f.seek(20)                  #将文件句柄指针指向的位置移动到指定位置
     8 print(f.readline())         #输出:现实就会面对你
     9 
    10 f.flush()                   #刷新(写完数据后数据是存在内存缓存中的,flush是把缓存中的数据存到硬盘中)
    11 f.close()
    12 #实现进度条
    13 import sys,time
    14 for i in  range(50):
    15     sys.stdout.write("#")
    16     sys.stdout.flush()
    17     time.sleep(0.1)
    18 
    19 f = open("text_1.txt","a",encoding = "utf-8")
    20 f.truncate(10)              #从文件开头开始截断指定个数字符,不写内容会清空文件
    View Code

    3、文件修改 

     1 #文件修改:打开一个文件,修改后存到一个新的文件
     2 f = open("text.txt","r",encoding = "utf-8")               #以读模式打开源文件
     3 f_new = open("text_new.txt","w",encoding = "utf-8")      #以写模式打开新文件
     4 for line in f:                                             #逐行读取
     5     if "慢慢读着" in line:                                #找到想要修改的位置
     6         line = line.replace("慢慢读着","manmanduzhe")    #修改字符串
     7     f_new.write(line)                                      #将内容写入新文件
     8 f.close()
     9 f_new.close()
    10 
    11 
    12 #实现简单的shell sed 替换功能
    13 import sys
    14 f = open("text.txt","r",encoding = "utf-8")               #以读模式打开源文件
    15 f_new = open("text_new.txt","w",encoding = "utf-8")      #以写模式打开新文件
    16 find_str = sys.argv[1]
    17 replace_str = sys.argv[2]
    18 for line in f:                                             #逐行读取
    19     if find_str in line:                                #找到想要修改的位置
    20         line = line.replace(find_str,replace_str)    #修改字符串
    21     f_new.write(line)                                      #将内容写入新文件
    22 f.close()
    23 f_new.close()
    View Code

    4、with操作

     1 #f = open("text.txt","r",encoding = "utf-8")               #以读模式打开源文件
     2 with open("text.txt","r",encoding = "utf-8") as f:      #与上面功能相同
     3     print(f.readline())
     4 #为了避免打开文件后忘记关闭
     5 
     6 #在Python 2.7 后,with又支持同时对多个文件的管理,即:
     7 with open('log1') as obj1, open('log2') as obj2:
     8     pass
     9 #python开发规范:一行代码尽量不要超过80个字符(所以上面格式可以写成下面这样)
    10 with open("text.txt","r",encoding = "utf-8") as f,
    11       open("text_2.txt","r",encoding = "utf-8") as f2:
    12     pass
    View Code

     二、字符编码字符转码

    一、字符编码

    1、ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)

    是基于字母的一套电脑编码系统,主要用于显示现代英语,其最多只能用 8 位来表示(一个字节),即:2**8 = 256-1种不同状态,每种状态就唯一对应一个字符,比如A--->00010001,而英文只有26个字符,算上一些特殊字符和数字,128个状态也够,这样计算机就可以用127个不同字节来存储英语的文字了。这就是ASCII编码。
    扩展ANSI编码
    最开始,一个字节有八位,但是最高位没用上,默认为0;后来为了计算机也可以表示拉丁文,就将最后一位也用上了,从128到255的字符集对应拉丁文。所以,ASCII码主要用于显示现代英语和其他西欧语言,最多只能表示 255 个符号。

     2、GB2312(1980年)

    计算机来到中国后,计算机不认识中文,当然也没法显示中文;而且一个字节所有状态都被占满了,于是中国人重写一张表,直接将扩展的第八位对应拉丁文全部删掉,规定一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合大约7000多个简体汉字了(一共收录了7445个字符);这种汉字方案叫做 “GB2312”。GB2312 是对 ASCII 的中文扩展。

    3、GBK 和 GB18030编码

    汉字太多了,GB2312不够用,于是规定:只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。
    2000年的 GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。
    从ASCII、GB2312、GBK 到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。
    现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。

    4、UNICODE编码

    很多其它国家都搞出自己的编码标准,彼此间却相互不支持。这就带来了很多问题。于是,国际标谁化组织为了统一编码,提出了标准编码准则:UNICODE 。
    Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定由 16 位来表示一个字符(2个字节),即:2 **16 = 65536,这足以覆盖世界上所有符号(包括甲骨文)

    5、UTF-8

    unicode可以解决所有编码,为什么还要有一个utf-8的编码呢?
    对于英文世界的人们来讲,一个字节完全够了,比如要存储A,本来00010001就可以了,现在unicode得用两个字节:00000000 00010001才行,浪费太严重,基于此,科学家们提出了:utf-8。
    UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存...这样好处是,虽然在我们内存中的数据都是unicode,但当数据要保存到磁盘或者用于网络传输时,直接使用unicode就远不如utf-8省空间,这也是为什么utf-8是推荐编码方式。

    Unicode与utf8的关系:

    Unicode是内存编码表示方案(是规范),而UTF是如何保存和传输Unicode的方案(是实现)这也是UTF与Unicode的区别。

    二、py2字符编码字符转码

    在py2中,有两种字符串类型:str类型和unicode类型;str类型存字节数据,unicode存的是unicode数据

    在python2默认编码是ASCII 

     1 #coding:utf-8    #在python2中默认编码是ASCII,必须声明编码,否则不能解析中文,会报如下错误信息
     2                  # SyntaxError: Non-ASCII character 'xe4' in file zz.py on line 4, but no encoding declared;
     3 
     4 s1='你好'                                       #在py2中定义字符串(默认类型)
     5 print type(s1) # <type 'str'>                   #类型为str类型
     6 print repr(s1) #'xe4xbdxa0xe5xa5xbd'      #存储的数据为字节数据
     7 s2=u'你好'                                      #用unicode类型定义字符串
     8 print type(s2) # <type 'unicode'>               #类型为unicode类型
     9 print repr(s2) # u'u4f60u597d'                #存储的数据unicode数据
    10 
    11 b=s2.encode('utf-8')                            #将unicode数据以utf-8进行编码
    12 print b        #浣犲ソ                          #输出乱码
    13 print type(b)  #<type 'str'>                    #类型为str类型
    14 print repr(b)  #'xe4xbdxa0xe5xa5xbd'
    15 
    16 u=s1.decode('utf-8')      #将utf-8编码的字节用utf-8的规则解码
    17 print u        # 你好
    18 print type(u)  # <type 'unicode'>       #解码后数据类型为unicode类型
    19 print repr(u)  # u'u4f60u597d'        #存储的数据unicode数据
    20 
    21 u2=s1.decode('gbk')        #将utf-8编码的字节用gbk的规则解码
    22 print u2      #浣犲ソ      #输出乱码
    23 print type(u2)   # <type 'unicode'>      #解码后数据类型依旧为unicode类型
    View Code

    无论是utf8还是gbk都只是一种编码规则,一种把unicode数据编码成字节数据的规则,所以utf8编码的字节一定要用utf8的规则解码,否则就会出现乱码或者报错的情况

    在Python2中运行带有中文的程序会先声明编码,一般为UTF-8或GBK,定义字符串后,字符串的数据格式为bytes,如果需要打印输出,需将bytes类型decode为事先声明的编码

    转换编码时,需先decode(“当前编码”),解码成Unicode,后将Unicode编码encode(“目标编码”)。此时转换完成

     1 #coding:utf-8
     2 
     3 import sys
     4 print(sys.getdefaultencoding())       #ascii
     5 
     6 msg = "你好"
     7 msg_gb2312 = msg.decode("utf-8").encode("gb2312")       #将utf-8编码转换成gb2312编码
     8 gb2312_to_gbk = msg_gb2312.decode("gbk").encode("gbk")  #将gb2312编码转换成gbk编码
     9 
    10 print(msg)    #浣犲ソ (py2中str类型存字节数据)
    11 print(msg.decode("utf-8"))  #你好  将msg的字节数据以utf-8解码
    12 print(msg_gb2312)            #你好
    13 print(gb2312_to_gbk)         #你好
    View Code

    三、py3字符编码字符转码

     py3也有两种数据类型:str和bytes; str类型存unicode数据,bytse类型存bytes数据,与py2比只是换了一下名字而已。

     在python3默认编码是unicode

     1 #py3中默认编码是unicode类型,不用声明编码,也能解析中文
     2 import json
     3 s1='你好'                                     #在py3中定义字符串(默认类型)
     4 print(type(s1))          #<class 'str'>       #类型为str类型
     5 print(json.dumps(s1))    # "u4f60u597d"     #存储的数据为unicode类型数据
     6 
     7 #s2 = b"你好"            #py3中不能把中文直接定义成字节类型,会报错:SyntaxError: bytes can only contain ASCII literal characters.
     8                         #字节只能包含ASCII文字字符
     9 
    10 b=s1.encode('utf-8')                         #将字符串以utf-8格式编码
    11 print(type(b))    # <class 'bytes'>          #编码后数据类型为bytes类型
    12 print(b)     # b'xe4xbdxa0xe5xa5xbd'   #以bytes格式输出字符串
    13 
    14 u=b.decode('utf-8')                          #将bytes类型数据以utf-8格式解码
    15 print(type(u))           #<class 'str'>       #解码后数据类型为str类型
    16 print(u)                 #你好                #打印输出
    17 print(json.dumps(u))     #"u4f60u597d"      #存储的数据为unicode类型数据
    View Code

     在Python3中默认就是unicode,不用再decode

     1 import sys
     2 print(sys.getdefaultencoding())   #utf-8
     3 
     4 msg = "你好"
     5 
     6 msg_gb2312 = msg.encode("gb2312")   #默认就是unicode,不用再decode
     7 gb2312_to_unicode = msg_gb2312.decode("gb2312")   #将gb2312编码的bytes类型数据
     8 gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")
     9                     #将gb2312编码的字符串,先解码后编码成utf-8类型到bytes数据
    10 print(msg)   # 你好                           #默认就是unicode,不用再decode直接显示
    11 print(msg_gb2312)   #b'xc4xe3xbaxc3'      #encode后变成gb2312编码的bytes类型
    12 print(gb2312_to_unicode)  #你好              #将将gb2312编码的bytes类型数据解码
    13 print(gb2312_to_utf8)   #b'xe4xbdxa0xe5xa5xbd' #utf-8编码后的bytes类型
    View Code

     三、简单三级菜单 

     1 data = {
     2     '山东':{
     3         '青岛' :['四方','黄岛','崂山','李沧','城阳'],
     4         '济南' : ['历城','槐荫','高新','长青','章丘'],
     5         '烟台' : ['龙口','莱山','牟平','蓬莱','招远']
     6         },
     7     '江苏':{
     8         '苏州' : ['沧浪','相城','平江','吴中','昆山'],
     9         '南京' : ['白下','秦淮','浦口','栖霞','江宁'],
    10         '无锡' : ['崇安','南长','北塘','锡山','江阴']
    11         },
    12     '河北': {
    13         '石家庄': ['鹿泉', '藁城', '元氏'],
    14         '邯郸': ['永年', '涉县', '磁县'],
    15           }
    16   }
    17 run_data = True
    18 while run_data:
    19     for i in data:
    20         print(i)
    21     choice = input('选择进入的菜单,按q退出:')
    22     if choice in data:
    23         while run_data:
    24             for i1 in data[choice]:
    25                 print(i1)
    26             print('按q退出,按b返回上一级菜单!')
    27             choice1=input('选择进入的菜单:')
    28             if choice1 in data[choice]:
    29                 while run_data:
    30                     for i2 in data[choice][choice1]:
    31                         print(i2)
    32                     choice3 = input('按q退出,按b返回上一级菜单!:')
    33                     if choice3 == 'b':
    34                         break
    35                     elif choice3 == 'q':
    36                         run_data= False
    37                     else:
    38                         print('这是最后一级菜单!')
    39             elif choice1 == 'b':
    40                 break
    41             elif choice1 == 'q':
    42                 run_data=False
    43             else:
    44                 print('请输入正确的编号!')
    45     elif choice == 'q':
    46         run_data=False
    47     else:
    48         print('请输入正确的编号!')
    View Code

    四、简单购物车 

     1 product_list = [
     2     ('iphone',5000),
     3     ('computer',6000),
     4     ('watch',1500),
     5     ('bike',100),
     6     ('book',50),
     7     ('fruit',20)
     8 ]
     9 shopping_list = []
    10 sallary = input("Please Input Your Sallary:")
    11 if sallary.isdigit():
    12     sallary = int(sallary)
    13     while True:
    14         #for item in product_list:
    15         #   print(product_list.index(item),item)
    16         for index,item in enumerate(product_list):
    17             print(index,item)
    18         print('input q to finish your shopping')
    19         user_choice = input("please input your goods number:")
    20         if user_choice.isdigit():
    21             user_choice = int(user_choice)
    22             if user_choice<len(product_list) and user_choice>=0:
    23                 p_item = product_list[user_choice]
    24                 if p_item[1] < sallary:
    25                     shopping_list.append(p_item)
    26                     sallary -=p_item[1]
    27                     print("Add %s into shopping cart , your current balence is %s"%(p_item,sallary))
    28                 else:
    29                     print("you dont have so much money! ")
    30             else:
    31                 print("there is no goods with your number!!")
    32         elif user_choice == 'q':
    33             print('-----your shopping list-----')
    34             for p in shopping_list:
    35                 print(p)
    36             print("your current balance is :",sallary)
    37             exit()
    38         else:
    39             print("please input right number!!")
    40         #break
    41 else:
    42     print("Please input right sallary!!")
    View Code
  • 相关阅读:
    也谈谈关于WEB的感想
    spring boot,https,双向ssl认证
    Spring Cloud Gateway(二)
    Spring Cloud Gateway(一)
    .Net Web Service 自定义返回值命名
    随便记一下,C#并行环境操作Winform的代码段
    随便记一下,解决Windows Server 2012无法远程登录的方法
    记录C#控件DataGridView绑定BindingList无法排序问题(转)
    记录SQL Server 2019链接Oracle 11g R2的过程
    Json CPP 中文支持与入门示例
  • 原文地址:https://www.cnblogs.com/hy0822/p/9011069.html
Copyright © 2011-2022 走看看