首页 > 其他分享 >day09

day09

时间:2023-12-05 19:02:05浏览次数:24  
标签:day09 utf encoding mode print txt open

1.今日内容介绍

今日内容:
    1.字符编码(******) 
    
    2.文件处理的高级部分
        (1) 文件处理的其他方法
        (2) 控制文件指针移动
        (3) 文件修改的两种方式

    3.函数的基本使用
        函数名
        参数
        函数体代码
        函数的返回值

2.字符编码储备知识

文本编辑器读取python文件内容也经历了三个步骤
"""
1.先启动文本编辑器。
2.文本编辑器会发送系统调用,把test.py的内容从硬盘读入内存。
3.文本编辑器会将刚刚读入内存的内容控制输出到屏幕上,让用户看到结果。
"""

3.字符编码

1.人类的字符到计算机的数字必须经历一个过程
字符(就是语言)==>翻译==>数字

2.什么是字符编码表?
"""
字符与数字的对应关系表 
"""

x = '王苗鲁'
res = x.encode('utf-8')
print(res)

4.字符编码发展史

ASCII表
    1.只支持英文字符
    2.采用8位二进制对应一个英文字符

GBK表:
    1.支持英文字符、中文字符
    2.采用8位(8bit=1Bytes)二进制数对应一个英文字符串
      采用16位(16bit=2Bytes)二进制数对应一个中文字符串

unicode:(内存中统一使用unicode)
    1.兼容万国字符
    2.采用16位(16bit=2Bytes)二进制数对应一个中文字符串
    个别生僻字会采用4Bytes,8Bytes
    
    unicode表:                     内存
        人类的字符----------------unicode格式的数字-------
                                    |                 |
                                    |                 |
                                    |                 |
                                   硬盘                |
                                    |                 |
                                    |                 |
                               GBK格式的二进制      shift_JIS格式的二进制

          老的字符编码都可以转成unicode,但是不能通过unicode互转
          
utf-8:就是unicode的转换格式
    英文->1Bytes 
    中文->3Bytes 

1.内存固定使用unicode,我们可以改变的是存入硬盘采用格式
	 英文+汉字=>unicode=>gbk
     英文+日文=>unicode=>shift-jis
     万国字符 =>unicode=>utf-8

5.文本编辑器关于字符编码的应用

2.文本文件存取乱码问题
	 存乱了:文件的编码格式支持存入硬盘采用的格式.
     取乱了:文件以什么编码格式存入硬盘的,就应该以什么方式读入内存.

6.前两个阶段乱码问题解决方案

3.python解释器默认读文件的编码
	python3默认:utf-8
	python2默认:ASCII
	
	指定文件头修改默认的编码
	在py文件的首行写:
		# coding:utf-8 意思是用我告诉你的编码读文件

4.保证运行python程序的前两个阶段不乱码的核心法则:
	指定文件头
	# coding:文件当初存入硬盘时所采用的编码格式
	
	文本编辑器读取python文件内容也经历了三个步骤
	a.先启动文本编辑器。 # 第一个阶段
	b.文本编辑器会发送系统调用,把test.py的内容从硬盘读入内存。 # 第二个阶段
	
	第一阶段:用默认的编码
	第二阶段:# coding:utf-8 意思是用我告诉你的编码读文件

7.第三个阶段不乱码

5.python3的str类型默认直接存成unicode格式,无论如何不会乱码
	保证python2的str类型不乱码
		x=u'上'

8.编码与解码

x = '上'
print([x,])
#             编码                     编码
# 字符-------------------->unicode------------->其他编码

#             解码                      解码
# 字符<--------------------unicode<-------------其他编码

# print(x)
# res = x.encode("gbk")
# print(type(res))

# 强调:在python3里,只会将unicode格式的数字转成字符,其余编码格式的数字均不会转换
# print(res)
# print(res.decode("gbk"))


res = x.encode('gbk')  # unicode==>gbk unicode转成其他格式的编码称为编码

print(res.decode('gbk')) # 其他格式的编码转成unicode称之为解码

9.文件操作的其他方法

# # 一:读相关操作
# # 1.readline:一次读一行
# with open(r'g.txt', mode='rt', encoding='utf-8') as f:
#     # res1 = f.readline()
#     # res2 = f.readline()
#     # print(res1)
#     # print(res2)
#
#     while True:
#         line = f.readline()
#         if len(line) == 0:
#             break
#         print(line)

# # 2.readlines:把文件所有的内容读出来然后放到一个列表里面
# with open(r'g.txt', mode='rt', encoding='utf-8') as f:
#     res = f.readlines()
#     print(res)

