python基本数据结构笔记

笔记

一.基本序列类型

0.声明空变量

li=[]  #声明一个空列表
lis={} #声明一个空字典 因为字典比集合用的多
lst='' #声明一个空字符串
mo=()  #声明一个空元组
me=set() #声明一个空集合

1.列表(list)(可变序列)

增(append、insert、extend)

a=['sdsd','sdddd',321]

append——a.append('sda')
末尾追加——末尾 增加sda
insert
指定追加——a.insert(0,'sda')
extend
打散型末尾追加,用法同append,将所有内容打散(内容不能是单个数字)
删(pop、remove、clear、del)
pop:下标指定删除
​
remove:选择一个元素进行删除,默认从左开始,只删一个
​
clear:清空列表所有数据(结果返回空列表)
​
del:可以进行下标删除
也可以del 列表名,直接删除列表
改(下标、切片)
单个修改,直接利用下标
​
多个修改:可以通过切片方式实现,但是切多少个数据,右边就要写多少个数据

查(index、count)
index:根据数据,获取数据下标(也可以设置起点值)
语法格式:列表名.index(数据)
        列表名.index(数据,起点值)
count:求和,统计数据出现次数
列表名.count(数据)
列表的排序(sort)
升序
列表名.sort()    升序
列表名.sort(reverse=Ture)    降序

2.元组(tuple)(不可变序列)

查(同列表)

元组 为不可变序列,无法修改

3.字符串(不可变序列)(使用时候先print再输入格式)

增(加号连接)

print('sd'+'dsa')

删(repalce)
repalce:(删除或者替换)
字符串.repalce('替换值','')#删除
字符串.repalce('替换值','新值')#替换
字符串.replace('替换值','新值',修改次数)(从左开始)
​
使用时候要直接print 再加格式
改(大小写,切割,去空格)

upper:字母全大写

lower:字母全小写

title:单词首字母大写

strip:去除字符串左右空格

split:切割字符串

语法格式: 字符名.split('分割对象')

4.集合(set)(无序)

认识

集合的特性:唯一性,无序性 主要是用来进行去重和逻辑判断

增(add)

add:

语法格式: 集合名.add(数据)

因为是无序的,所以随机增加

删(pop、remove)

pop:删除一个数据(根据版本不同有些是从头开始删除或者随机或者从末尾开始删除) 语法格式:集合名.pop()

remove:删除指定数据 语法格式:集合名.remove(数据)

ps:选择性删除

5.字典(dict)(无序)

键值对

增(setdefault、update)
setdefault
语法格式: 字典名.setdefault(键,值)
    一次只能增加一个键值对
    键存在时,不会对其进行修改
    当没有写值的时候,会默认为None
update
语法格式: 字典名.update({键:值,键:值})
    可以多次增加或者修改
删(pop、popitem、clear)
pop: 通过键名删除指定的数据#键名删除
    语法格式: 字典名.pop(键名)
popitem:根据版本不同随机删除键值对#删一对
    语法格式: 字典名.popitem()
clear:全部清除
    语法格式: 字典名.clear()
改(通过键名去修改)
查(key、value、items)
key:通过key可以寻找值
语法格式: 字典名[key]
    
get通过键(key)获取值
语法格式: 字典名.get(key)
字典名.keys() # 获取字典中所有的键
字典名.values() # 获取字典中所有的值
字典名.items() # 获取字典中所有的键值对(键值对是以元组的形式输出)

defaultdict

dict.setdefault()方法:有两个参数,第一个是参数,第二个是默认值。

 

二.格式化输出

1.f-str输出(format string)

print(f'dsada{dsds}dsd')

2.占位符

print('我最喜欢的美食是%s,需要%d元'(数据1,数据2))

3.format

print('xxx{}xxx{}'.fomat(数据1,数据2))

4.保留小数

>>> x = 3.1415926
>>> print("%.2f" % x)
3.14

例子:

a,b = input().split(',')
print("{:.2f} {:.2f}".format(abs(eval(a)),abs(eval(b))))

三.绝对路径和相对路径

