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

列表解析

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

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