# 强调:
# f.read()与f.readlines()都是将内容一次性读入内存,如果内容过大会导致内存溢出,若还想将内容全部读入内存,则必须分多次读入,有两种实现方式

# # 二:写相关操作
# # f.writelines():
# with open('h.txt', mode='wt', encoding='utf-8') as f:
#     # f.write('111\n222\n333\n')
#     # 必须是字符串不是数字
#     # l = ['111\n', '222', '3333',444]
#     l = ['111\n', '222', '3333']
#     # for line in l:
#     #     f.write(line)
#     # 这就是f.writelines(l)
#     f.writelines(l) 

with open('h.txt', mode='wb') as f:
    # l = ['111\n'.encode('utf-8'),
    #      '222'.encode('utf-8'),
    #      '333'.encode('utf-8')
    #      ]
    
    # # 补充1:如果是纯英文字符,可以直接加前缀b得到bytes类型
    # l=[b'111aaa\n',
    #    b'2222b2',
    #    b'333'
    #    ]

    # 补充2:'上'.encode('utf-8') 等同于bytes('上',encoding='utf-8')
    l = [bytes('上啊', encoding='utf-8'),
         bytes('冲呀', encoding='utf-8'),
         bytes('小垃圾们', encoding='utf-8'),
         ]
    f.writelines(l)
    

# # 3.flush:
# with open('h.txt', mode='wt', encoding='utf-8') as f:
#     f.write('哈')
#     # f.flush()
# 
# # 4.了解
# with open('h.txt', mode='wt', encoding='utf-8') as f:
#     print(f.readable())
#     print(f.writable())
#     print(f.encoding)
#     print(f.name)
# 
# # 判断文件是否关闭
# print(f.closed)

10.主动控制文件指针移动

# 指针移动的单位都是以bytes/字节为单位
# 只有一种情况特殊
#         t模式下的read(n),n代表的是字符个数,除此以外都是字节个数

with open('a.txt', mode='rt', encoding='utf-8') as f:
    res = f.read(6)  # 读出6个字符
    print(res)

with open('a.txt', mode='rb') as f:
    res = f.read(8)	# 读出8个字节,6个字节会报错
    print(res.decode('utf-8'))    
    
# 主动控制文件指针移动
# 0模式: 参照文件开头移动n个字节
# f.seek(3,0)
# f.seek(6,0)

# 1模式: 参照当前所在的位置移动n个字节
# f.seek(3,1)
# f.seek(6,1)

# 2模式: 参照文件末尾置移动n个字节
# f.seek(-3,2)
# f.seek(-6,2)

# ps: 只有0模式可以在t下使用,1和2模式都只能在b下使用

a.txt

hello你好

11.主动控制文件指针移动应用

0模式

 with open('a.txt', mode='rb') as f:
    # f.seek(3, 0)
    # f.seek(6, 0)
    # print(f.tell())

1模式

 with open('a.txt', mode='rb') as f:
	f.seek(3, 1)
    f.seek(6, 1)
    print(f.tell())

2模式

with open('a.txt', mode='rb') as f:
    # f.seek(0,2)
    # f.seek(-1,2)
    # print(f.tell())

    # f.seek(6,1)
    # data=f.read()
    # print(len(data))

    f.seek(-3, 2)
    data = f.read()
    print(data.decode('utf-8'))

12.动态监测文件追加内容(f.seek的应用)

soft.py

# tail -f access.log

import time

with open('access.log',mode='at',encoding='utf-8') as f:
    f.write("%s %s\n" %(time.strftime('%Y-%m-%d %H:%M:%S'),"egon给lxx转了10个亿"))

tail.py

import time

with open('access.log',mode='rb') as f:
    f.seek(0,2) # 指针跳到末尾

    while True:
        line = f.readline()
        if len(line) == 0:
            time.sleep(0.1) # 不要过多的消耗cpu资源
        else:
            print(line.decode('utf-8'),end='')

13.截断文件

a.txt

hello你好

test.py

with open('a.txt', mode='at', encoding='utf-8') as f:
    f.truncate(6)  # 截断的是6个字节

14.修改文件的两种方式

user.txt

王苗鲁     男       18      18917127096
熊慧君     女       28      13564332603
吴天雄     男       38      13901811370

两种修改方式

# 修改方式一
# 1.先把文件内容全部读入内存
# 2.然后在内存中完成修改
# 3.再把修改后的结果覆盖写入原文件
# 缺点:会在文件内容过大的情况下,占用过多的内存