绝对路径: 完整的具体位置

相对路径: 简单位置,有一个参考的坐标(如果在同一个文件里就可以使用)

四.字符编码

utf-8(内容最多最主流)

Unicode(超过14w字符)

ASCII

查找ASCII(ord)

查找字符(chr)

五.流程控制

1.if类

if 表达式:
	代码块 
    
if  表达式:
	代码块
else:
	代码块 

if-elif

if  表达式:
	代码块
elif 表达式:
	代码块 
else:
	代码块 

2.缩进

tab(四个空格)
缩进会调整代码之间的作用域的关系

3.循环结构

1)while循环
语法格式:
    while 循环条件:
        执行语句 #当满足循环条件就执行 否则不执行
		循环条件的更新
    while 1: #最简单的死循环
        执行语句
2)for循环
语法格式:
    for 变量名 in 可迭代对象(字符串 列表 元组 字典 集合):
        执行语句
        

语法格式2:
    for 变量名 in range(数值):
        执行语句
range(起点值,终点值)

4.嵌套

1)分支嵌套
if 表达式:
	代码块 
    if 表达式:
    	代码块
        
    else:
    	代码块
else:
	代码块
2)循环嵌套
1>for循环嵌套

例如

打印99乘法表

for i in range(1,10):
    for j in range(1,10):
        print(f'i*j={i*j}',end='\t') # 每个式子后面增加间距
    print('') # 满十个换行

斜三角99乘法表

for i in range(1,10):
    for j in range(1,i+1):
        print(f'i*j={i*j}',end='\t') # 每个式子后面增加间距
    print('') # 满十个换行
2>while循环嵌套

例如:登录操作

while count<3:
 
    name=input("请输入用户名")
 
    password=input("请输入密码")
 
    if name=="huxiaohui" and password=="123456":
 
        print("你答对啦")
 
        break
 
    else:
 
        print("错啦 再来一次")

5.break、continue、pass

break--->结束循环

但是你跑了十圈体力不支就偷懒了选择摆烂 -- break 结束循环
for i in range(1,101):
    print(f'我跑了第{i}圈')
    if i == 10: # 在我满足第十圈的时候就结束执行
        print('我不跑了')
        break

continue--->跳过这一圈继续运行

抄书 但是不精 找到一些页面我就跳过不写 耍滑头 --> continue 跳过
for i in range(1, 21):
    if i == 10 or i == 15 or i == 20:
        continue
    print(F'这是我抄书的第{i}遍')

pass--->占位符

当我们流程控制里面,有语句没有想好的话,可以使用pass占位 防止一些不必要的报错

六.函数

1.函数的定义

def 函数名():
	代码块
    代码块
函数名()#最后用带括号函数名来调用函数

2.函数的参数

1)必备参数

参数分为:

形参:没有具体数据 -- 定义时候

实参:有具体数据 -- 调用时候

def woman(name):
    print(f'{name}恭喜入选')
woman('罗志祥')# 实参会把值反代入进形参,再进入到函数去
2)默认参数
形参在定义的时候可以直接对形参赋值
def food (food1,food2='烤鸡'):
    print(f'今晚表现很好奖励自己一个{food1}顺便打包{food2}回家')
food('炸鸡')
food('炸鸡','可乐') #烤鸡被覆盖
# 但是赋值的形参会被新加入的实参覆盖
3)不定长参数(*args、**kwargs)

*args:长度不限 可以一次性接受多个参数

ps:该参数接收到多余的参数值之后 会将值保存到元组中

def 函数名(*args):
            代码
        调用时
        函数名(值1,值2....)

**kwargs:一次性可以接收多个数据 但是接收的数据类型是为键值对 得到的参数变量为字典类型的数据

ps:该参数将多余的参数值以字典的方式保存 其中参数名作为字典的键(key) ,参数值作为字典里的值(value)

 def 函数名(**kwargs):
        调用时
        函数名(参数名=值,参数名1=值1)

3.返回值(return)

return:将定义的函数的值返回给调用的变量

def 函数名:
     代码
     return 返回值
