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