黑马程序员python(四)——公共操作 - 推导式 - 文件

视频见:https://www.bilibili.com/video/av54728208
python书写格式官方参考:https://www.python.org/dev/peps/pep-0008/

1 公共操作

1.1 运算符

运算符 描述 支持的容器类型
+ 合并 字符串、列表、元组
* 复制 字符串、列表、元组
in 元素是否存在 字符串、列表、元组、字典
not in 元素是否不存在 字符串、列表、元组、字典

1.1.1 +

# 1. 字符串 
str1 = 'aa'
str2 = 'bb'
str3 = str1 + str2
print(str3)  		# aabb,无引号


# 2. 列表 
list1 = [1, 2]
list2 = [10, 20]
list3 = list1 + list2
print(list3)  # [1, 2, 10, 20]

# 3. 元组 
t1 = (1, 2)
t2 = (10, 20)
t3 = t1 + t2
print(t3)  # (10, 20, 100, 200)

1.1.2 *

# 1. 字符串
print('-' * 10)  	# ----------

# 2. 列表
list1 = ['hello']
print(list1 * 4)  	# ['hello', 'hello', 'hello', 'hello']

# 3. 元组
t1 = ('world',)
print(t1 * 4) 		# ('world', 'world', 'world', 'world')

t2 = (3)
print(t2 * 4)		# 12

1.1.3 innot in

# 1. 字符串
print('a' in 'abcd')  # True
print('a' not in 'abcd')  # False

# 2. 列表
list1 = ['a', 'b', 'c', 'd']
print('a' in list1)  # True
print('a' not in list1)  # False

# 3. 元组
t1 = ('a', 'b', 'c', 'd')
print('aa' in t1)  # False
print('aa' not in t1)  # True

# 4. 字典
dict1 = {'name':'Python', 'age':30}
print('name' in dict1)			# True
print('name' in dict1.keys())		# True
print(30 in dict1.values())		# True
print(('name','Python') in dict1.items())	# True

1.2 公共方法

函数 描述
len() 计算容器中元素个数
del 目标或 del() 删除
max() 返回容器中元素最大值
min() 返回容器中元素最小值
range(start,end, step) 生成从start到end的数字,不包括end,步长为step,供for循环使用
enumerate() 函数用于将一个可遍历的数据对象 (如列表、元组或字符串 )组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

1.2.1 len()

# 1. 字符串
str1 = 'abcdefg'
print(len(str1))  # 7

# 2. 列表
list1 = [10, 20, 30, 40]
print(len(list1))  # 4

# 3. 元组
t1 = (10, 20, 30, 40, 50)
print(len(t1))  # 5

# 4. 集合
s1 = {10, 20, 30}
print(len(s1))  # 3

# 5. 字典
dict1 = {'name': 'Rose', 'age': 18}
print(len(dict1))  # 2

1.2.2 del()del 目标

# 1. 字符串
str1 = 'abcdefg'
del str1
print(str1)	# 报错:NameError: name 'str1' is not defined

# 2. 列表
list1 = [10, 20, 30, 40]
del(list1[0])
print(list1)  # [20, 30, 40]

1.2.3 max()

# 1. 字符串
str1 = 'abcdefg'
print(max(str1))  # g

# 2. 列表
list1 = [10, 20, 30, 40]
print(max(list1))  # 40

1.2.4 min()

# 1. 字符串
str1 = 'abcdefg'
print(min(str1))  # a

# 2. 列表
list1 = [10, 20, 30, 40]
print(min(list1))  # 10

1.2.5 range()

# range(1, 10),返回一个可迭代对象
print(range(1, 10))

# 1 2 3 4 5 6 7 8 9
for i in range(1, 10, 1):
   print(i)

# 1 3 5 7 9
for i in range(1, 10, 2):
   print(i)

# 0 1 2 3 4 5 6 7 8 9
for i in range(10):
   print(i)

注意: range()生成的序列不包含 end数字,start可以省略,默认为 0,step也可以省略,默认为 1。

1.2.6 enumerate()

语法:enumerate(可遍历对象, start=0)

注意:start参数用来设置遍历数据的下标的起始值,可以省略,默认为 0。

示例:

list1 = ['a', 'b', 'c', 'd', 'e']

for i in enumerate(list1):
   print(i)

for index, char in enumerate(list1, start=1):
   print(f'下标是{index}, 对应的字符是{char}')