print(函数名()) #得到函数返回值

七.函数作用域和名称空间

1.函数功能(*重点:闭包函数)

1.把函数赋值给变量

def fun_1():
    return '婷婷是个靓女'

b=fun_1() #把函数fun_1的返回值赋值给了变量b
a(b)
print(b)

2.函数可以作为元素放在列表、元组、字典、集合中使用

def fun_3(a, b):
    return a + b
ll1 = (66, 88, 99, fun_3, 77)
print(ll1[3](5, 6))

3.函数可以作为参数被传递给另一个函数

def name():
    my_name = '婷婷'
    return my_name

def name1(a):
    print(f'我是个靓女{a}')
name1(name())

4.函数可以作为返回值(闭包函数)

def boss(a, b): #老板收到两个任务(参数)
    def boss1(c, d): # 我在任务加了两个创意(参数)
        return c + d # 做好东西

    return boss1(a, b) # 老板拿做好的东西 邀功


print(boss(66, 88)) # 成果是老板的 跟我没半毛钱关系

2.名称空间

名称空间: 就是存放名字的地方 即存放变量名,函数名

名称空间 -- 存储变量名 函数名 模块名

内存数据 -- 变量值 函数代码 模块里的代码

一共有三层结构

1.内建名称空间(存放内置函数)
	生命周期:随着python程序启动而生成,在程序关闭时回收,清除所有的数据
    加载顺序:最先被加载出来的
    存放对象:内置函数 print input type len sum
        
2.全局名称空间(python定义在外层的名字)
	生命周期:随着python文件执行之前产生,运行完后销毁
    加载顺序:第二个被加载出来的
    存放对象:在python外层写的代码,定义的变量名 函数名
        
3.局部名称空间(存在函数内定义的名字)
	生命周期:随着函数的调用而生成, 在结束调用时销毁
    加载顺序:在调用时才会被加载
    存放对象:在函数里定义的变量名,函数名,形参

3.作用域

作用域: 一个数据能够使用的范围

作用域分为:全局作用域 局部作用域

1)global(提权)

提权:让一个数据从局部变成全局,大家都可以用

def 函数名():
            global 变量名
            操作变量
        函数名()
        print(变量)
2)nonlocal(降权)

降权: 将局部变量再度局部化

a=888
def fun1():
    a=1 #这个里a 在函数里是公共的 函数里都可以使用
    def fun2():
        nonlocal a
        a=0 #把变量a  进行修改 霸道的抢过来 私有化
    fun2()
    print(a)
fun1()
## 结果为0

4.匿名函数(lambda)

语法格式: lambda 变量:操作

因为他匿名,所以他单独使用的时候是需要给他赋上一个名字的。

lambda 参数列表:运算表达式
f = lambda x:x*x
print(f(5))

5.高阶内置函数

print(abs(-1))  # 绝对值
print(sum([1, 2, 3, 4]))  # 求和
print(round(4.3))  # 四舍五入
任意两个数字,对这2个数字求绝对值后进行求和
def ab_sum(a,b,f):
    return f(a) + f(b)
res = ab_sum(-1,-4,abs)
res1 = ab_sum(1.1,-4.8,round)
print(res)

6.map()

语法: map(func,seq)第一个参数是给一个函数第二个参数是给一个序列类型 map可以直接操作序列中每个元素 map可以改变序列中所有的元素,改变规则由我们传入的函数决定

例如:
list1 = [1,2,3,4,5]
def add1(x): # x就代表列表中的每个元素
    return x+1

print(list(map(add1,list1)))

# [2, 3, 4, 5, 6]

7.filter()

语法: filter(func,seq)第一个是给一个函数第二个给一个序列类型 用于过滤序列,过滤掉不符合条件的元素

list1 = [1,2,3,4,5,6,7,8,9,10]
def o2s(x):
    return x%2==0
print(list(filter(o2s,list1)))

#  结果保留偶数

8.*递归函数

一个函数内部调用了自己,那么就叫做递归函数

