列表解析、生成器、文件操作

列表解析

[ 表达式 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时才支持偏移量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章