在这里插入图片描述

enumerate返回结果是元组,元组第一个数据是原迭代对象的数据对应的下标,元组第二个数据是原迭代对象的数据

1.3 容器类型转换

1.3.1 tuple()

作用:将某个序列转换成元组

list1 = [10, 20, 30, 40, 50, 20]
s1 = {100, 200, 300, 400, 500}
c1 = 'abdfgh'

print(tuple(list1))
print(tuple(s1))
print(list(c1)) 	# ('a', 'b', 'd', 'f', 'g', 'h')

在这里插入图片描述

1.3.2 list()

作用:将某个序列转换成列表

t1 = ('a', 'b', 'c', 'd', 'e')
s1 = {100, 200, 300, 400, 500}
c1 = 'abdfgh'

print(list(t1))
print(list(s1))
print(list(c1))		# ['a', 'b', 'd', 'f', 'g', 'h']

在这里插入图片描述

1.3.3 set()

作用:将某个序列转换成集合

list1 = [10, 20, 30, 40, 50, 20]
t1 = ('a', 'b', 'c', 'd', 'e')
c1 = 'abdfgh'

print(set(list1))
print(set(t1))
print(list(c1)) 	# {'g', 'b', 'd', 'a', 'h', 'f'}

在这里插入图片描述

注意:

  1. 集合可以快速完成列表去重
  2. 集合不支持下标

2 推导式(生成式)

仅适用于列表,字典和集合,又称为生成式。

2.1 列表推导式

作用: 用一个表达式创建一个有规律的列表或控制一个有规律列表。

列表推导式又叫列表生成式。

2.1.1 快速体验

需求:创建一个 0-10的列表。

  • while循环实现
# 1. 准备一个空列表
list1 = []

# 2. 书写循环,依次追加数字到空列表 list1中
i = 0
while i < 10:
   list1.append(i)
   i += 1

print(list1)	# [0,1,2,3,4,5,6,7,8,9]
  • for循环实现
list1 = []
for i in range(10):
   list1.append(i)

print(list1) 	# [0,1,2,3,4,5,6,7,8,9]
  • 列表推导式实现:[要返回的值 for i in 序列]
list1 = [i for i in range(10)]
print(list1)	 # [0,1,2,3,4,5,6,7,8,9]

列表推导式从 for 循环开始执行

2.1.2 带 if 的列表推导式

需求:创建0-10的偶数列表

  • 方法一: range()步长实现
list1 = [i for i in range(0, 10, 2)]
print(list1)
  • 方法二: if 实现
list1 = [i for i in range(10) if i % 2 == 0]
print(list1)

2.1.3 多个for循环实现列表推导式

需求:创建列表如下:

