Python笔记四之操作文件
一、字符串方法補(bǔ)充(join、split)
join方法:
# join方法,連接字符串 1、把一個(gè)list變成了字符串 2、通過某個(gè)字符把list里面的元素連接起來 # 3、只要是可以循環(huán)的都可以連接起來 l=['a','b','c'] sl=str(l) #sl="['a','b','c']" str()把對象轉(zhuǎn)換成一個(gè)字符串,整個(gè)list變成一個(gè)字符串,包含中括號(hào) print(l,type(l)) print(sl,type(sl)) res=''.join(l)#以空連接起來,結(jié)果為 abc resl=','.join(l)#以逗號(hào)連接,結(jié)果為a,b,c join的對象可以是字符串變量名,也可以直接是字符串 print(resl) print(','.join('abc'))運(yùn)行結(jié)果:
['a', 'b', 'c'] <class 'list'> ['a', 'b', 'c'] <class 'str'> a,b,c a,b,c?
split方法:
#split 方法:split()就是將一個(gè)字符串分裂成多個(gè)字符串組成的列表 names='ab cd' print(list(names)) name_list = names.split()#根據(jù)某個(gè)字符串,分割字符串,什么也不傳的話,是以空格分割的 print(name_list) st0= 'iisongihuaniiiigongi'#是以i進(jìn)行分割,第一次分割,i的左邊是空,右邊是'isongihuaniiiigongi',i丟掉;第二次分割,i的左邊還是空,右邊是'songihuaniiiigongi',i丟掉; print(st0.split('i')) str="hello boy<[www.doiido.com]>byebye" str1=str.split("[")[1].split("]")[0]#以"["進(jìn)行分割,并取分割后列表中下標(biāo)為1的元素,然后再以"]"分割,取分割后列表中下標(biāo)為0的元素 str2=str.split("[")[1].split("]")[0].split(".") print(str1) print(str2)運(yùn)行結(jié)果:
['a', 'b', ' ', 'c', 'd'] ['ab', 'cd'] ['', '', 'song', 'huan', '', '', '', 'gong', ''] www.doiido.com ['www', 'doiido', 'com']fomat方法:
names='ab cd' print(list(names)) name_list = names.split() print(name_list) user='牛寒陽' sex='男' age=18 addr='回龍觀' money= '1000w' cars='1w臺(tái)' # words = 'insert into user values ("%s","%s","%s","%s","%s","%s");'%(user,sex,age,addr,money,cars) sql = 'insert into user values ("{name}","{sex}","{age}","{addr}","{qian}","{che}");' new_sql = sql.format(age=age,che=cars,name=user,sex=sex,qian=money,addr=addr) print(new_sql) print('歡迎登錄'.center(50,'*'))運(yùn)行結(jié)果:
['a', 'b', ' ', 'c', 'd'] ['ab', 'cd'] insert into user values ("牛寒陽","男","18","回龍觀","1000w","1w臺(tái)"); ***********************歡迎登錄***********************二、交換變量
Python可直接對整型變量進(jìn)行交換,無需通過第三方,因?yàn)樵诘讓右呀?jīng)引入了一個(gè)第三方變量
a = a+b # 3 b = a-b # 1 a = a-b # 2 print(a,b)#不使用變量進(jìn)行交換,只適用于數(shù)字 a = 1 b = 2 c = 3b,a= a,c #交換兩個(gè)變量的值,Python底層幫你引入了一個(gè)的第三方變量在交換 print(a,b,c) a,b,c=c,a,b print(a,b,c)運(yùn)結(jié)果:
2 1 3 1 3 3 3 1三、判斷
非空即真、非0即真,運(yùn)用此規(guī)則,可大大簡化Python的代碼 # 非空即真、非0即真 # 不為空的話就是true,是空的話就是false # 只要不是0就是true,是0就是false# 布爾類型 # True False name = input('請輸入你的名字:').strip() a = [] #false d={} # false c = 0 #false f = tuple() #false e='' #false print(a) if name: #name里面有沒有東西,print('name不是為空的。。') else:print('輸入不能為空。。')# a = b = c = 0 #定義了3個(gè)變量 ,值都是0四、操作文件
Pythonon 默認(rèn)字符集為utf-8 windows默認(rèn)字符集為gbk,需加“,encoding='utf-8'”1、操作文件有三種模式:讀模式r 寫模式w 追加模式a;默認(rèn)為讀模式,可不寫
讀模式 r 1、不能寫;2、文件不存在會(huì)報(bào)錯(cuò)
r+ 讀寫模式 1、默認(rèn)從文件開頭寫入,會(huì)覆蓋掉原來的內(nèi)容;2、寫入后文件指針變動(dòng)到寫入的內(nèi)容末尾,讀取文件時(shí)會(huì)從這里開始讀取
f = open('name1234','a+',encoding='utf-8') #打開文件
print(f.read()) #讀文件
print(f.readline()) #讀取一行內(nèi)容
print(f.readlines()) #是把文件的每一行內(nèi)容放到一個(gè)list里面
寫模式:1、已存在的文件寫模式會(huì)將原文件內(nèi)容覆蓋掉;2、不存在的文件寫模式會(huì)直接新建一個(gè)文件并寫入 3、不能讀
w+ 寫讀模式 1、該模式下會(huì)清空原來的內(nèi)容,從而導(dǎo)致讀不到內(nèi)容 2
f.write('test')#寫入
print(f.readline())
print(f.read())
只要沾上了r,文件不存在的就會(huì)報(bào)錯(cuò)
只要沾上了w,都會(huì)清空原來的內(nèi)容
?? 追加模式 a 在文件末尾寫入
1、文件不存在的話,會(huì)幫你新建文件
2、打開一個(gè)已經(jīng)存的文件,不會(huì)清空,末尾增加
3、不能讀
a+ 追加讀模式:能讀文件,但是讀不到內(nèi)容
??? f?=?open('file.txt','r')?#以只讀方式打開一個(gè)文件,獲取文件句柄,如果是讀的話,r可以不寫,默認(rèn)就是只讀,
????????在python2中還有file方法可以打開文件,python3中file方法已經(jīng)沒有了,只有open????????
????????frist_line?=?f.readline()#獲取文件的第一行內(nèi)容,返回的是一個(gè)list
????????print(frist_line)#打印第一行
????????res?=?f.read()#獲取除了第一行剩下的所有文件內(nèi)容
????????print(res)
????????f.close()#關(guān)閉文件
?3、文件操作方法
???????? f?=?open('file.txt','r+',encoding='utf-8')#encoding參數(shù)可以指定文件的編碼
????????????f.readline()#讀一行??????????? f.readable()#判斷文件是否可讀
??????????? fr.writable()#判斷文件是否可寫
??????????? fr.encoding#打印文件的編碼
????????????f.read()#讀取所有內(nèi)容,大文件時(shí)不要用,因?yàn)闀?huì)把文件內(nèi)容都讀到內(nèi)存中,內(nèi)存不夠的話,會(huì)把內(nèi)存撐爆
????????????f.readlines()#讀取所有文件內(nèi)容,返回一個(gè)list,元素是每行的數(shù)據(jù),大文件時(shí)不要用,因?yàn)闀?huì)把文件內(nèi)容都讀到內(nèi)存中,內(nèi)存不夠的話,會(huì)把內(nèi)存撐爆
????????????f.tell()#獲取當(dāng)前文件的指針指向
????????????f.seek(0)#把當(dāng)前文件指針指向哪
????????????f.write('愛情證書')#寫入內(nèi)容
????????????f.fulsh()#寫入文件后,立即從內(nèi)存中把數(shù)據(jù)寫到磁盤中
????????????f.truncate()#清空文件內(nèi)容
????????????f.writelines(['愛情證書','孫燕姿'])#將一個(gè)列表寫入文件中
?
????????????f.close()關(guān)閉文件
4、文件指針
# 文件指針: # 用來記錄文件到底讀到哪里了 # f = open('geci',encoding='utf-8') # print('read',f.read())#此時(shí)文件指針已經(jīng)到末尾了,后面沒內(nèi)容了 # print('readline',f.readline())#基于上述原因,該語句將讀不到任何內(nèi)容 f = open('geci','a+',encoding='utf-8') # a\a+模式的文件指針是在末尾的 f.write('呵呵呵')#此時(shí)如果讀文件將讀不到任何內(nèi)容,因?yàn)閍/a+模式下,文件指針在末尾 f.seek(0) #移動(dòng)文件指針到最前面 print('readline',f.readline()) f.write('鵬妹妹') #移動(dòng)完文件指針之后,是只能讀,寫的時(shí)候還是在文件末尾寫5、練習(xí)
練習(xí)1:
# f=open(r'E:\課件資料\day4\access.log','a+',encoding='utf-8')#絕對路徑前面加r,可避免被特殊字符被誤轉(zhuǎn)義 #需求 # 1、監(jiān)控日志,如果有攻擊咱們的,就把ip加入黑名單#分析:#1、打開日志文件#2、把ip地址拿出來#3、判斷每一個(gè)ip出現(xiàn)的次數(shù),如果大于100次的話,加入黑名單#4、每分鐘讀一次#直接循環(huán)一個(gè)文件對象的話,每次循環(huán)的是文件的每一行 #文件句柄 文件對象 import time point = 0 # 每次記錄文件指針的位置 while True:#死循環(huán),每隔60秒讀取一次all_ips = [] #存放所有的ip地址f = open('access.log',encoding='utf-8')#f 文件句柄或文件對象f.seek(point)#移動(dòng)文件指針,下次讀取事直接讀取最新的日志,否則每次將重復(fù)從第一行讀取for line in f: #line 文件的每行內(nèi)容,直接循環(huán)文件對象,每次取到文件的一行內(nèi)容# print(line)ip = line.split()[0]#取到每一行的IP all_ips.append(ip)point = f.tell() #獲取當(dāng)前文件指針的位置all_ip_set = set(all_ips) #集合天然去重,只留下唯一的ip值,否則會(huì)把重復(fù)的ip重復(fù)打印for ip in all_ip_set:#此處的IP和前面循環(huán)中的IP重名,有影響嗎?if all_ips.count(ip)>50:print('應(yīng)該加入黑名單的ip是%s'%ip)f.close()time.sleep(60) #暫停60秒后繼續(xù)循環(huán)練習(xí)2:
import random #18612343, #12384234 # 1861253 2945 print(random.randint(1,9999)) print('1'.zfill(4))#1、先隨機(jī)產(chǎn)生一些手機(jī)號(hào) #2、寫到文件里面 f = open('phones.txt', 'w') num = input('請輸入你要產(chǎn)生的手機(jī)號(hào)個(gè)數(shù):') for i in range(int(num)): # start = '1861235'random_num = str(random.randint(1, 9999))new_num = random_num.zfill(4)#補(bǔ)0,zfill方法的操作對象是字符串phone_num = start+new_num #這一行有問題f.write(phone_num,new_num+'\n')#換行 f.close()五、集合
# int float list dict tuple set # 天生去重 import copy #淺拷貝 #深拷貝 lis = [1,1,2,3,4,5,6,8] #循環(huán)刪list里面的數(shù)據(jù)的時(shí)候,結(jié)果會(huì)不正確 l2 = copy.deepcopy(lis) #深拷貝 等同于l2 =[1,1,2,3,4,5,6,8] # l2 = lis #淺拷貝 print(id(lis))#id函數(shù)用來查看內(nèi)存地址 print(id(l2)) # l2.append('zhangliuliang') # # lis.remove(8) # print(lis) # print(id(l)) # print(id(l2)) #淺拷貝和深拷貝的區(qū)別就是深拷貝會(huì)重新開辟一個(gè)內(nèi)存空間 # 0 1 2 3 4 5 6 7 # for i in l2: # if i%2!=0: # l.remove(i) # print(l)# 集合天生就能去重,集合也是無序的 s=set() #空集合 s2 = set('1234445566778') print(s2) s3 = {'1','1','3','4','5','6','7','9'} d = {'k':'v'} # 交集 并集 差集 # 就是兩個(gè)集合相同的地方 # print(s3 & s2) #取交集 # print(s3.intersection(s2)) #取交集 #并集# 就是把兩個(gè)集合合并到一起,然后去重 # print(s2 | s3) #取并集 # print(s2.union(s3)) #取并集 s4 = {1,2,3} s5 = {1,4,6} #差集#在一個(gè)集合里有,在另一個(gè)集合里面沒有的 # S4里面有,s5里面沒有的 # 取一個(gè)集合存在,另一個(gè)不存在的元素 # print( s4 - s5) #取差集 # print(s4.difference(s5)) #取差集 #對稱差集#倆集合里面都沒有#去掉倆集合里面都有的 # print(s4 ^ s5) # print(s4.symmetric_difference(s5)) # s4.add('ss') #加元素 # s4.pop()#隨機(jī)刪一個(gè) # s4.remove('ss')#指定刪除哪個(gè) # s4.update({1,2,3}) #把另外一個(gè)集合加進(jìn)去 # s4.isdisjoint(s5)#如果沒有交集的話返回true print(len(s4))?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/jojoan/p/8760610.html
總結(jié)
以上是生活随笔為你收集整理的Python笔记四之操作文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【2018.10.2】Note of C
- 下一篇: 【游记】CCHO TY国初划水记