# 打印1-500
def func(x):
    if x ==501:
        return 
    print(x)
    return func(x+1)  # f(1) = f(2) = f(3)...f(501 结束)
func(1)

9.生成器(生成器名 = (x for x in range(数字)))


r = (x for x in range(1,6))
print(next(r))
print(next(r))
print(next(r))
print(next(r))
print(next(r))
print(next(r))  # 报错

next数量不可以超过总共生成的量
生成器的创建方式:
1.(i for i in range(1,10))
2.yield 关键字
def f():
    print('hello world')
    yield 1

g = f()
print(next(g))  
hello world
1

迭代是遍历的方法

遍历是迭代的目的

从现象来看,只要是可以for循环的都是可迭代对象

从本质来看,是内置有iter方法的是可迭代对象

记住本质:能循环是因为内部有一个iter方法

可迭代对象:拥有iter方法的

yield 和 return的区别:
return:在函数中给返回某个值,然后函数结束运行,一般没有返回值类型,就不用写return
yield:带 yield 的函数是一个生成器,在函数内部碰到 yield 的时候,函数会返回某个值,并且停留在这个位置,当下次执行函数后,会在上次停留的位置继续运行

10.迭代器

生成器都是迭代器

iterable --可迭代对象

什么是迭代器:
1.有iter方法
2.有next方法
l = [1,2,3,4]
d = iter(l)
print(next(d))
print(next(d))
print(next(d))
print(next(d))
for循环内部本质就是3个事情:
1.调用可迭代对象的iter方法返回一个迭代器
2.不断地调用迭代器的next方法
3.处理异常

小结

迭代:每一次对过程的重复称为一次迭代,而每一次迭代得到的结果会作为下一次迭代的初始值
可迭代对象:从语法形式上讲,内置有iter方法的对象都是可迭代对象
调用 iter方法返回的结果就是一个迭代器对象
迭代器对象是内置有iter和next方法的对象

11.装饰器

在不修改源代码的基础上给函数增加新的功能

@ 语法糖

def show_time(func):  # 这个函数的功能就是帮忙计算时间的
    def inner(*args,**kwargs):
        start = time.time()
        func(*args,**kwargs)  # print('foo..')
        time.sleep(1)  # sleep()可以休眠程序,括号里面时休眠几秒
        end = time.time()
        print(f'运行了{end - start}秒')
    return inner
@ show_time
def add(*args,**kwargs):
    sum1 = 0
    for i in args:
        sum1+=i
    print(sum1)
add(1,2,3,4,5)

八.模块

模块使用分两步:
    1.导入模块
    import 模块名
    2.使用模块
    print(模块名.变量名) # 调用模块里的变量
    模块名.函数名() #调用模块里的函数
    
如果模块名过长可以通过as关键字 给他取小名
	import win32process as pro
    
当你只需要导入模块里的当个变量/函数时, 可以单独导入
	from 模块名 import 函数名
    from 模块名 import 变量名
    
模块分为三类:
    内置模块 -- python 自带的工具
    第三方模块 -- 别人写好的需要另外下载的工具
    自定义模块 -- 用户自己写的工具
    
下载第三方模块 -->
	cmd中输入 pip install 模块名
    
Python文件分为两种情况:
    1.该文件是以模块身份运行,模块是作为工具,他的内置变量__name__的值为模块名
    2.该文件是以程序的身份执行作为启动程序,他的内置变量__name__的值为__main__
    
如果需要测试/调试文件,可以写上main判断 把一些测试代码放在main判断中(
Python的main跟其他语言的面不一样)
	if __name__ == '__main__':
        代码

包:一个文件夹,里面有对应的功能模块,里面有个名为__init__.py文件
   
__init__.py:随着包的创建自动生成,当导入包里的模块时,会运行__init__的代码,所以可以把一些配置信息,使用说明放在此文件中
    
跨文件夹导入模块
from 文件夹 import 模块名

1.常用模块***