[(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

代码如下:

list1 = [(i, j) for i in range(1, 3) for j in range(3)]
print(list1)

2.2 字典推导式

思考: 如果有如下两个列表:

list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']

如何快速合并为一个字典?
答: 字典推导式

字典推导式作用:快速合并列表为字典或提取字典中目标数据。

  1. 创建一个字典:字典 key是1-5数字,value是这个数字的2次方。
dict1 = {i: i**2 for i in range(1, 5)}
print(dict1)  # {1: 1, 2: 4, 3: 9, 4: 16}
  1. 将两个列表合并为一个字典
list1 = ['name', 'age', 'gender']
list2 = ['Tom', 20, 'man']

dict1 = {list1[i]: list2[i] for i in range(len(list1))}
print(dict1)


list3 = ['name', 'age', 'gender']
list4 = ['Tom', 20]

# 结果:IndexError: list index out of range
dict2 = {list1[i]:list2[i] for i in range(len(list3))}
print(dict2)
# 结果:{'name': 'Tom', 'age': 20}
dict3 = {list1[i]:list2[i] for i in range(len(list4))}
print(dict4)

总结:

  1. 如果两个列表数据个数相同,len统计任何一个列表的长度都可以
  2. 如果两个列表数据个数不同,len统计数据多的列表数据个数会报错;len统计数据少的列表数据个数不会报错
  1. 提取字典中目标数据
counts = {'MBP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99}

# 需求:提取上述电脑数量大于等于 200的字典数据
count1 = {key: value for key, value in counts.items() if value >= 200}
print(count1)  # {'MBP': 268, 'DELL': 201}

2.3 集合推导式

需求:创建一个集合,数据为下方列表的 2 次方。

list1 = [1, 1, 2]

代码如下:

ist1 = [1, 1, 2]
set1 = {i ** 2 for i in list1}
print(set1)  # {1, 4}

注意:集合有数据去重功能。

3 文件

3.1 文件操作的作用

思考: 什么是文件?

思考: 文件操作包含什么?
答: 打开、关闭、读、写、复制…

思考: 文件操作的的作用是什么?
答: 读取内容、写入内容、备份内容 …

总结: 文件操作的作用就是把一些内容 (数据)存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。

3.2 文件的基本操作

文件操作步骤

  1. 打开文件
  2. 读写等操作
  3. 关闭文件

注意: 可以只打开和关闭文件,不进行任何读写操作。

3.2.1 打开

在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法如下:open(name, mode)
name:是要打开的目标文件名的字符串 (可以包含文件所在的具体路径 )。
mode:设置打开文件的模式 (访问模式):只读、写入、追加等。

3.2.2 打开文件模式

模式 描述
r 只读方式打开文件。默认模式文件的指针将会放在文件的开头
rb 以二进制格式打开一个文件用于只读。默认模式文件指针将会放在文件的开头
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。如果文件已存在,则依次替换原文件内容,如果文件不存在,报错
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头
w 打开一个文件只用于写入。如果该文件已存在则打开文件,清空文件内容,并从头开始编辑。如果该文件不存在,创建新文件
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,清空文件内容,并从头开始编辑。如果该文件不存在,创建新文件
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,清空文件内容,并从头开始编辑。如果该文件不存在,创建新文件。清空文件,且读取为空,慎用
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,清空文件内容,并从头开始编辑。如果该文件不存在,创建新文件
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾,读取数据为空。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写

示例:

f = open('test.txt', 'w')

注意:

  1. 此时的f是open函数的文件对象。
  2. 访问模式可以省略,默认为 r
  3. 读中文:f = open('test.txt','r', encoding='UTF-8')

3.2.3 文件对象方法

3.2.3.1 写

语法:文件对象.write('内容')
示例:

# 1. 打开文件
f = open('test.txt', 'w')

# 2.文件写入
f.write('hello world')

# 3. 关闭文件
f.close()

注意:

  1. w 和 a 模式:如果文件不存在则创建该文件;如果文件存在, w 模式先清空再写入, a 模式直接末尾追加。
  2. r 模式:如果文件不存在则报错。
3.2.3.2 读

read()
文件对象.read(num)
num表示要从文件中读取的数据的长度(单位是字节),如果没有传入 num,那么就表示读取文件中所有的数据。

123456
123456
hello world
abcdefg
f = open('test.txt','r')

content = f.read(10)
print(content)

content = f.read(3)
print(content)

content = f.read(2)
print(content)

# 关闭文件
f.close()

在这里插入图片描述

注意:如果读取内容包括换行,则换行符\n算一个字节

 
readlines()
readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。

f = open('test.txt')
content = f.readlines()

# ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc']
print(content)

# 关闭文件
f.close()

注意:换行符也会读取出来

 
readline()
readline()一次读取一行内容。

f = open('test.txt')

content = f.readline()
print(f'第一行: {content}')

content = f.readline()
print(f'第二行: {content}'# 关闭文件
f.close()

在这里插入图片描述

3.2.3.3 seek()

作用: 用来移动文件指针。
语法 :文件对象.seek(偏移量, 起始位置)

起始位置:

  • 0:文件开头
  • 1:当前位置
  • 2:文件结尾
# test.txt
hello world
abcdefg
1234567890

通常配合 r+ 、w+模式,seek指针移动只能从头开始移动,即seek(x,0),a+模式下直接在文件末尾写入,seek移动指针不起作用

r+模式

f = open('test.txt','r+')
f.seek(10,0)
content = f.read()
print(content)

f.close()

在这里插入图片描述
 
w+模式

f = open('test.txt','w+')
f.seek(10,0)
f.write('heima')

f.close()

在这里插入图片描述

3.2.3.3 关闭

文件对象.close()

3.3 文件备份

需求:用户输入当前目录下任意文件名,程序完成对该文件的备份功能 (备份文件名为 xx[备份]后缀,例如:test[备份].txt)。

步骤

  1. 接收用户输入的文件名
  2. 规划备份文件名
  3. 备份文件写入数据

示例:

  1. 接收用户输入目标文件名
old_name = input('请输入您要备份的文件名: ')
  1. 规划备份文件名
    2.1 提取目标文件后缀
    2.2 组织备份的文件名, xx[备份]后缀
# 2. 规划备份文件名
# 2.1 提取目标文件后缀
# 找到名字中的点 ——> 名字和后缀分离 ——> 最右侧的点才是后缀的点 ——> 字符串查找某个子串 rfind
index = old_name.rfind('.') # 输入文件名为字符串类型

# print(index)  # 输出后缀中.之前包含的字符数

# print(old_name[:index])  # 源文件名(无后缀)

# 2.2 组织新文件名:旧文件名 + [备份] + 后缀
new_name = old_name[:index] + '[备份]' + old_name[index:]

# 打印新文件名(带后缀)
# print(new_name)

在这里插入图片描述

  1. 备份文件写入数据
    3.1 打开源文件 和 备份文件
    3.2 将源文件数据写入备份文件
    3.3 关闭文件
# 3.1 打开文件
old_f = open(old_name, 'rb')	# 二进制打开文件,不会出错
new_f = open(new_name, 'wb')

# 3.2 将源文件数据写入备份文件
# 如果不确定目标文件大小,循环读取写入,当读取出来的数据为空则终止循环
while True:
   con = old_f.read(1024)
   if len(con) == 0:
       break
   new_f.write(con)

# 3.3 关闭文件
old_f.close()
new_f.close()
  1. 有效文件名
    思考:如果用户输入 .txt,这是一个无效文件,程序如何更改才能限制只有有效的文件名才能备份?
    答:添加条件判断即可。
old_name = input('请输入您要备份的文件名: ')

index = old_name.rfind('.')

# 判断文件吗是否有效
if index > 0:
   postfix = old_name[index:]

new_name = old_name[:index] + '[备份]' + postfix   # 若后缀名变量为空,报错

old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')

while True:
   con = old_f.read(1024)
   if len(con) == 0:
       break
   new_f.write(con)

old_f.close()
new_f.close()

3.4 文件和文件夹的操作

在Python中文件和文件夹的操作要借助os模块里面的相关功能,具体步骤如下:

3.4.1 os模块介绍

  1. 导入 os模块:import os
  2. 使用 os 模块相关功能:os.函数名()
  3. 文件、文件夹重命名:os.rename(目标文件(夹)名,新文件(夹)名)
  4. 删除文件:os.remove(目标文件名)
  5. 创建文件夹:os.mkdir(文件夹名字) # 可加入路径
  6. 删除文件夹:os.rmdir(文件夹名字)
  7. 获取当前文件所在路径 / 目录:os.getcwd()
  8. 改变默认目录:os.chdir(目录)
import os
os.mkdir('aa')		# 创建‘aa’文件夹

os.chdir('aa')		# 进入‘aa’文件夹所在路径
os.mkdir('bb')		# 在‘aa’文件夹下创建‘bb’文件夹
  1. 获取目录列表:os.listdir(目录),获取某个文件夹下所有文件,返回一个列表
print(os.listdir())

在这里插入图片描述

3.4.2 应用案例

需求:批量修改文件名,既可添加指定字符串,又能删除指定字符串。

步骤

  1. 设置添加删除字符串的的标识
  2. 获取指定目录的所有文件
  3. 将原有文件名添加 /删除指定字符串,构造新名字
  4. os.rename()重命名
import os

# 设置重命名标识 flag:1——>添加指定字符,2——>删除指定字符
flag = 1

# 获取指定目录
dir_name = './'

# 获取指定目录的文件列表
file_list = os.listdir(dir_name)
# print(file_list)

# 遍历文件列表内的文件
for name in file_list:

   # 添加指定字符
   if flag == 1:
       new_name = 'Python-' + name
   # 删除指定字符
   elif flag == 2:
       num = len('Python-')	# 7
       new_name = name[num:]

   # 打印新文件名,测试程序正确性
   print(new_name)

   # 重命名
   os.rename(dir_name+name, dir_name+new_name)

注意: 默认情况下,文件夹包含.idea文件,会报错,运行前可先删除

发布了18 篇原创文章 · 获赞 0 · 访问量 1747

猜你喜欢

转载自blog.csdn.net/weixin_44159487/article/details/104828911