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、布尔型

    布尔值和布尔代数的表示完全一致,一个布尔值只有TrueFalse两种值,也可以用0和1来表示。

    布尔值可以用andornot运算。

 1)and运算是与运算,只有所有都为Trueand运算结果才是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
and 运算 
 2)or运算是或运算,只要其中有一个为Trueor运算结果就是True
Or 运算
 
 3)not运算是非运算,它是一个单目运算符,把True变成FalseFalse变成True
1 >>> not True
2 False
3 >>> not False
4 True
5 >>> not 1 > 2
6 True
not 运算

 

   布尔值经常用在条件判断中,比如:

1 if age >= 18:
2     print('adult')
3 else:
4     print('teenager')
boolean
 
3、空值

    空值是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)

 

8.set (集合)

     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)
方法二:for循环判断
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对文件的操作

对文件操作流程

  1. 打开文件,得到文件句柄并赋值给一个变量
  2. 通过句柄对文
  3. 件进行操作
  4. 关闭文件 

基本操作 

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'>
Python读文件
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     
python 读写文件
  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
python3.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()
try..finally

 

但是每次都这么写实在太繁琐,所以,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!')
with 读写文件

 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'>
View Code
 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)
python 迭代文件行

 文件编码和位置调整:

#文件以什么编码存储,就应该以什么编码打开,很多时候乱码就是打开的编码不对

#打开文件如果不加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)

  


 

 

posted @ 2016-10-04 21:58  Derby666  阅读(672)  评论(0编辑  收藏  举报