with open('user.txt', mode='r', encoding='utf-8') as f:
    data = f.read()
    data = data.replace('王苗鲁', '吴佩其[老男孩第二帅的人]')

with open('user.txt', mode='w', encoding='utf-8') as f:
    f.write(data)



# 修改方式二
# 以读的方式打开原文件,以写的方式打开一个新文件
import os

with open('user.txt', mode='rt', encoding='utf-8') as read_f, \
        open('user.txt.swap', mode='wt', encoding='utf-8') as write_f:
    for line in read_f:
        if '吴佩其' in line:
            line = line.replace('吴佩其', '吴佩其[老男汉特别特别的老]')

        write_f.write(line)

os.remove('user.txt')
os.rename('user.txt.swap', 'user.txt')

标签:day09,utf,encoding,mode,print,txt,open
From: https://www.cnblogs.com/wangmiaolu/p/17877923.html

相关文章

  • Day09 方法知识点综合(求值策略与可变参数)
    1.求值策略编程语言中方法之间进行参数传递时有个传递策略,该策略就被称为求值策略(Evaluationstrategies)。求值策略分为两大基本类型,如果按照如何处理传递给方法的实际参数,分为严格的和非严格的两种求值策略。1.1严格求值策略传值调用(Callbyvalue)将实参复制一份给形参......
  • day09 Helm开发与实践-基于Helm的方式运维管理应用 (3.2-3.3)
    一、Helm开发与实践1、HelmChart详解1.1Chart目录结果#helmcreatenginxCreatingnginx#treenginxnginx├──charts├──Chart.yaml├──templates│  ├──deployment.yaml│  ├──_helpers.tpl│  ├──hpa.yaml│  ├──ingre......
  • Day09 Java的数据类型
    Java的数据类型强类型语言(安全性高速度略慢)要求变量的使用要严格符合规定,所有变量都必须先定义后才能便用弱类型语言(安全性不高速度较快)publicclassDemo02{publicstaticvoidmain(String[]args){Stringa="hello";intnum=10;......
  • day09 文件操作相关
    第二模块函数&模块从今天开始,我们将进入系列课程第二模块的的学习。第一模块主要是学习python基础知识,从第二模块开始就可以通过程序去解决工作中实际的问题。从今天开始,我们将进入第二模块的学习,此模块主要包含两大部分:函数,一个用于专门实现某个功能的代码块(可重用)。......
  • python进阶 day09基本的文件处理
    基本的文件处理什么是文件?操作系统提供给用户的一个虚拟单位文件有什么用?存储数据找到文件路径path=r'D:\上海Python11期视频\python11期视频\day09\test.py'#鼠标右键点击文件,copypath复制路径双击打开f=open(path,'w')#r-->read只读;w-->只写,清......
  • python进阶 day09异常处理
    异常处理语法异常(错误都是SyntaxError)if#SyntaxError0=1#SyntaxErrortry:#尝试num=input('输入一个值')print(3)#代码自上而下,上面会运行1/int(num)#错误不影响其他的代码,报错马上终止try缩进里面的代码print(4)exceptZeroDivisionE......
  • 标准C++ -- day09
    一、智能指针常规指针的缺点:当一个常规指针离开了作用域时,只有该指针变量本身占用的内存空间(4/8字节)会被释放,而它指向的内存空间不会自动释放,当free、delete、delete[]语句忘记执行或者无法执行,形成内存泄漏如何定位内存泄漏、如何预防内存泄漏智能指针的优点:......
  • [代码随想录]Day09-栈与队列part01
    题目:232.用栈实现队列思路:因为go没有栈和队列的类型,直接自己写就行了。比较简单的实现,具体看代码中的注释。代码:typeMyQueuestruct{numbers[]int}funcConstructor()MyQueue{returnMyQueue{numbers:[]int{}}}func(this*MyQueue)Push(xint){......
  • 初学C语言day09--宏定义
    预处理指令程序员所编写的代码并不是能被编译器直接编译的标准C代码,需要一段程序翻译一下翻译的程序称为预处理器,翻译的过程叫做预处理,需要被翻译的代码叫做预处理指令,以#开头的都是预处理指令查看预处理结果:gcc-Ecode.c把预处理的结果显示到终端gcc-Ecode.c-ocode......
  • day09
    Python常用模块time模块(时间)importtime时间戳时间戳(timestamp):时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。importtimetime_stamp=time.time()print(time_stamp,type(time_stamp))1690376372.7548702<class'float'>格式化时间格式化的时间字......