python基础之day2
python基本数据类型
1、数字
- int(整型)
在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647
在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807
- float(浮点型)
浮点数也就是小数,按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是完全相等的,对于很大或很小的浮点数,用10用e替代,1.23x109 就是1.23e9
,或者12.3e8
, 0.000012可以写成1.2e-5
,等
2、布尔型
布尔值和布尔代数的表示完全一致,一个布尔值只有True
、False
两种值,也可以用0和1来表示。
布尔值可以用and
、or
和not
运算。
1)
and
运算是与运算,只有所有都为True
,and
运算结果才是True
:
1 >>> True and True 2 True 3 >>> True and False 4 False 5 >>> False and False 6 False 7 >>> 5 > 3 and 3 > 1 8 True
2)or
运算是或运算,只要其中有一个为True
,or
运算结果就是True
: 3)not
运算是非运算,它是一个单目运算符,把True
变成False
,False
变成True
:1 >>> not True 2 False 3 >>> not False 4 True 5 >>> not 1 > 2 6 True
布尔值经常用在条件判断中,比如:
1 if age >= 18: 2 print('adult') 3 else: 4 print('teenager')
空值是Python里一个特殊的值,用None
表示。None
不能理解为0
,因为0
是有意义的,而None
是一个特殊的空值。
4、字符串
字符串是以单引号'
或双引号"
括起来的任意文本,比如'abc'
,"xyz"
等等
由于Python的字符串类型是str
,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str
变为以字节为单位的bytes
。
Python对bytes
类型的数据用带b
前缀的单引号或双引号表示: x = b'ABC'
要注意区分'ABC'
和b'ABC'
,前者是str
,后者虽然内容显示得和前者一样,但bytes
的每个字符都只占用一个字节。以Unicode表示的str
通过encode()
方法可以编码为指定的bytes
,例如:
>>> 'ABC'.encode('ascii') b'ABC' >>> '中文'.encode('utf-8') b'\xe4\xb8\xad\xe6\x96\x87' >>> '中文'.encode('ascii') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
纯英文的str
可以用ASCII
编码为bytes
,内容是一样的,含有中文的str
可以用UTF-8
编码为bytes
。含有中文的str
无法用ASCII
编码,因为中文编码的范围超过了ASCII
编码的范围,Python会报错。
在bytes
中,无法显示为ASCII字符的字节,用\x##
显示。
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes
。要把bytes
变为str
,就需要用decode()
方法:
>>> b'ABC'.decode('ascii') 'ABC' >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') '中文'
对字符串的操作
- 移除空白
- 分割
- 长度
- 索引
- 切片
字符串格式化
Python的字符串格式化有两种方式: 百分号方式、format方式
1.百分号方式
1 %[(name)][flags][width].[precision]typecode
- (name) 可选,用于选择指定的key
- flags 可选,可供选择的值有:
- + 右对齐;正数前加正好,负数前加负号;
- - 左对齐;正数前无符号,负数前加负号;
- 空格 右对齐;正数前加空格,负数前加负号;
- 0 右对齐;正数前无符号,负数前加负号;用0填充空白处
- width 可选,占有宽度
- .precision 可选,小数点后保留的位数
- typecode 必选
- s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置
- r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置
- c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
- o,将整数转换成 八 进制表示,并将其格式化到指定位置
- x,将整数转换成十六进制表示,并将其格式化到指定位置
- d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
- e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
- E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
- f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
- F,同上
- g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
- G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
- %,当字符串中存在格式化标志时,需要用 %%表示一个百分号
注:Python中百分号格式化是不存在自动将整数转换成二进制表示的方式
常见的用法
s = 'dbb %' print (s) s1 = 'dbb %s %%'%('derby') print(s1) s3 = 'name:%s age:%d'%('dbb',18) print(s3) >>> dbb % >>> dbb derby % >>> name:dbb age:18
>>>s = 'Info: %(name)-10s %(age)d salary:%(p).2f'%{'name':'dbb','age':18,'p':1.237334} >>>print (s) >>>Info: dbb 18 salary:1.24
2.format 方式
1 [[fill]align][sign][#][0][width][,][.precision][type]
- fill 【可选】空白处填充的字符
- align 【可选】对齐方式(需配合width使用)
- <,内容左对齐
- >,内容右对齐(默认)
- =,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字
- ^,内容居中
- sign 【可选】有无符号数字
- +,正号加正,负号加负;
- -,正号不变,负号加负;
- 空格 ,正号空格,负号加负;
- # 【可选】对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示
- , 【可选】为数字添加分隔符,如:1,000,000
- width 【可选】格式化位所占宽度
- .precision 【可选】小数位保留精度
- type 【可选】格式化类型
- 传入” 字符串类型 “的参数
- s,格式化字符串类型数据
- 空白,未指定类型,则默认是None,同s
- 传入“ 整数类型 ”的参数
- b,将10进制整数自动转换成2进制表示然后格式化
- c,将10进制整数自动转换为其对应的unicode字符
- d,十进制整数
- o,将10进制整数自动转换成8进制表示然后格式化;
- x,将10进制整数自动转换成16进制表示然后格式化(小写x)
- X,将10进制整数自动转换成16进制表示然后格式化(大写X)
- 传入“ 浮点型或小数类型 ”的参数
- e, 转换为科学计数法(小写e)表示,然后格式化;
- E, 转换为科学计数法(大写E)表示,然后格式化;
- f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
- F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
- g, 自动在e和f中切换
- G, 自动在E和F中切换
- %,显示百分比(默认显示小数点后6位)
- 传入” 字符串类型 “的参数
常见用法
s1 = 'dengbinbin-{0}-a234-{0}-3-{1}'.format('derby',18) s2 = '---{name:s}===={age:d}----{name:s}'.format(name='derby',age=18) print(s1) print(s2) >>> dengbinbin-derby-a234-derby-3-18 >>> ---derby====18----derby
s1 = "-----{:2^20}-----{:+d}==={:#b}".format('derby',123,10) print (s1) s2 = 'adsd {:%}'.format(1.2323343) s3 = 'adsd {:.3%}'.format(1.2323343) print(s2) print(s3) >>>-----2222222derby22222222-----+123===0b1010 >>>adsd 123.233430% >>>adsd 123.233%
1 >>> tpl = "i am {}, age {}, {}".format("seven", 18, 'alex') 2 >>> print(tpl) 3 i am seven, age 18, alex 4 5 >>> tpl = "i am {}, age {}, {}".format(*["seven", 18, 'alex']) 6 >>> print(tpl) 7 i am seven, age 18, alex 8 9 >>> tpl = "i am {0}, age {1}, really {0}".format("seven", 18) 10 >>> print(tpl) 11 i am seven, age 18, really seven 12 13 >>> tpl = "i am {0}, age {1}, really {0}".format(*["seven", 18]) 14 >>> print(tpl) 15 i am seven, age 18, really seven 16 17 >>> tpl = 'i am {name},age{age},really{name}'.format(**{'name':'derby','age':18}) 18 >>> print(tpl) 19 i am derby,age18,reallyderby 20 >>> 21 >>> tpl = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2) 22 >>> print(tpl) 23 numbers: 1111,17,15,f,F, 1587.623000% 24 >>> tpl = "numbers: {0:b},{0:o},{0:d},{0:x},{0:X}, {0:%}".format(15) 25 >>> print(tpl) 26 numbers: 1111,17,15,f,F, 1500.000000% 27 >>> tpl = "numbers: {num:b},{num:o},{num:d},{num:x},{num:X}, {num:%}".format(num=15) 28 >>> print(tpl) 29 numbers: 1111,17,15,f,F, 1500.000000% 30 >>>
5.列表
列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作
# 定义列表 name=["zhangshan","lisi","wangwu","Derby"] #通过下标访问列表中的元素,下标从0开始计数 >>> names[0] 'zhangshan' >>> names[-1] #还可以倒着取 'Derby'
对列表的操作
1 >>> name = ["zhangshan",'lisi','lily','derby'] 2 >>> name[1:3] #取下标1至下标3之间的数字,包括1,不包括3 3 ['lisi', 'lily'] 4 >>> name[1:-1] #取下标1至-1的值,不包括-1 5 ['lisi', 'lily'] 6 >>> name[:2] #如果是从头开始取,0可以忽略,跟上句效果一样 7 ['zhangshan', 'lisi'] 8 >>> name[1:] #如果想取最后一个,必须不能写-1,只能这么写 9 ['lisi', 'lily', 'derby'] 10 >>> name[::2] #后面的2是代表步长,每隔2个元素,就一个 11 ['zhangshan', 'lily']
1 >>> name 2 ['zhangshan', 'lisi', 'lily', 'derby'] 3 >>> name.append('newcomer') #默认都是追加到最后 4 >>> name 5 ['zhangshan', 'lisi', 'lily', 'derby', 'newcomer'] 6 >>> name.insert(3,'wangwu') #在第三个元素前面插入wangwu 7 >>> name 8 ['zhangshan', 'lisi', 'lily', 'wangwu', 'derby', 'newcomer']
1 >>> name 2 ['zhangshan', 'lisi', 'lily', 'wangwu', 'derby', 'newcomer'] 3 >>> name[1]="李四" #lisi改成中文 4 >>> name 5 ['zhangshan', '李四', 'lily', 'wangwu', 'derby', 'newcomer'] 6 >>> del name[1] #常用的删除方法 7 >>> name 8 ['zhangshan', 'lily', 'wangwu', 'derby', 'newcomer'] 9 >>> name.remove("lily") #删除指定的元素 10 >>> name 11 ['zhangshan', 'wangwu', 'derby', 'newcomer'] 12 >>> name.pop() #删除最后一个元素 13 'newcomer' 14 >>> name 15 ['zhangshan', 'wangwu', 'derby']
1 >>> name 2 ['zhangshan', 'wangwu', 'derby'] 3 >>> 4 >>> b = [1,2,3] 5 >>> name.extend(b) 6 >>> name 7 ['zhangshan', 'wangwu', 'derby', 1, 2, 3] 8 >>> name1=name.copy() 9 >>> name1 10 ['zhangshan', 'wangwu', 'derby', 1, 2, 3] 11 >>>
1 >>> name 2 ['zhangshan', 'wangwu', 'derby', 1, 2, 3] 3 >>> name.sort() #Python3已经不支持不同数据类型排序2 OK 4 Traceback (most recent call last): 5 File "<pyshell#48>", line 1, in <module> 6 name.sort() 7 TypeError: unorderable types: int() < str() 8 >>> name.reverse() #反转 9 >>> name 10 [3, 2, 1, 'derby', 'wangwu', 'zhangshan'] 11 >>> name.append("derby") 12 >>> name 13 [3, 2, 1, 'derby', 'wangwu', 'zhangshan', 'derby'] 14 >>> name.index('derby') #只返回找到的第一个下标 15 3
6.元组
元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表
语法
>>> name = ("zhangshan","derby","wangwu") >>> name ('zhangshan', 'derby', 'wangwu')
只用2个方法,一个是count,一个是index。
7.字典
字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。
创建字典:
person = {"name": "cangjingkong", 'age': 18}
字典的特性:
- 字典是无序的
- key必须唯一,因此天生去重
字典的操作
#字典之基本操作
#增加 >>> nameinfo {'age': 18, 'name': 'cangjingkong'} >>> nameinfo["name1"]="wutenglan" >>> nameinfo {'age': 18, 'name': 'cangjingkong', 'name1': 'wutenglan'} #修改 >>> nameinfo["name"]="苍井空" >>> nameinfo {'age': 18, 'name': '苍井空', 'name1': 'wutenglan'} #删除 >>> nameinfo {'age': 18, 'name': '苍井空', 'name1': 'wutenglan'} >>> nameinfo.pop("age") #标准删除 18 >>> nameinfo {'name': '苍井空', 'name1': 'wutenglan'} >>> del nameinfo["name"] #其他方法删除 >>> nameinfo {'name1': 'wutenglan'} >>> nameinfo["name3"]="mariya" >>> nameinfo {'name3': 'mariya', 'name1': 'wutenglan'} >>> nameinfo.popitem() #随机删除 ('name3', 'mariya') #查找 >>> nameinfo {'age': 18, 'name': 'cangjingkong', 'name1': 'wutenglan'} >>> "age" in nameinfo #标准用法 True >>> nameinfo.get("name") #get方法,不存在返回None 'cangjingkong' >>> nameinfo['name'] #同上但是,不存在会报错 'cangjingkong'
1 # update 功能覆盖之前字典里的key-value, 即之前字典没有key的会添加,之前字典有的key 2 3 >>> CityDict 4 {'上海': {'徐汇区': ['复旦大学'], '杨浦区': ['魔都科技', '外滩小酒馆', '大上海歌舞厅'], '闵行区': ['东方明珠塔']}, '北京': {'海定区': ['百度科技', '京东商城'], '昌平区': ['老男孩教育', '其他培训机构'], '东城区': ['天朝天安门', '天朝北站']}, '广东': {'广州': ['天河区', '越秀区', '海珠区'], '深圳': ['罗湖', '南山', '福田']}} 5 6 >>> dict2 = {'name':'国家','上海':{'徐汇区':['同济大学']}} 7 >>> dict2 8 {'name': '国家', '上海': {'徐汇区': ['同济大学']}} 9 >>> CityDict.update(dict2) 10 >>> print(CityDict) 11 {'name': '国家', '上海': {'徐汇区': ['同济大学']}, '北京': {'海定区': ['百度科技', '京东商城'], '昌平区': ['老男孩教育', '其他培训机构'], '东城区': ['天朝天安门', '天朝北站']}, '广东': {'广州': ['天河区', '越秀区', '海珠区'], '深圳': ['罗湖', '南山', '福田']}} 12 13 >>> dictw= {'北京': {'东城区': ['只有帝都天朝']}} 14 >>> CityDict.update(dictw) 15 >>> CityDict 16 {'name': '国家', '上海': {'徐汇区': ['同济大学']}, '北京': {'东城区': ['只有帝都天朝']}, '广东': {'广州': ['天河区', '越秀区', '海珠区'], '深圳': ['罗湖', '南山', '福田']}} 17 18 19 #获取 key 和 values 20 21 >>> CityDict.values() #获取values 22 dict_values(['国家', {'徐汇区': ['同济大学']}, {'东城区': ['只有帝都天朝']}, {'广州': ['天河区', '越秀区', '海珠区'], '深圳': ['罗湖', '南山', '福田']}]) 23 >>> CityDict.keys() #获取keys 24 dict_keys(['name', '上海', '北京', '广东']) 25 26 #判断 字典里是否存在相应的key 27 28 >>> '上海' in CityDict 29 True 30 31 # 添加默认值 32 >>> CityDict.setdefault('江西',{'南昌':['九江','新余']}) 33 {'南昌': ['九江', '新余']} 34 >>> CityDict 35 {'name': '国家', '江西': {'南昌': ['九江', '新余']}, '上海': {'徐汇区': ['同济大学']}, '北京': {'东城区': ['只有帝都天朝']}, '广东': {'广州': ['天河区', '越秀区', '海珠区'], '深圳': ['罗湖', '南山', '福田']}}
嵌套字典
1 av_catalog = { 2 "欧美":{ 3 "www.youporn.com": ["很多免费的,世界最大的","质量一般"], 4 "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"], 5 "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"], 6 "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"] 7 }, 8 "日韩":{ 9 "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"] 10 }, 11 "大陆":{ 12 "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"] 13 } 14 } 15 16 av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来" 17 print(av_catalog["大陆"]["1024"]) 18 #ouput 19 ['全部免费,真好,好人一生平安', '服务器在国外,慢,可以用爬虫爬下来']
1 #values 2 >>> info.values() 3 dict_values(['LongZe Luola', 'XiaoZe Maliya']) 4 5 #keys 6 >>> info.keys() 7 dict_keys(['stu1102', 'stu1103']) 8 9 10 #setdefault 11 >>> info.setdefault("stu1106","Alex") 12 'Alex' 13 >>> info 14 {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} 15 >>> info.setdefault("stu1102","龙泽萝拉") 16 'LongZe Luola' 17 >>> info 18 {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} 19 20 21 #update 22 >>> info 23 {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} 24 >>> b = {1:2,3:4, "stu1102":"龙泽萝拉"} 25 >>> info.update(b) 26 >>> info 27 {'stu1102': '龙泽萝拉', 1: 2, 3: 4, 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} 28 29 #items 30 info.items() 31 dict_items([('stu1102', '龙泽萝拉'), (1, 2), (3, 4), ('stu1103', 'XiaoZe Maliya'), ('stu1106', 'Alex')]) 32 33 34 #通过一个列表生成默认dict,有个没办法解释的坑,少用吧这个 35 >>> dict.fromkeys([1,2,3],'testd') 36 {1: 'testd', 2: 'testd', 3: 'testd'}
dict循环
1 #方法1 2 for key in info: 3 print(key,info[key]) 4 5 #方法2 6 for k,v in info.items(): #会先把dict转成list,数据里大时莫用 7 print(k,v)
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合:
#创建方式 >>> s = set([1, 2, 3]) >>> s {1, 2, 3}
综合练习
Python统计列表中的重复项出现的次数
# 方法一: 使用set
mylist = [1,2,2,2,2,3,3,3,4,4,4,4] myset = set(mylist) #myset是另外一个列表,里面的内容是mylist里面的无重复 项 for item in myset: print("the %d has found %d" %(item,mylist.count(item)))
1 List=[1,2,2,2,2,3,3,3,4,4,4,4] 2 a = {} 3 for i in List: 4 if List.count(i)>1: 5 a[i] = List.count(i) 6 print (a)
1 >>> from collections import Counter 2 >>> Counter([1,2,2,2,2,3,3,3,4,4,4,4]) 3 Counter({1: 5, 2: 3, 3: 2})
1 l=[1,4,2,4,2,2,5,2,6,3,3,6,3,6,6,3,3,3,7,8,9,8,7,0,7,1,2,4,7,8,9] 2 3 count_times = [] 4 for i in l : 5 count_times.append(l.count(i)) 6 7 m = max(count_times) 8 n = l.index(m) 9 10 print (l[n])
Python对文件的操作
对文件操作流程
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文
- 件进行操作
- 关闭文件
基本操作
python中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。
>>> import os >>> os.getcwd() #获取当前Python工作目录 'C:\\python' >>> os.listdir('C:/') #返回指定目录下的所有文件和目录名 ['$GetCurrent', '$Recycle.Bin', 'Boot', 'bootmgr', 'BOOTSECT.BAK', 'dbbtest.txt', 'Documents and Settings', 'PerfLogs', 'Program Files', 'Program Files (x86)', 'ProgramData', 'python', 'Python27', 'Recovery', 'System Volume Information', 'TDDownload', 'unintall.log', 'Users', 'Windows'] >>> os.remove('C:/dbbtest.txt') #删除指定文件 >>> os.removedirs(r'C:/test') #删除指定目录 >>> os.path.isfile("c:/unintall.log") #判断是否是个文件 True >>> os.path.isdir("c:/unintall.log") #判断是否是个目录 False >>> os.path.exits("C:/") #判断路径是否存在 True >>> os.system("ipconfig") #运行shell 命令 0 >>> os.path.splitext("c:/unintall.log") #分离扩展名 ('c:/unintall', '.log') >>> os.path.basename("c:/unintall.log") #获取文件名 'unintall.log' >>> os.rename("C:/unintall.log",'c:/unintall_new.log.') #文件重命名 >>> os.mkdir("c:/dbbtest") #创建目录 >>> os.path.getsize("c:/unintall_new.log") #获取文件大小 1690
文件操作
#创建文件 fp = open("test.txt",'w') #直接打开一个文件,如果文件不存在则创建文件
打开模式有以下几种:
- r ,只读模式【默认】
- w,只写模式【不可读;不存在则创建;存在则清空内容;】
- x, 只写模式【不可读;不存在则创建,存在则报错】
- a, 追加模式【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
- r+, 读写【可读,可写】
- w+,写读【可读,可写】
- x+ ,写读【可读,可写】
- a+, 写读【可读,可写】
"b"表示以字节的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型
操作实例之读写文件
1 #代码示例 2 with open('read.txt','r+') as f : 3 f.write('name dbb\n') 4 f.write('user 123456\n') 5 f.write('age 18\n') 6 7 ##默认read将文件一次性读到内存,放在一个字符串变量中,生成的内容是一个字符串类型 8 9 a=f.read() 10 print("a read is :\n",a) 11 print (type(a)) 12 结果: 13 name dbb 14 user 123456 15 age 18 16 <class 'str'> 17 18 #readline()每只读取文件的一行,通常也是读取到的一行内容放到一个字符串变量中,返回str类型 19 20 b=f.readline() 21 print ("b readline is :\n",b) 22 print (type(b)) 23 结果: 24 b readline is : 25 name dbb 26 <class 'str'> 27 28 #.readlines()每次按行读取整个文件内容,将读取到的内容放到一个列表中,返回list类型,一般配合for循环 29 c=f.readlines() 30 print('c readlines is :\n',c) 31 print(type(c)) 32 结果: 33 a readlines is : 34 ['name dbb\n', 'user 123456\n', 'age 18'] 35 <class 'list'>
1 with open('test.txt','r+') as f: 2 # 如果打开模式无b,则read,按照字符读取 3 # 有b 则会将字符根据编码拆解成字节 4 data = f.read(1) 5 print (f.tell()) #tell获取当前指针所在的位置(按字节) 6 f.seek(f.tell()) #跳转到当前指针的位置(按字节) 7 f.write('derby') #当前指针开始向后覆盖(有b 写字节,无b 写字符) 8
1 class TextIOWrapper(_TextIOBase): 2 """ 3 Character and line based layer over a BufferedIOBase object, buffer. 4 5 encoding gives the name of the encoding that the stream will be 6 decoded or encoded with. It defaults to locale.getpreferredencoding(False). 7 8 errors determines the strictness of encoding and decoding (see 9 help(codecs.Codec) or the documentation for codecs.register) and 10 defaults to "strict". 11 12 newline controls how line endings are handled. It can be None, '', 13 '\n', '\r', and '\r\n'. It works as follows: 14 15 * On input, if newline is None, universal newlines mode is 16 enabled. Lines in the input can end in '\n', '\r', or '\r\n', and 17 these are translated into '\n' before being returned to the 18 caller. If it is '', universal newline mode is enabled, but line 19 endings are returned to the caller untranslated. If it has any of 20 the other legal values, input lines are only terminated by the given 21 string, and the line ending is returned to the caller untranslated. 22 23 * On output, if newline is None, any '\n' characters written are 24 translated to the system default line separator, os.linesep. If 25 newline is '' or '\n', no translation takes place. If newline is any 26 of the other legal values, any '\n' characters written are translated 27 to the given string. 28 29 If line_buffering is True, a call to flush is implied when a call to 30 write contains a newline character. 31 """ 32 def close(self, *args, **kwargs): # real signature unknown 33 关闭文件 34 pass 35 36 def fileno(self, *args, **kwargs): # real signature unknown 37 文件描述符 38 pass 39 40 def flush(self, *args, **kwargs): # real signature unknown 41 刷新文件内部缓冲区 42 pass 43 44 def isatty(self, *args, **kwargs): # real signature unknown 45 判断文件是否是同意tty设备 46 pass 47 48 def read(self, *args, **kwargs): # real signature unknown 49 读取指定字节数据 50 pass 51 52 def readable(self, *args, **kwargs): # real signature unknown 53 是否可读 54 pass 55 56 def readline(self, *args, **kwargs): # real signature unknown 57 仅读取一行数据 58 pass 59 60 def seek(self, *args, **kwargs): # real signature unknown 61 指定文件中指针位置 62 pass 63 64 def seekable(self, *args, **kwargs): # real signature unknown 65 指针是否可操作 66 pass 67 68 def tell(self, *args, **kwargs): # real signature unknown 69 获取指针位置 70 pass 71 72 def truncate(self, *args, **kwargs): # real signature unknown 73 截断数据,仅保留指定之前数据 74 pass 75 76 def writable(self, *args, **kwargs): # real signature unknown 77 是否可写 78 pass 79 80 def write(self, *args, **kwargs): # real signature unknown 81 写内容 82 pass 83 84 def __getstate__(self, *args, **kwargs): # real signature unknown 85 pass 86 87 def __init__(self, *args, **kwargs): # real signature unknown 88 pass 89 90 @staticmethod # known case of __new__ 91 def __new__(*args, **kwargs): # real signature unknown 92 """ Create and return a new object. See help(type) for accurate signature. """ 93 pass 94 95 def __next__(self, *args, **kwargs): # real signature unknown 96 """ Implement next(self). """ 97 pass 98 99 def __repr__(self, *args, **kwargs): # real signature unknown 100 """ Return repr(self). """ 101 pass 102 103 buffer = property(lambda self: object(), lambda self, v: None, lambda self: None) # default 104 105 closed = property(lambda self: object(), lambda self, v: None, lambda self: None) # default 106 107 encoding = property(lambda self: object(), lambda self, v: None, lambda self: None) # default 108 109 errors = property(lambda self: object(), lambda self, v: None, lambda self: None) # default 110 111 line_buffering = property(lambda self: object(), lambda self, v: None, lambda self: None) # default 112 113 name = property(lambda self: object(), lambda self, v: None, lambda self: None) # default 114 115 newlines = property(lambda self: object(), lambda self, v: None, lambda self: None) # default 116 117 _CHUNK_SIZE = property(lambda self: object(), lambda self, v: None, lambda self: None) # default 118 119 _finalizing = property(lambda self: object(), lambda self, v: None, lambda self: None) # default 120 121 3.x
文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的
由于文件读写时都有可能产生IOError
,一旦出错,后面的f.close()
就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally
来实现:
1 try: 2 f = open('C:/dbbtest.txt, 'r') 3 print(f.read()) 4 finally: 5 if f: 6 f.close()
但是每次都这么写实在太繁琐,所以,Python引入了
with
语句来自动帮我们调用close()
方法:#写文件 with open('C:/dbb.txt', 'r') as f: print(f.read()) #读文件 with open('c:/dbb.txt', 'w') as f: f.write('Hello, world!')
python read,readline,readlines 区别
1 #read() 每次读取整个文件,它通常将读取到底文件内容放到一个字符串变量中,也就是说 .read() 生成文件内容是一个字符串类型 2 3 with open('test.txt','r+') as f: 4 data = f.read() 5 print (data,type(data)) 6 7 结果: 8 The line of first(1) 9 The line of second(2) 10 The line of third(3) 11 <class 'str'> 12 13 #readline()每只读取文件的一行,通常也是读取到的一行内容放到一个字符串变量中,返回str类型 14 with open('test.txt','r+') as f: 15 data = f.readline() 16 print(data,type(data)) 17 18 结果: 19 The line of first(1) 20 <class 'str'> 21 22 #readlines()每次按行读取整个文件内容,将读取到的内容放到一个列表中,返回list类型 23 24 with open('test.txt','r+') as f: 25 data = f.readlines() 26 print(data,type(data)) 27 28 结果: 29 ['The line of first(1)\n', 'The line of second(2)\n', 'The line of third(3)\n'] <class 'list'>
1 # 2 with open('test.txt','r+') as f: 3 for line in f: 4 print (line) 5 6 结果: 7 The line of first(1) 8 9 The line of second(2) 10 11 The line of third(3)
文件编码和位置调整:
#文件以什么编码存储,就应该以什么编码打开,很多时候乱码就是打开的编码不对 #打开文件如果不加b,折默认都是以字符的方式打开 f = open('testfile','r+',encoding='utf-8') #以utf-8方式自动转化字符串, data = f.read() print (data,type(data)) print(f.tell()) #tell 当前指针所在的位置(字节) #调整到当前指针的位置, #f.seek(f.tell()) f.seek(5) # seek 文件指针,以字节的方式去找位置,并且是以覆盖后文的字节的方式写入,如果找的是中文(三个字节)则乱码 f.write('add something') f.close()
Python 操作多个文件
#python 2.4后的版本支持同时操作2个以上的文件 #将文件1 的前五行 复制到文件2 with open('testfile','r',encoding='utf-8') as f1 , open('file2','w',encoding='utf-8') as f2: count = 0 for line in f1: count += 1 if count < 5: f2.write(line)
else:
break
替换文件1字符串,写入到文件2
with open('testfile','r',encoding='utf-8') as f1 , open('file2','w',encoding='utf-8') as f2: for line in f1: newLine = line.replace('5000','6000') f2.write(newLine)