1. 程式人生 > >文件操作和集合

文件操作和集合

ren 移動文件 基本 識別 ini 同學 update 寫入文件 每次

判斷方法

# 非空即真、非0即

#不為空的話就是true,是空的話就是false

#只要不是0 就是 true,是0就是false

#布爾類型 True False

# print(bool(‘‘))
# print(bool(‘g‘))
name=input(name:).strip()
if name:#輸入不為空則真
    print(輸入不是為空)
else:
    print(輸入不能為空)
#這些空數據都能識別
a=[]
b={}
c=0
f=tuple()
e=‘‘
a=b=c=0#定義了3個變量,值都是0 可以用這麽方法定義多個變量

交互變量:

#a,b交換值
a=1
b
=2 c=None c=b b=a a=c b,a=a,b#交換a,b兩個變量值 Python已經在底層引用第三方變量 b,a,c=a,c,b#對應交換 #不引用第三方變量,交換a,b值 a=a+b b=a-b a=a-b

深拷貝淺拷貝

l=[1,1,2,3,4,5,6,8]#循環刪list裏面的數據時,結果會不正確
for i in l:#循環l2
    if i%2!=0:
        l.remove(i)
print(l)
#結果為:[1, 2, 4, 6, 8]
l2=[1,1,2,3,4,5,6,8]
print(id(l))
print(id(l2))
for i in
l2:#循環l2,卻刪除l,這樣就不會刪除了l下標 if i%2!=0: l.remove(i) print(l) #結果為:[ 2, 4, 6, 8] import copy #淺拷貝,內存地址一樣 #深拷貝,重新開辟內存空間 l2=copy.deepcopy(l)#深拷貝 l2=l#淺拷貝 #示例,淺拷貝 # lis=[1,1,2,3,4,5,6,8] # lis2=lis # print(id(lis)) # print(id(lis2)) # lis2.append(‘zhangliuliang‘) # print(lis)#lis會增加zhangliuliang
#深拷貝 lis=[1,1,2,3,4,5,6,8] lis2=copy.deepcopy(lis) lis2.append(test) print(id(lis)) print(id(lis2)) print(lis)#lis不會增加zhangliuliang

集合

集合也是一種數據類型,一個類似列表東西,它的特點是無序的,不重復的,也就是說集合中是沒有重復的數據

集合的作用:

1、它可以把一個列表中重復的數據去掉,而不需要你再寫判斷

2、可以做關系測試,比如說有兩個班,一個性能測試班,一個是接口測試班的,想找出來既學習了性能又學習了接口測試的同學,就可以用集合

#集合天生去重
s=set()#空集合
s2=set(1231123fddf)
print(s2)
s3={1,1,3,4,5,6,7}
d={k:v}
#交集  並集 差集
#取交集
print(s2 & s3)#結果為空,因為s3元素為整型,s2為字符串
s3={1,2,3,4,5,6,7}
print(s2 & s3)
print(s3.intersection(s2))
#並集,就是把兩個集合合並在一起,然後去重
print(s2|s3)
print(s2.union(s3))
#差集 就是去除某個集合相同的元素
s4={1,2,3}
s5={1,4,6}
print(s4-s5)
print(s4.difference(s5))

#對稱差集,去掉兩集合都存在的元素
print(s4 ^ s5)
print(s4.symmetric_difference(s5))
#print(s4.symmetric_difference_update(s5))

s4.add(ss)
s4.pop()#隨機刪除一個元素
s4.remove(ss)#指定刪除哪個
s4.update({1,2,3})#把另外一個集合加進來
s4.discard(1)#如果刪除的元素存在則刪除,如果不存在不做處理
s4.isdisjoint(s5)#如果有集合則False,沒有交集則Flase

#判讀是否子集、父集
print(s4.issubset(s5))  # 判斷s4是不是s5的子集
print(s4.issuperset(s5))  # 判斷s4是不是s5的父集

文件:

對文件的操作分三步:

1、打開文件獲取文件的句柄,句柄就理解為這個文件

2、通過文件句柄操作文件

3、關閉文件。

文件的幾種模式:

# 讀模式    r    讀寫模式 r+
#1、不能寫
#2、文件不存在的話會報錯
# 寫模式  w,  寫讀模式   w+
    #1、文件不存在的話,會幫你新建文件
    #2、打開一個已經存的文件,他會清空以前文件的內容
    #3、不能讀

# 追加模式  a,   追加讀模式 a+  #文件末尾去增加內容
    # 1、文件不存在的話,會幫你新建文件
    # 2、打開一個已經存的文件,不會清空,末尾增加
    # 3、不能讀

1、打開文件的模式有:
 r,只讀模式(默認)。
 w,只寫模式。【不可讀;不存在則創建;存在則刪除內容;】
 a,追加模式。【不可讀; 不存在則創建;存在則只追加內容;】

2、"+"表示可以同時讀寫某個文件
r+,【可讀、可寫;可追加,如果打開的文件不存在的話,會報錯】
w+,【寫讀模式,使用w+的話,已經存在的文件內容會被清空,可以讀到已經寫的文件內容】
a+,【追加讀寫模式,不存在則創建;存在則只追加內容;】

3、"U"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)
rU
r+U

