列表解析
[ 表达式 for var in 序列]
类似 for var in 序列:
代码块
[ 表达式 for var in 序列 if 条件]
[ 表达式 for var1 in 序列1 for var2 in 序列2]
例: 将列表中的数字变成字符串
L = [1,4,6,4,1]
#传统方法
ret = []
for i in L:
tmp = str(i)
ret.append(tmp)
print(ret)
#列表解析
ret = [str(i) for i in L]
print(ret)
例: 将一个列表中的偶数取出
L = [1,41,36,57,18,82]
ret = []
for i in L:
if i % 2 == 0:
ret.append(i)
print(ret)
ret = [ i for i in L if i % 2 == 0]
print(ret)
例: 产生和列表一样多的 0
L = [1,41,36,57,18,82]
ret = [ 0 for i in L]
print(ret)
例: 嵌套循环
L1 = [1,2,3]
L2 = ‘abc’
ret = [ ‘{}{}’.format(i,j) for i in L1 for j in L2]
print(ret)
#传统方法
for i in L1:
for j in L2:
tmp = ‘{}{}’.format(i,j)
print(tmp)
生成器 可以使用小括号的形式,也可以使用yield语句
(表达式 for var in 序列)
类似 for var in 序列:
代码块
( 表达式 for var in 序列 if 条件 )
( 表达式 for var1 in 序列1 for var2 in 序列2 )
和列表解析的不同之处: 列表解析会将数据全部生成放到内存里,而生成器只会在内存里放一个表达式,当用户需要数据时,计算产生
range()就是一个典型的生成器
生成器和列表解析写法一致
生成器可以使用next取值,也可以使用for迭代取值
L = [1,2,3,21,432,64]
ret = [ str(i) for i in L]
print(ret)
ret = ( str(i) for i in L )
print(next(ret))
print(next(ret))
for i in ret:
print(i)
文件操作
文件操作,是有模式的
r : 默认,只读
w : 只能写,打开文件时,如果文件没有则创建,如果文件存在则清空
a : 只能追加写,打开文件时,如果文件没有则创建,如果文件存在则追加
r+ : 只能读写 w+ a+
b : 可以和上面的所有模式结合,表示以二进制的方式进行读写文件 rb wb
二进制文件和文本文件的本质区别,在于文本文件有编码。它们在硬盘上一模一样
打开文件 open(文件名,模式,[encoding=utf-8],[errors='ignore'])
文件名 : 操作的文件,可以是绝对路径也可以为相对路径,不过文件名要完整
模式 : r w wb a
encoding : 如果为文本文件,指定文件的解码方式,linux默认为utf-8
errors : 只能指定当解码错误时的处理方式,当为ignore时表示忽略解码错误,默认为异常
打开文件后,文件对象的常用方法:
close() : 关闭一个文件
readline() : 读入一行数据
readlines() : 读入整个文件放到列表中,每一行作为列表中的一个元素
write(data) : 写入指定数据
writelines() : 将一个列表写入一个文件中,注意列表中的所有元素必须为字符串
read() : 读入文件指定字节到内存中,默认读入整个文件 read(10)
tell() : 返回当前文件指针的位置,文件指针可以理解为光标,返回一个字节位置
seek() : 移动文件指针
读文件
方法1:
f = open(r'selinux','r')
line = f.readline()
while line:
print(line,end='')
line = f.readline()
f.close()
==========================
f = open(r'selinux','r')
while True:
line = f.readline()
if not line:break
print(line,end='')
f.close()
方法2: 不推荐,因为会读入整个文件到内存
f = open(r'selinux','r',encoding='utf-8',errors='ignore')
ret = f.readlines()
print(ret)
f.close()
===============================
f = open(r'selinux','r',encoding='utf-8',errors='ignore')
ret = f.read()
print(ret)
f.close()
方法3: 尤其在处理二进制文件,和网络上的数据时,最好使用此方法
f = open(r'selinux','r',encoding='utf-8',errors='ignore')
while True:
con = f.read(10)
if not con: break
print(con,end='')
f.close()
方法4: 最简单的读入行的方法
f = open(r'selinux','r',encoding='utf-8',errors='ignore')
for line in f:
print(line,end='')
f.close()
写文件
注意: 写数据时,并不会自动添加换行符,保持和原数据一致,写入的数据必须为字符串
方法1:
#f = open('file','a')
f = open('file','w')
f.write('abc\n')
f.write('123')
f.close()
方法2:
L = ['abc\n','123']
#f = open('file','w')
f = open('file','a')
f.writelines(L)
f.close()
二进制的方法读写文件
#将一张图片如百度logo下载到本地,进行读写
f = open(‘baidu.png’,‘rb’)
ret = f.read()
f.close()
fw = open('baidu-1.png','wb')
fw.write(ret)
fw.close()
with语句 上下文跟踪,当with代码块结束时,会自动关闭文件
with open(文件,模式) as 变量f:
代码块)
with open('selinux','r') as f:
for line in f:
print(line,end='')
tell() 返回当前文件指针位置
f = open(‘a.txt’)
print(f.tell())
print(f.readline())
print(f.tell())
print(f.readline())
f.close()
seek 移动文件指针
seek(arg1,arg2)
参数2: 只能为 0 1 2
0 : 回到行首
1 : 光标当前位置
2 : 回到行尾
参数1: 偏移量 一般正数向右,负数向左
如果文件是二进制形式打开,则支持所有情况的参数1和参数2
如果文件是以文本形式打开的,只有参数2为0时才支持偏移量