1)time
tm_year=2022,代表当前年份
tm_mon=12,代表当前月份
tm_mday=9,代表当前日期
tm_hour=20,当前小时
tm_min=20,当前分钟
tm_sec=27,当前秒数
tm_wday=4,代表当前的星期(范围从0-6)
tm_yday=343,代表今年的第几天
tm_isdst=0,冬令时 夏令时 
2)random
a = random.random()
——# 生成一个大于0并且小于1 随机数
b=random.randint(1,10)
——# 获取指定范围之间的随机整数
c=random.uniform(10,2.2)
——# 获取指定范围之间的随机小数
ll=(2,3,5,6,7,89,7)
d=random.choice(ll)
——# 在列表内随机抽取 列表元组
ll1=[2,3,5,6,7,89,7]
random .shuffle(ll1)
——# 打乱列表顺便 洗牌 列表可变
3)os

主要是运行在操作系统上的相关信息(文件)

1.os.system 运行cmd命令  关机 打开计算器 画图工具
# os.system('start cmd') 打开cmd
# os.system('start calc') 打开计算器
# os.system('start osk') 打开屏幕键盘

2.获取当前文件所在路径目录
# print(os.getcwd())

3.在当前路径新建文件夹 已经存在再次创建就会报错
# print(os.mkdir('text'))

4.删除文件夹 只能删除空白的文件夹
# print(os.rmdir('text'))

5.对文件进行重命名
# print(os.rename('demo1.py','demo2.py'))

6.判断当前路径文件是否存在
# print(os.path.exists('demo.py'))

...
# 将散列部分组成一个完整的路径
# 别人给你几个路径或者文件名字
print(os.path.join('Python_78', 'day9', 'os模块.py'))
# 组成路径 并不是真实的路径后期你们可以组成自己真实的路径 只是说可以组成路径
# 这里的斜划线都是一样
# 对路径去掉文件名
print(os.path.dirname('Python_78\day9\os模块.py'))

# 对原有的路径进行重新组成
print(os.path.join(os.path.dirname('Python_78\day9\os模块.py'), 'os22.py'))

# 去掉路径获得文件名
print(os.path.basename('Python_78\day9\os模块.py'))
4)json

    • json模块

    • json是一种文件的存储格式 主要作用就是保留原来类型的情况下,保存数据

    • 一个数据json保存可以确保 存之前是列表 取出来还是列表

    • json就是一种让你的文件可以保留原来类型的文件格式类型

json模块提供了四个功能
# 序列化
dumps: 把数据类型转换为字符串
--无文件关联时候
dump: 把数据类型转换为字符串并且存储到文件中
--有文件关联时候
# 反序列化
loads: 把字符串转变成数据类型
load: 把文件打开从字符串转变为数据类型
5)re(*正则表达式)

正则表达式:检查字符串是否包含指定字符,获得从字符中提取某个字符内容比较多 爬虫用的多

  • 元字符

    '.':匹配任意一个字符 \n是个例外 '+':匹配前一个元字符多次 '\W':匹配非字母数据以及下划线 '\w':匹配字母数据以及下划线

  • 方法

    match() 从头开始匹配 group() 只获取匹配到的字符 findall(): 查询所有满足条件的 split():根据指定字符进行切割 sub():替换指定字符

示例:
# res_1='婷婷是\t个超级无敌大美女'
# msg_1=re.match('.',res_1)
# print(msg_1) #并没有很直观的输出一个字符 对象 位置 字符
# print(msg_1.group())
# msg_2=re.match('.........................',res_1) #超过就报错 因为没有那么多
# print(msg_2.group())
# msg3=re.match('.+',res_1) #几乎是整个字符串 匹配出来
# print(msg3.group())
# msg4=re.match('......',res_1)
# print(msg4.group())

# res2='IN 2022 ,& tt_tt1'
# print(re.findall('\w',res2))
# print(re.findall('\W',res2))

正则表达式补充

context = '<title>asjokdaono</title>'
import re

print(re.match(r'<(\w+)>([\w\W]*)</(\w+)>', '<title>asjokdaono</title>').group(1))

