python数据类型、字符编码、文件处理

数据类型主要用一下 一二三点来进行分析
#一:基本使用 1 用途 2 定义方式 3 常用操作+内置的方法 #二:该类型总结 1 存一个值or存多个值 只能存一个值 可以存多个值,值都可以是什么类型 2 有序or无序 3 可变or不可变 !!!可变:值变,id不变。可变==不可hash !!!不可变:值变,id就变。不可变==可hash

一:整型和浮点型
#整型int
  作用:年纪,等级,身份证号,qq号等整型数字相关
  定义:
    age=10 #本质age=int(10)

#浮点型float
  作用:薪资,身高,体重,体质参数等浮点数相关

    salary=3000.3 #本质salary=float(3000.3)
浮点型和整型:
没有可变不可变直说,存一个值 #二进制,十进制,八进制,十六进制 

二:字符串
#作用:名字,性别,国籍,地址等描述信息

#定义:在单引号\双引号\三引号内,由一串字符组成
name='egon'

#优先掌握的操作:
#1、按索引取值(正向取+反向取) :只能取
#2、切片(顾头不顾尾,步长)
#3、长度len
#4、成员运算in和not in
#1、按索引取值(正向取+反向取) :只能取
# msg='he lo'
# print(msg[0])
# print(msg[2])
# msg[2]='A'

#2、切片(顾头不顾尾,步长)
# msg='hello world'
# print(msg[0:4]) #hell
# print(msg[0:4:2]) #hell

#3、长度len
# msg='hello'
# print(len(msg))

#4、成员运算in和not in
# msg='alex say my name is alex'
# if 'alex' in msg:
#     print('存在')

# print('alex' not in msg) # 推荐使用
# print(not 'alex' in msg)

  

#5、移除空白strip #6、切分split #7、循环
#1、strip(移除空白),lstrip(移除左边空白),rstrip (移除右边空白)
#2、lower(全部小写),upper(全部大写)
#3、startswith(是否什么开头),endswith(是否什么结尾)
#4、format的三种玩法(格式化处理方式)
#5、split(分隔符),rsplit
#6、join(加入字符串)
#7、replace(替代)
#8、isdigit(是否为整数)
#strip
name='*egon**'
print(name.strip('*'))
print(name.lstrip('*'))
print(name.rstrip('*'))

#lower,upper
name='egon'
print(name.lower())
print(name.upper())

#startswith,endswith
name='alex_SB'
print(name.endswith('SB'))
print(name.startswith('alex'))

#format的三种玩法
res='{} {} {}'.format('egon',18,'male')
res='{1} {0} {1}'.format('egon',18,'male')
res='{name} {age} {sex}'.format(sex='male',name='egon',age=18)

#split
name='root:x:0:0::/root:/bin/bash'
print(name.split(':')) #默认分隔符为空格
name='C:/a/b/c/d.txt' #只想拿到顶级目录
print(name.split('/',1))

name='a|b|c'
print(name.rsplit('|',1)) #从右开始切分

#join
tag=' '
print(tag.join(['egon','say','hello','world'])) #可迭代对象必须都是字符串

#replace
name='alex say :i have one tesla,my name is alex'
print(name.replace('alex','SB',1))

#isdigit:可以判断bytes和unicode类型,是最常用的用于于判断字符是否为"数字"的方法
age=input('>>: ')
print(age.isdigit())

示例
View Code
只需要了解
#1、find,rfind,index,rindex,count #2、center,ljust,rjust,zfill #3、expandtabs #4、captalize,swapcase,title #5、is数字系列 #6、is其他
#find,rfind,index,rindex,count
name='egon say hello'
print(name.find('o',1,3)) #顾头不顾尾,找不到则返回-1不会报错,找到了则显示索引
# print(name.index('e',2,4)) #同上,但是找不到会报错
print(name.count('e',1,3)) #顾头不顾尾,如果不指定范围则查找所有

#center,ljust,rjust,zfill
name='egon'
print(name.center(30,'-'))
print(name.ljust(30,'*'))
print(name.rjust(30,'*'))
print(name.zfill(50)) #用0填充

#expandtabs
name='egon\thello'
print(name)
print(name.expandtabs(1))

#captalize,swapcase,title
print(name.capitalize()) #首字母大写
print(name.swapcase()) #大小写翻转
msg='egon say hi'
print(msg.title()) #每个单词的首字母大写

#is数字系列
#在python3中
num1=b'4' #bytes
num2=u'4' #unicode,python3中无需加u就是unicode
num3='' #中文数字
num4='' #罗马数字

#isdigt:bytes,unicode
print(num1.isdigit()) #True
print(num2.isdigit()) #True
print(num3.isdigit()) #False
print(num4.isdigit()) #False

#isdecimal:uncicode
#bytes类型无isdecimal方法
print(num2.isdecimal()) #True
print(num3.isdecimal()) #False
print(num4.isdecimal()) #False

#isnumberic:unicode,中文数字,罗马数字
#bytes类型无isnumberic方法
print(num2.isnumeric()) #True
print(num3.isnumeric()) #True
print(num4.isnumeric()) #True

