1. 程式人生 > >Python筆記四之操作文件

Python筆記四之操作文件

AC 拷貝 布爾類型 重復 cti 導致 stripe 就是 ani

一、字符串方法補充(join、split)

join方法:

# join方法,連接字符串 1、把一個list變成了字符串 2、通過某個字符把list裏面的元素連接起來
# 3、只要是可以循環的都可以連接起來
l=[a,b,c]
sl=str(l)  #sl="[‘a‘,‘b‘,‘c‘]"  str()把對象轉換成一個字符串,整個list變成一個字符串,包含中括號
print(l,type(l))
print(sl,type(sl))
res=‘‘.join(l)#以空連接起來,結果為 abc
resl=,.join(l)#以逗號連接,結果為a,b,c  join的對象可以是字符串變量名,也可以直接是字符串
print(resl) print(,.join(abc))

運行結果:

[a, b, c] <class list>
[a, b, c] <class str>
a,b,c
a,b,c

split方法:

#split 方法:split()就是將一個字符串分裂成多個字符串組成的列表
names=ab cd
print(list(names))
name_list = names.split()#根據某個字符串,分割字符串,什麽也不傳的話,是以空格分割的
print(name_list)
st0= iisongihuaniiiigongi
#是以i進行分割,第一次分割,i的左邊是空,右邊是‘isongihuaniiiigongi‘,i丟掉;第二次分割,i的左邊還是空,右邊是‘songihuaniiiigongi‘,i丟掉; print(st0.split(i)) str="hello boy<[www.doiido.com]>byebye" str1=str.split("[")[1].split("]")[0]#以"["進行分割,並取分割後列表中下標為1的元素,然後再以"]"分割,取分割後列表中下標為0的元素 str2=str.split("[")[1].split("]")[0].split(".") print(str1)
print(str2)

運行結果:

[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臺
# 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,*))

運行結果:

[a, b,  , c, d]
[ab, cd]
insert into user values ("牛寒陽","","18","回龍觀","1000w","1w臺");
***********************歡迎登錄***********************

二、交換變量

Python可直接對整型變量進行交換,無需通過第三方,因為在底層已經引入了一個第三方變量

a = a+b  # 3
b = a-b  # 1
a = a-b  # 2
print(a,b)#不使用變量進行交換,只適用於數字

a = 1
b = 2
c = 3

b,a= a,c #交換兩個變量的值,Python底層幫你引入了一個的第三方變量在交換
print(a,b,c)
a,b,c=c,a,b
print(a,b,c)

運結果:

2 1
3 1 3
3 3 1

三、判斷

非空即真、非0即真,運用此規則,可大大簡化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個變量 ,值都是0

四、操作文件

Pythonon 默認字符集為utf-8  windows默認字符集為gbk,需加“,encoding=‘utf-8‘”
1、操作文件有三種模式:讀模式r 寫模式w 追加模式a;默認為讀模式,可不寫
讀模式 r 1、不能寫;2、文件不存在會報錯
r+ 讀寫模式 1、默認從文件開頭寫入,會覆蓋掉原來的內容;2、寫入後文件指針變動到寫入的內容末尾,讀取文件時會從這裏開始讀取
f = open(‘name1234‘,‘a+‘,encoding=‘utf-8‘) #打開文件
print(f.read()) #讀文件
print(f.readline()) #讀取一行內容
print(f.readlines()) #是把文件的每一行內容放到一個list裏面

寫模式:1、已存在的文件寫模式會將原文件內容覆蓋掉;2、不存在的文件寫模式會直接新建一個文件並寫入 3、不能讀
w+ 寫讀模式 1、該模式下會清空原來的內容,從而導致讀不到內容 2
f.write(‘test‘)#寫入
print(f.readline())
print(f.read())

只要沾上了r,文件不存在的就會報錯
只要沾上了w,都會清空原來的內容

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

2、文件的基本操作

f = open(‘file.txt‘,‘r‘) #以只讀方式打開一個文件,獲取文件句柄,如果是讀的話,r可以不寫,默認就是只讀,

python2中還有file方法可以打開文件,python3中file方法已經沒有了,只有open

frist_line = f.readline()#獲取文件的第一行內容,返回的是一個list

print(frist_line)#打印第一行

res = f.read()#獲取除了第一行剩下的所有文件內容

print(res)

f.close()#關閉文件

3、文件操作方法

f = open(‘file.txt‘,‘r+‘,encoding=‘utf-8‘)#encoding參數可以指定文件的編碼

f.readline()#讀一行

f.readable()#判斷文件是否可讀

fr.writable()#判斷文件是否可寫

fr.encoding#打印文件的編碼

f.read()#讀取所有內容,大文件時不要用,因為會把文件內容都讀到內存中,內存不夠的話,會把內存撐爆

f.readlines()#讀取所有文件內容,返回一個list,元素是每行的數據,大文件時不要用,因為會把文件內容都讀到內存中,內存不夠的話,會把內存撐爆

f.tell()#獲取當前文件的指針指向

f.seek(0)#把當前文件指針指向哪

f.write(‘愛情證書‘)#寫入內容

f.fulsh()#寫入文件後,立即從內存中把數據寫到磁盤中

f.truncate()#清空文件內容

f.writelines([‘愛情證書‘,‘孫燕姿‘])#將一個列表寫入文件中

f.close()關閉文件

4、文件指針

# 文件指針:
# 用來記錄文件到底讀到哪裏了
# f = open(‘geci‘,encoding=‘utf-8‘)
# print(‘read‘,f.read())#此時文件指針已經到末尾了,後面沒內容了
# print(‘readline‘,f.readline())#基於上述原因,該語句將讀不到任何內容
f = open(geci,a+,encoding=utf-8)
# a\a+模式的文件指針是在末尾的
f.write(呵呵呵)#此時如果讀文件將讀不到任何內容,因為a/a+模式下,文件指針在末尾
f.seek(0)  #移動文件指針到最前面
print(readline,f.readline())
f.write(鵬妹妹)   #移動完文件指針之後,是只能讀,寫的時候還是在文件末尾寫

5、練習

練習1:

# f=open(r‘E:\課件資料\day4\access.log‘,‘a+‘,encoding=‘utf-8‘)#絕對路徑前面加r,可避免被特殊字符被誤轉義
#需求
# 1、監控日誌,如果有攻擊咱們的,就把ip加入黑名單

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

#直接循環一個文件對象的話,每次循環的是文件的每一行
#文件句柄   文件對象
import time
point = 0  # 每次記錄文件指針的位置
while True:#死循環,每隔60秒讀取一次
    all_ips = [] #存放所有的ip地址
    f = open(access.log,encoding=utf-8)#f 文件句柄或文件對象
    f.seek(point)#移動文件指針,下次讀取事直接讀取最新的日誌,否則每次將重復從第一行讀取
    for line in f:     #line  文件的每行內容,直接循環文件對象,每次取到文件的一行內容
        # print(line)
        ip = line.split()[0]#取到每一行的IP
        all_ips.append(ip)
    point = f.tell() #獲取當前文件指針的位置
    all_ip_set = set(all_ips) #集合天然去重,只留下唯一的ip值,否則會把重復的ip重復打印
    for ip in all_ip_set:#此處的IP和前面循環中的IP重名,有影響嗎?
        if all_ips.count(ip)>50:
            print(應該加入黑名單的ip是%s%ip)
    f.close()
    time.sleep(60) #暫停60秒後繼續循環

練習2:

import random
#18612343,
#12384234
# 1861253 2945
print(random.randint(1,9999))
print(1.zfill(4))

#1、先隨機產生一些手機號
#2、寫到文件裏面
f = open(phones.txt, w)
num = input(請輸入你要產生的手機號個數:)
for i in range(int(num)):  #
    start = 1861235
    random_num = str(random.randint(1, 9999))
    new_num = random_num.zfill(4)#補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]  #循環刪list裏面的數據的時候,結果會不正確
l2 = copy.deepcopy(lis) #深拷貝 等同於l2 =[1,1,2,3,4,5,6,8]
# l2 = lis   #淺拷貝
print(id(lis))#id函數用來查看內存地址
print(id(l2))
# l2.append(‘zhangliuliang‘)
# # lis.remove(8)
# print(lis)
# print(id(l))
# print(id(l2))   #淺拷貝和深拷貝的區別就是深拷貝會重新開辟一個內存空間
#     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}
# 交集 並集 差集
# 就是兩個集合相同的地方
# print(s3 & s2)  #取交集
# print(s3.intersection(s2))  #取交集
#並集
    # 就是把兩個集合合並到一起,然後去重
# print(s2 | s3)  #取並集
# print(s2.union(s3))  #取並集
s4 = {1,2,3}
s5 = {1,4,6}
#差集
    #在一個集合裏有,在另一個集合裏面沒有的
#    S4裏面有,s5裏面沒有的
#   取一個集合存在,另一個不存在的元素
# print( s4 - s5)  #取差集
# print(s4.difference(s5)) #取差集
#對稱差集
    #倆集合裏面都沒有
    #去掉倆集合裏面都有的
# print(s4 ^ s5)
# print(s4.symmetric_difference(s5))
# s4.add(‘ss‘) #加元素
# s4.pop()#隨機刪一個
# s4.remove(‘ss‘)#指定刪除哪個
# s4.update({1,2,3}) #把另外一個集合加進去
# s4.isdisjoint(s5)#如果沒有交集的話返回true
print(len(s4))

Python筆記四之操作文件