\1  代表第一个分组的内容
\2  代表第二个分组的内容
?P<别名> 
print(re.match(r'<(?P<tag>\w+)>([\w\W]*)</(?P=tag)>', '<title>asjokdaono</title>').group())

  • hashlib**

哈希模块
哈希是一种规则可以接收一个数据来生成一个哈希数据 作用用来数据加密

就像算命一样 你给算命先生说过的事 他会给你一些回复

特点: 
    传入的内容是一样的 hash值也是一样的
    你和别人算命 如果说的东西一样 返回的结果也是一样
    
    hash值正常情况下 破解难度比较大
    算命过程比较玄学 难以破解
    
    不管传的数据/文件多大多长 最后得到的哈希值长度都是为32位
    不管你跟算命先生说了多少 他就只回你32个字
    
    说白了就是我给你个数据你返回我一个基于这个数据生成的32位的哈希数据(看不出规律的32位字符)

	WiFi破解-->笨蛋方法 找一个密码字典(记录了很多常用的密码本)
    拿里面的密码一个个尝试 --> 密码简单 常见
    带了符号 中文 --> 破解不了


加盐
相当于密码123456 你可能误打误撞就蒙对了
我觉得这个密码有风险我现在给他加了东西 123456+'螺丝粉'
生成哈希值是基于123456螺蛳粉 生成的 而不是123456
如果单纯123456来破解 是破解不了

主要是在后续我们开发网站的时候 后台处理数据的时候会用到

2.模块的下载

pip -- python自带的下载器
install -- 下载
uninstall -- 卸载

pip 没有设置python的环境变量的话,那么这个配置就找不到 所以下载python的时候要记得配置环境变量
python默认下载库就是使用pip 如果python环境没有设置好,pip就使用不了-->修复/重装

#下载模块
pip install 模块名
pip install pywin32
#pycharm下载模块(首先选择cmd下载 其次在是pycharm)
file -- settings -- projoct -- + -- install
(有时候pycharm下载是在虚拟环境中,不会在电脑python环境里,当你重新创建项目的话可能访问不到)
在cmd里下载就是全部下载到自己的python环境里面 这样不管如何创建项目都能访问到

#卸载模块
pip uninstall 模块名

#查看模块
pip list

#更新pip 有时候pip的版本太低 新的库升级不了
python -m pip install --upgrade pip -i

#通过(cdn)代理加速,下载第三方模块:
pip install 库名 --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple 
       
pip install requests --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple 

3.模块的使用

第一种:
import 模块名
将某模块的整体导入到当前模块中

第二种:
from 模块名 import 成员名
将指定的成员导入到当前模块作用域中

第三种:
from 模块名 import *
将指定模块的所有成员导入到当前模块作用域中

注意:导入进来的成员不要与当前模块成员名称相同
如果相同会遵循就近原则


as 取别名
from module01 import f as f1
from module02 import f as f2
from module03 import f as f3
  • 隐藏成员

    • 模块中以_开头的属性,不会被导入

      隐藏成员只对 * 有作用

九.文件操作

操作文件步骤:

1.打开文件

2.对文件进行操作(读,写),保存

3.关闭文件

1.打开

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

绝对路径:ctrl+shift+c
绝对路径通常是指从盘符开始的完整路径
相对路径通常使用“.”或者“..”开头
“./”表示当前文件所在的目录,可以省略不写
“../”表示当前目录的上一级目录
“../../”表示上上级目录
“/”开头代表根目录

在python中一般表示路径可以使用两个\\  或者 /
最好的办法是在路径前面写一个r  r的作用可以规避反斜杠
例:
fileName = r'../day14/demo.txt'
demo = open(fileName)
print(demo)

2.关闭

close()

fileName = r'../day14/demo.txt'
demo = open(fileName)
content = demo.read()
print(content)
print(type(content))  # <class 'str'>
demo.close()

读取之后自动关闭

with open...as 语句
fileName = r'../day14/demo.txt'
with open(fileName) as f:
    print(f.read())  # 可以读取出来
print(f.read())  # 文件已经自动关闭,报错

3.读取

open打开文件默认以文本文件的形式打开