#三者不能判断浮点数
num5='4.3'
print(num5.isdigit())
print(num5.isdecimal())
print(num5.isnumeric())
'''
总结:
    最常用的是isdigit,可以判断bytes和unicode类型,这也是最常见的数字应用场景
    如果要判断中文数字或罗马数字,则需要用到isnumeric
'''

#is其他
print('===>')
name='egon123'
print(name.isalnum()) #字符串由字母或数字组成
print(name.isalpha()) #字符串只由字母组成

print(name.isidentifier())
print(name.islower())
print(name.isupper())
print(name.isspace())
print(name.istitle())

示例
View Code

三:列表

 

#作用:多个装备,多个爱好,多门课程,多个女朋友等

#定义:[]内可以有多个任意类型的值,逗号分隔
my_girl_friends=['alex','wupeiqi','yuanhao',4,5] #本质my_girl_friends=list([...])
或
l=list('abc')

#优先掌握的操作:
#1、按索引存取值(正向存取+反向存取):即可存也可以取      
#2、切片(顾头不顾尾,步长)
#3、长度
#4、成员运算in和not in

#5、追加
#6、删除
#7、循环
#ps:反向步长
l=[1,2,3,4,5,6]

#正向步长
l[0:3:1] #[1, 2, 3]
#反向步长
l[2::-1] #[3, 2, 1]
#列表翻转
l[::-1] #[6, 5, 4, 3, 2, 1]
列表属于有序的,存多个值,可变的的类型
#一:list基本使用
# 1 用途:存放多个值

# 2 定义方式:[]内用逗号分隔开多个元素,每个元素可以是任意数据类型
# l=[1,'a',[1,2]] #l=list([1,'a',[1,2]])

# 3 常用操作+内置的方法
#优先掌握的操作:
#1、按索引存取值(正向存取+反向存取):即可以取也可以改
names=['egon','alex','wxx','xxx','yxx']
# print(names[4])
# print(names[-1])
# print(names[-2])
# print(id(names))
# names[0]='EGON'
# print(id(names))
# print(names)
# names[5]=3 #超出索引限制就会报错

#2、切片(顾头不顾尾,步长)
names=['egon','alex','wxx','xxx','yxx']
# print(names[0:3:2])
# print(names[:])

#了解:反向步长
# print(names[3:-1:-1])
# print(names[-1::-1])

#3、长度
# names=['egon','alex','wxx','xxx','yxx']
# print(len(names))

#4、成员运算in和not in
# names=['egon','alex','wxx','xxx','yxx',1,2,3,4]
# print('alex' in names)
# print(4 in names)


#5、追加与插入
# names=['egon','alex','wxx','xxx','yxx']
# names.append('oldboy1')
# names.append('oldboy2')
# names.append('oldboy3')
# print(names)

# names.insert(2,'oldboy')
# print(names)

#6、删除列表中某一个元素
names=['egon','alex','wxx','xxx','yxx']
# del names[2]
# print(names)

# res=names.remove('wxx') # 指定要删除的元素,remove方法没有返回值
# print(res)
# print(names)

#从列表中取走一个元素
# if 100 < len(names):
#     res=names.pop(100) # 按照索引删除的元素(会返回刚刚删掉的元素),超过索引限制则报错
#     print(names)
#     print(res)


#7、循环
# names=['egon','alex','wxx','xxx','yxx',1,2,3,4]
# for x in names:
#     print(x)





# 需要掌握的操作
names=['egon','alex','wxx','xxx','xxx','yxx',1,2,3,4]
# names.reverse()
# names.reverse()
# print(names)

# names.count()
# print(names.count('xxx'))

# names.clear()
# names.clear()
# print(names)

# names.copy()
# l=names.copy()
# print(l)

# names.index()
# names=['egon','alex','wxx','xxx','xxx','yxx',1,2,3,4]
# print(names.index('alexasdf'))

# names.sort():  列表中的元素必须是同一类型才能比较排序
# names=['b','a','+']
# names.sort()
# print(names)


# 了解:字符\|列表之间比较大小
# x='hello'
# y='z'

# print(y > x)
#排序:'A-Za-z'


# l1=[1,2,'a','b']
# l2=[1,2,'b']
#
# print(l2 > l1)


#二:该类型总结
# 1 存多个值

# 2 有序

# 3 可变



#练习题:
#1 队列:先进先出
l=[]
#  入队:first->second->third
# l.append('first')
# l.append('second')
# l.append('third')
# print(l)
# 出队:
# print(l.pop(0))
# print(l.pop(0))
# print(l.pop(0))


#2 堆栈:先进后出
#  入栈:first->second->third
l.append('first')
l.append('second')
l.append('third')

# 出栈:third->second->first
print(l.pop(-1))
print(l.pop())
print(l.pop())
View Code

四:元祖

#作用:存多个值,对比列表来说,元组不可变(是可以当做字典的key的),主要是用来读

#定义:与列表类型比,只不过[]换成()
age=(11,22,33,44,55)本质age=tuple((11,22,33,44,55))

#优先掌握的操作:
#1、按索引取值(正向取+反向取):只能取   
#2、切片(顾头不顾尾,步长)
#3、长度
#4、成员运算in和not in

