python自动化开发-[第三天]-编码,函数,文件操作
今日概要
- 编码详解
- 文件操作
- 初识函数
一、字符编码
1、代码执行过程
代码-->解释器翻译-->机器码-->执行
2、ASCII
ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符)
后来为了将拉丁文也编码进了ASCII表,将最高位也占用了
3、GBK
GBK::2Bytes代表一个字符
日本把日文编到Shift_JIS
里,韩国把韩文编到Euc-kr
里
4、Unicode(万国码)
至少2Bytes代表一个字符, 2**16-1=65535,可代表6万多个字符,因而兼容万国语言
5、UTF-8
UTF-8,对英文字符只用1Bytes表示,对中文字符用3Bytes
6、unicode和uft-8的优缺点
unicode处理速度快,字符转换数字快,缺点占用空间多(无论字母或者中文都是2bytes)
uft-8的优点占用空间小,缺点是:字符->数字的转换速度慢,因为每次都需要计算出字符需要多长的Bytes才能够准确表示
7、unicode和utf-8的注意事项
- 内存中使用的编码是unicode,用空间换时间(程序都需要加载到内存才能运行,因而内存应该是尽可能的保证快)硬盘中或者网络传输用utf-8,网络I/O延迟或磁盘I/O延迟要远大与utf-8的转换延迟,而且I/O应该是尽可能地节省带宽,保证数据传输的稳定性。
8、python程序执行过程
1、启动python解释器
2、解释器打开文本编辑器,从硬盘中读取内容到内存
3、读取已经加载到内存的代码(unicode编码的二进制),然后进行执行,执行的过程中可能开辟新的内存空间,比如x='dragon'
notice:
不是所有在内存的编码都是unicode
x = 'dragon'在内存的编码是unicode,此时将代码换成x = 'dragon'.encode('utf-8'),那么新申请的内存空间里存放为utf-8编码
详细过程图如下:
9、打开网页过程
打开网页服务器会把动态生成的unicode内容转换为utf-8在传给浏览器,如何服务端encode编码格式为utf-8,客户端内存中接收到的utf-8编码的二进制
10、python2中编码区别
在python2中,str就是编码后的结果bytes,str=bytes,所以在python2中,unicode字符编码的结果是str/bytes
#-*- coding:utf-8 -*-
s='牛' #在执行时,'牛'会被以conding:utf-8的形式保存到新的内存空间中 print repr(s) #'\xe6\x9e\x98' 三个Bytes,证明确实是utf-8
print type(s) #<type 'str'> s.decode('utf-8')
# s.encode('utf-8') #报错,因为s的编码为bytes,只能decode
unicode类型
当python解释器执行到产生字符串的代码时(例如s=u'牛'),会申请新的内存地址,然后将'牛'以unicode的格式存放到新的内存空间中,所以s只能encode,不能decode
s=u'牛'
print repr(s) #u'\u6797'
print type(s) #<type 'unicode'> # s.decode('utf-8') #报错,s为unicode,所以只能encode
s.encode('utf-8')
二、文件操作
1、文件处理的基本流程
(1)打开文件,得到文件句柄并赋值给一个变量
(2)通过文件句柄对文件进行操作
(3)关闭文件,释放内存
f = open('cashi') #打开文件
first_line = f.readline() #读取一行 readlines读取全部返回一个list
data = f.read()# 读取剩下的所有内容,文件大时不要用
print(data) #打印读取内容
f.close() #关闭文件
2、打开文件几种操作方式
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
- r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
- w,只写模式【不可读;不存在则创建;存在则清空内容】
- x, 只写模式【不可读;不存在则创建,存在则报错】
- a, 追加模式【可读; 不存在则创建;存在则只追加内容】
"+" 表示可以同时读写某个文件
- r+, 读写【可读,可写】
- w+,写读【可读,可写】
- x+ ,写读【可读,可写】
- a+, 写读【可读,可写】
"b"表示以字节的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
3、buffer和cache的区别
写入文件的操作也都是存入内存缓冲区buffer(内存速度快于硬盘,如果写入文件的数据都从内存刷到硬盘,内存与硬盘的速度延迟会被无限放大,效率变低,所以要刷到硬盘的数据我们统一往内存的一小块空间即buffer中放,一段时间后操作系统会将buffer中数据一次性刷到硬盘)
4、flush-将写入数据刷入硬盘
import time
with open('3.txt','w+',encoding='utf-8') as f :
for i in range(10): f.write(str(i))
f.flush()
time.sleep(0.5)
5、文件的光标移动,seek,tell,read,truncate
read(3)代表读取3个字符,其余的文件内光标移动都是以字节为单位如seek,tell,read,truncate
f.seek(3) #seek内指定的数字代表字节
seek(3) #默认情况,是以文件起始位置作为开始,往后移动3个bytes
seek(2,1) #1 代表以当前光标所在的位置为开始,往后移动2个 bytes
seek(-1,2) #2表以当前光标所在的位置为开始,往后移动2个 bytes
tell() #当前光标所在的位置
truncate清空文件
6、with上下文管理器
with open('a.txt','r',encoding='utf-8') as f
print(f.read())
print('====>') #这样就不需要进行f.close()关闭文件句柄
7、模拟tailf模式看access日志
import time with open('access.log','r',encoding='utf-8') as f:
f.seek(0,2)
while True:
line = f.readline().strip()
if line:
print('-----',line) time.sleep(0.5)
8、文件修改
#文件修改
import os read_f = open('b.txt','r',encoding='utf-8')
write_f = open('.swp.b.txt','w',encoding='utf-8') for line in read_f.readlines():
if line.startswith('1111'):
line = '2222222\n'
write_f.write(line) read_f.close()
write_f.close() os.remove('b.txt')
os.rename('.swp.b.txt','b.txt')
三、初识函数
1、无函数的代码
(1)无结构,可读性差
(2)代码冗余特别高
2、python函数,定义方法
python中函数定义方法:
def test(x):
"The function definitions"
x+=1
return x def:定义函数的关键字
test:函数名
():内可定义形参
"":文档描述(非必要,但是强烈建议为你的函数添加描述信息)
x+=1:泛指代码块或程序处理逻辑
return:定义返回值
3、python函数分类
1、内置函数
#python自带的内置函数,直接调用就可以
max
min a=len('dragon')
print(a) b=max([1,2,3])
print(b)
2、自定义函数
1.无参数函数
#自定义函数 def print_star():
print('#'*6) def print_msg():
print('hello world') #函数调用 print_star()
print_msg()
2.有参数函数
1.位置参数-位置实参与形参一一对应
位置参数
def foo(x,y,z):#位置形参:必须被传值的参数
print(x,y,z) # foo(1,2,3)
foo(1,2,3) #位置实参数:与形参一一对应
2.关键字参数
注意事项
1:关键字实参必须在位置实参后面
2: 不能重复对一个形参数传值
关键字参数:key=value def foo(x,y,z):
print(x,y,z) foo(z=3,x=1,y=2)
foo(1,z=3,y=2) #正确
foo(x=1,2,z=3) #错误 foo(1,x=1,y=2,z=3)
3.默认参数
#默认参数 def register(name,age,sex='male'): #形参:默认参数
print(name,age,sex) register('asb',age=40)
register('a1sb',39)
register('a2sb',30)
register('a3sb',29) register('钢蛋',20,'female')
register('钢蛋',sex='female',age=19) #默认参数需要注意的问题:
#*****一:默认参数必须跟在非默认参数后
def register(sex='male',name,age): #在定义阶段就会报错
print(name,age,sex) #二:默认参数在定义阶段就已经赋值了,而且只在定义阶段赋值一次
a=100000000
def foo(x,y=a):
print(x,y)
a=0
foo(1) #三:默认参数的值通常定义成不可变类型
4.可变长参数(*args,**kwargs)
*会把溢出的按位置定义的实参都接收,以元组的形式赋值给args
**会把溢出的按关键字定义的实参都接收,以字典的形式赋值给kwargs
def foo(x,y,*args):
print(x,y)
print(args) foo(1,2,3,4,5) def add(*args):
res=0
for i in args:
res+=i
return res
print(add(1,2,3,4))
print(add(1,2)) def foo(x, y, **kwargs):
print(x, y)
print(kwargs)
foo(1,2,a=1,name='egon',age=18)
5.命令关键字参数
def foo(name,age,*,sex='male',height):
print(name,age)
print(sex)
print(height)
#*后定义的参数为命名关键字参数,这类参数,必须被传值,而且必须以关键字实参的形式去传值
foo('egon',17,height='185') def foo(name,age=10,*args,sex='male',height,**kwargs):
def foo(name,age=10,*args,sex='male',height,**kwargs):
print(name)
print(age)
print(args)
print(sex)
print(height)
print(kwargs) foo('alex',1,2,3,4,5,sex='female',height='150',a=1,b=2,c=3)
3.空函数
def delete():
pass def insert()
pass
4、函数的调用
#!/usr/bin/python
# -*- coding:utf-8 -*- def foo():
print('from foo') def bar(name):
print('bar===>',name) #按照有参和无参可以将函数调用分两种
foo() #定义时无参,调用时也无需传入参数
bar('egon') #定义时有参,调用时也必须有参数 #按照函数的调用形式和出现的位置,分三种 foo() #调用函数的语句形式 def my_max(x,y):
res=x if x >y else y
return res # res=my_max(1,2)*10000000 #调用函数的表达式形式
# print(res) res=my_max(my_max(10,20),30) #把函数调用当中另外一个函数的参数
print(res)
5、三元运算
#正常方法
x=10
y=2
if x > y:
print(x)
else:
print(y) #简化版方法
res=x if x > y else y
print(res)
python自动化开发-[第三天]-编码,函数,文件操作的更多相关文章
- Python全栈之路4--内置函数--文件操作
上节重点回顾: 判断对象是否属于某个类,例如: 列表中有个数字,但是循环列表判断长度,用len会报错;因为int不支持len,所以要先判断属于某个类,然后再进行if判断. # isinstance(对 ...
- python自动化--语言基础三字典、函数、全局/局部变量
字典 dict1 = {,'class':'first'} print(dict1.keys()) #打印所有的key值 print(dict1.values()) #打印所有的values值 pri ...
- python自动化开发学习 进程, 线程, 协程
python自动化开发学习 进程, 线程, 协程 前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...
- Python自动化开发
阅读目录 第一篇:python入门 第二篇:字符编码.文件处理 第三篇:函数 第四篇:迭代器.生成器.三元表达式.列表生成式 第五篇:模块.包.软件开发规范 第六篇:日志模块 第七篇:常用模块 第八篇 ...
- python自动化开发学习 I/O多路复用
python自动化开发学习 I/O多路复用 一. 简介 socketserver在内部是由I/O多路复用,多线程和多进程,实现了并发通信.IO多路复用的系统消耗很小. IO多路复用底层就是监听so ...
- JS三个编码函数和net编码System.Web.HttpUtility.UrlEncode比较
JS三个编码函数和net编码比较 总结 1.escape.encodeUri.encodeUriComponent均不会对数字.字母进行编码.2.escape:对某些字符(如中文)进行unicode编 ...
- Python爬虫与数据分析之进阶教程:文件操作、lambda表达式、递归、yield生成器
专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...
- Python自动化 【第三篇】:Python基础-集合、文件操作、字符编码与转码、函数
1. 集合 1.1 特性 集合是一个无序的,不重复的数据组合,主要作用如下: 去重,把一个列表变成集合实现自动去重. set可以看成数学意义上的无序和无重复元素的集合,因此,两 ...
- Python自动化开发 - 字符编码、文件和集合
本节内容 字符编码 文件操作 集合 一.字符编码 1.编码 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.解决思路:数字与符号建立一对一映射,用不同数字表示不同符号. ASCI ...
随机推荐
- nargin
nargin 编辑 nargin为“number of input arguments”的缩写. 在matlab中定义一个函数时, 在函数体内部, nargin是用来判断输入变量个数的函数.在matl ...
- 提交已经注入文件的表单给后台上传图片 使用ajaxsubmit
- git bash 下操作文件及文件夹命令
1, cd : change directory的简写,改变目录的意思,就是切换到哪个目录下, 如 cd e:\fff 切换 E 盘下面的fff 目录. 当我们用cd 进入文件夹时,我们可以使用 通 ...
- hdu-6166(最短路+二进制分组)
题意:给你n个点m条边的有向图,然后再给你k个不同的点,问你这k个点的最小距离: 解题思路:这道题最需要注意的就是k个点一定是不同的,那么有一个结论就是任意两个不同的数字中,在他们的二进制地表示中,一 ...
- 会话session
因为因特网HTTP协议的特性,每一次来自于用户浏览器的请求(request)都是无状态的.独立的.通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用户.对于静 ...
- PHP——base64的图片的另类上传方法
前言 这只是个暂行的办法,回头研究好七牛云的base64上传或者vue的文件上传后还是要进行更改的 想法是这样的,既然前端只能穿base64的那就传base64的然后转为文件上传到七牛云后再删除 本地 ...
- 关闭VS2017脚本调试 已启用 Visual Studio 中的 Chrome 脚本调试
转载:https://blog.csdn.net/lilinoscar/article/details/79114721 每当调试项目时,都是重新打开一个浏览器窗口,而且关闭调试后,也会关闭窗口,很麻 ...
- 【XSY2693】景中人 区间DP
题目描述 平面上有\(n\)个点,你要用一些矩形覆盖这些点,要求: 每个矩形的下边界为\(y=0\) 每个矩形的大小不大于\(s\) 问你最少要用几个矩形. \(n\leq 100,1\leq y\l ...
- 【BZOJ1426】收集邮票 期望DP
题目大意 有\(n\)种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是\(n\)种邮票中的哪一种是等概率的,概率均为\(\frac{1} ...
- LG P2473 [SCOI2008]奖励关
题目链接:P2473 [SCOI2008]奖励关 题意:有n个宝物 每次等概率抛出其中之一一共抛出k次每个宝物有一个价值 和一个前提集合只有集齐了集合中的所有宝物 才可以领取这个宝物 范围:1 < ...