fileName = 'demo2.txt'
with open(fileName,encoding='utf-8') as f:
    content = f.read()
    print(content)
你好
世界
保存
关闭

read()读取全部
read(参数) 参数为要指定读取的字符的数量

读取文件方式1

# 读取大文件的方式
with open(fileName,encoding='utf-8')as f:
    # 定义变量,指定每次读取的大小
    c = 2
    # 创建循环读取文件内容
    while 1:
        # 读取指定大小的内容
        content = f.read(c)
        # 检测内容是否为空
        if content == '':
            # 读取完毕,退出循环
            break
        # 输出读取出来的内容
        print(content,end='')

读取文件方式2

# 读取大文件的方式
with open(fileName,encoding='utf-8')as f:
    all_content = ''
    # 定义变量,指定每次读取的大小
    c = 2
    # 创建循环读取文件内容
    while 1:
        # 读取指定大小的内容
        content = f.read(c)
        # 检测内容是否为空
        if content == '':
            # 读取完毕,退出循环
            break
        # 输出读取出来的内容
        all_content+=content
print(all_content)

只读一行

readline()  读取一行内容
with open(fileName,encoding='utf-8')as f:
    print(f.readline(),end='')
    print(f.readline(),end='')
    print(f.readline(),end='')
    print(f.readline())
    
readlines()  一行一行的读取内容,一次性读完存到列表里面
with open(fileName,encoding='utf-8')as f:
    print(f.readlines())
#结果为:['你好\n', '世界\n', '保存\n', '关闭']

with open(fileName,encoding='utf-8')as f:
    l = f.readlines()
    print(l[1:3]) # ['世界\n', '保存\n']

4.写入***

write()  # 括号里面的值必须是字符串类型
write也有返回值,返回值就是你写入的字符串的长度
r:只读
w:可写,会覆盖文件,如果文件不存在时,会创建文件
a:追加,如果文件不存在时,会创建文件

fileName = 'demo3.txt'
with open(fileName,'w',encoding='utf-8')as f:
    a = f.write('python')
    print(a)

fileName = 'demo3.txt'
with open(fileName,'a',encoding='utf-8')as f:
    f.write('你好世界')
    f.write('你好世界')

5.二进制文件

t 读取文本文件
b 读取二进制文件
fileName = r'C:\Users\EDY\Desktop\陈奕迅 - 不要说话.mp3'
with open(fileName,'rb')as f:
    # 新的文件名
    new_path = 'qq.mp3'
    with open(new_path,'wb')as new_f:
        # 每次读取的大小
        c =1024
        # 循环读取写入
        while 1:
            # 从旧的对象中读取数据
            content = f.read(c)
            # 读取的这个数据还有就继续读,没有就break退出
            if not content:
                break
            # 将读取出来的数据写入到新的对象文件中
            new_f.write(content)
            
fileName = r'C:\Users\EDY\Desktop\陈奕迅 - 不要说话.mp3'
with open(fileName,'rb')as f:
    # 新的文件名
    new_path = 'qq.mp3'
    with open(new_path,'ab')as new_f:
        # 每次读取的大小
        c =1024
        # 循环读取写入
        while 1:
            # 从旧的对象中读取数据
            content = f.read(c)
            # 读取的这个数据还有就继续读,没有就break退出
            if not content:
                break
            # 将读取出来的数据写入到新的对象文件中
            new_f.write(content)

***写入的文字规范

打开模式效果
r以读方式打开,文件必须存在
w以写方式打开,文件不存在则创建,存在清空原有内容
a以追加模式打开,文件不存在则创建,存在则继续进行写操作
r+以读写模式打开 文件必须存在
w+以读写模式打开文件,不存在则创建,存在清空原有内容
a+追加并可读模式,文件不存在则创建,存在则继续进行写操作
rb以二进制读模式打开 同r
wb以二进制写模式打开 同w
ab以二进制追加模式打开 同a
rb+以二进制读写模式打开 同r+
wb+以二进制读写模式打开 同w+
ab+以二进制读写模式打开 同a+

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值