#5、循环

五:字典
#作用:存多个值,key-value存取,取值速度快

#定义:key必须是不可变类型,value可以是任意类型
info={'name':'egon','age':18,'sex':'male'} #本质info=dict({....})
或
info=dict(name='egon',age=18,sex='male')
或
info=dict([['name','egon'],('age',18)])
或
{}.fromkeys(('name','age','sex'),None)

#优先掌握的操作:
#1、按key存取值:可存可取
#2、长度len
#3、成员运算in和not in

#4、删除
#5、键keys(),值values(),键值对items()
#6、循环
一:dict基本使用
1 用途:存多个值,key:value,key对value有描述的作用

2 定义方式:{}内用逗号分开多个元素,每一个元素都是key:value的形式
其中key必须是不可变类型,key通常都应该是字符串类型
其中value可以是任意数据类型
info={'name':'egon',(1,2):18}  #info=dict({'name':'egon','age':18})
print(info['name'])
print(info[(1,2)])

3 常用操作+内置的方法
优先掌握的操作:
1、按key存取值:可存可取
d={'x':1}
print(id(d))
d['x']=2
print(id(d))
print(d)

d['y']=3
print(d)


2、长度len
info={'x':1,'y':2,'z':3}
print(len(info))

3、成员运算in和not in :判断的是字典的key
info={'x':1,'y':2,'z':3}
print('x' in info)

4、删除
info={'x':1,'y':2,'z':3}
del  info['x']
print(info)

print(info.popitem())

print(info.pop('xxxxx',None))
print(info)

5、键keys(),值values(),键值对items()
msg_dic={
'apple':10,
'tesla':100000,
'mac':3000,
'lenovo':30000,
'chicken':10,
}
print(msg_dic.keys())

6、循环
msg_dic={
'apple':10,
'tesla':100000,
'mac':3000,
'lenovo':30000,
'chicken':10,
}
如果我想根据key来取对应的值,在值不存在的情况下会抛出异常KeyError,如何避免该问题?
答:用get方法取值可以避免异常
7、更新、增加 update更新 字典 用新数据更新原来表格数据 msg_dic.update d1={'x':1,'y':2} d1.update({'x':2,'z':3}) print(d1) msg_dic.setdefault 1、key存在,则不改变key对应的值,放回原值 d={'x':1,'y':2} res=d.setdefault('x',1000) # print(d) print(res) 2、key不存在,则增加一个key:value,返回新增的value d={'x':1,'y':2} res=d.setdefault('z',1000) print(d) print(res) 总结:setdefault有则不变,无则增加 s='hello alex alex say hello sb sb' words=s.split() d={} for word in words: if word not in d: d[word]=1 #d={'hello':1,'alex':1} else: d[word]+=1 d.setdefault(word,words.count(word)) print(d)

 文件处理:

一 介绍

计算机系统分为:计算机硬件,操作系统,应用程序三部分。

我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:

#1. 打开文件,得到文件句柄并赋值给一个变量
#2. 通过句柄对文件进行操作
#3. 关闭文件
二 在python中
#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r

#2. 通过句柄对文件进行操作
data=f.read()

#3. 关闭文件
f.close()
三 f=open('a.txt','r')的过程分析
#1、由应用程序向操作系统发起系统调用open(...)

#2、操作系统打开该文件,并返回一个文件句柄给应用程序

#3、应用程序将文件句柄赋值给变量f
四 强调!!!
#强调第一点:
打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为:
1、f.close() #回收操作系统级打开的文件
2、del f #回收应用程序级的变量

其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源,
而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close()

虽然我这么说,但是很多同学还是会很不要脸地忘记f.close(),对于这些不长脑子的同学,我们推荐傻瓜式操作方式:使用with关键字来帮我们管理上下文
with open('a.txt','w') as f:
    pass
 
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
    data=read_f.read()
    write_f.write(data)
#强调第二点:
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。

f=open('a.txt','r',encoding='utf-8')
强调资源回收和文字编码

 

练习,利用b模式,编写一个cp工具,要求如下:

  1. 既可以拷贝文本又可以拷贝视频,图片等文件

  2. 用户一旦参数错误,打印命令的正确使用方法,如usage: cp source_file target_file

  提示:可以用import sys,然后用sys.argv获取脚本后面跟的参数

import sys
if len(sys.argv) != 3:
    print('usage: cp source_file target_file')
    sys.exit()

source_file,target_file=sys.argv[1],sys.argv[2]
with open(source_file,'rb') as read_f,open(target_file,'wb') as write_f:
    for line in read_f:
        write_f.write(line)
View Code

五 文件的修改

文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    data=read_f.read() #全部读入内存,如果文件很大,会很卡
    data=data.replace('alex','SB') #在内存中完成修改

    write_f.write(data) #一次性写入新文件

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

 方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:
    for line in read_f:
        line=line.replace('alex','SB')
        write_f.write(line)

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

 


 


 

 
posted @ 2018-04-09 11:14  SH金刚狼  阅读(165)  评论(0编辑  收藏  举报