4、"b"表示處理二進制文件(如:FTP發送上傳ISO鏡像文件,linux可忽略,windows處理二進制文件時需標註
rb
wb
ab

文件基本操作:

f = open(pwd.txt,r,encoding=utf-8) #以只讀方式打開一個文件,獲取文件句柄,如果是讀的話,r可以不寫,默認就是只讀,文件不存在會報錯
#在python2中還有file方法可以打開文件,python3中file方法已經沒有了,只有open
frist_line = f.readline()#獲取文件的第一行內容
print(frist_line)#打印第一行
res = f.read()#因為前面已經讀取第一行,文件指針已經指向第二行,所以獲取除了第一行剩下的所有文件內容
print(res)
f.close()#關閉文件

# 結果:
# 10123,123!qweQ
# 
# 123,123!qwQW
# 321,123@qwQw
#
f = open(names,a+,encoding=utf-8) #打開文件,采用utf-8編碼打開
f.seek(0)
print(f.read()) #讀文件
# print(f.readline()) #讀取一行內容
# print(f.readlines())  #是把文件的每一行放到一個list裏面
f.write(\n)#換行寫入
f.write(天氣真好)#寫入
f.seek(0)#寫入數據之後文件指針在最後一行,應該重新移動到第一行才能完全讀取內容
print(f.read())

文件操作方法:

(1)

f = open(pwd.txt,a+,encoding=utf-8)#encoding參數可以指定文件的編碼
f.seek(0)#把當前文件指針指向哪
print(f.readline())#讀一行
f.readable()#判斷文件是否可讀
print(f.readable())
f.writable()#判斷文件是否可寫
print(f.writable())
f.encoding#打印文件的編碼
print(f.encoding)
f.read()#讀取所有內容,大文件時不要用,因為會把文件內容都讀到內存中,內存不夠的話,會把內存撐爆
f.readlines()#讀取所有文件內容,返回一個list,元素是每行的數據,大文件時不要用,因為會把文件內容都讀到內存中,內存不夠的話,會把內存撐爆
f.tell()#獲取當前文件的指針指向
print(f.tell())
f.write(‘你好)#寫入內容
#f.fulsh()#寫入文件後,立即從內存中把數據寫到磁盤中
f.seek(0)
f.truncate()#清空文件內容
f.truncate(10)#截取10個字符
f.seek(0)
print(f.read())
f.writelines([姓名,‘hwt])#將一個列表寫入文件中
f.seek(0)
print(f.read())
f.close()#關閉文件

(2)大文件時,讀取文件高效的操作方法:

用上面的read()和readlines()方法操作文件的話,會先把文件所有內容讀到內存中,這樣的話,內存數據一多,非常卡,高效的操作,就是讀一行操作一行,讀過的內容就從內存中釋放了

f = open(pwd.txt)
        for line in f:
            print(line)#這樣的話,line就是每行文件的內容,讀完一行的話,就會釋放一行的內存

(3)with使用:

在操作文件的時候,經常忘了關閉文件,這樣的就可以使用with,它會在使用完這個文件句柄之後,自動關閉該文件,使用方式如下:

with open(pwd.txt,r,encoding=utf-8) as f:#打開一個文件,把這個文件的句柄付給f
          for line in f:
              print(line)
with open(pwd.txt,encoding=utf-8) as fr, open(names,w,encoding=utf-8) as fw: #這個是多文件的操作,打開兩個文件,fr是讀pwd.txt,fw是新建一個names文件
           for line in fr:#循環pwd.txt中的每一行
               fw.write(line)#寫到names文件中
               print(line)
#結果:
# If I were a boy如果我是個男孩
# Even just for a day就算只是一天
               
# If I were a boy如果我是個男孩
# Even just for a day就算只是一天
(4)修改文件
with open(pwd.txt,r+,encoding=utf-8) as f:
        res = f.read()
        new_res = res.replace(,me)
        #f.write(‘\n‘)
        f.write(new_res)
        f.seek(0)
        for line2 in f:
         print(line2)
#結果:
# If I were a boy如果我是個男孩
# Even just for a day就算只是一天
#
         
# If I were a boy如果me是個男孩
# Even just for a day就算只是一天
# me

with open(pwd.txt,r,encoding=utf-8) as f:#先看pwd文件數據
          for line in f:
              print(line)

with open(phones.txt,r,encoding=utf-8) as f:#在看phone文件數據
          for line in f:
              print(line)

with open(pwd.txt,encoding=utf-8) as fr, open(phones.txt,w+,encoding=utf-8) as fw: #這個是多文件的操作,打開兩個文件,fr是讀pwd.txt,fw是新建一個names文件
           for line in fr:#循環pwd.txt中的每一行
               new_line = line.replace(,me)
               fw.write(new_line)#寫到names文件中
with open(phones.txt,r,encoding=utf-8) as f:#輸出替換後的phone數據進行對比
 for line2 in f:
        print(line2)

#結果:
#pwd輸出數據
# If I were a boy如果我是個男孩
# Even just for a day就算只是一天
#
# phone替換前數據      
# 大家好
# 蘋果
# 香蕉
# 快樂
#phone替換後數據,因為W有清空功能,所以原先數據清除了        
# If I were a boy如果me是個男孩
# Even just for a day就算只是一天
# me

小練習:

#需求
# 1、監控日誌,如果有攻擊咱們的,就把ip加入黑名單

#分析:
    #1、打開日誌文件
    #2、把ip地址拿出來
    #3、判斷每一個ip出現的次數,如果大於100次的話,加入黑名單
    #4、每分鐘讀一次

#直接循環一個文件對象的話,每次循環的是文件的每一行
#文件句柄   文件對象
import time

point = 0  # 每次記錄文件指針的位置
while True:
    all_ips = [] #存放所有的ip地址
    f = open(access.log,encoding=utf-8)
    f.seek(point)#移動文件指針
    for line in f:
        ip = line.split()[0]
        all_ips.append(ip)
    point = f.tell() #記錄了指針的位置
    all_ip_set = set(all_ips)  #
    for ip in all_ip_set:
        if all_ips.count(ip)>50:
            print(應該加入黑名單的ip是%s%ip)
    f.close()
    time.sleep(60) #暫停60秒

文件操作和集合