1. 程式人生 > >python基礎學習3-文件讀寫、集合、json、函數

python基礎學習3-文件讀寫、集合、json、函數

subset 使用 單引號 trunc else 思路 統一 數據 test

1 文件讀寫補充

文件修改

方法1:簡單粗暴直接:

1、 先獲取到文件裏面的所有內容

2、 然後修改文件裏面的內容

3、 清空原來文件裏面的內容

4、 重新寫入

f = open(‘test1.txt‘,‘r+‘)
f.seek(0)
all_data = f.read()
new_data = all_data.replace(‘123‘,‘python‘)
f.seek(0) #將指針移到最前面
f.truncate() #清空原來文件內容
f.write(new_data) #重新寫入文件內容
f.flush()
f.close()

方法2:高效的處理方式

1、 先打開原來的文件,再打開一個空文件

2、 循環處理原來文件裏每一行數據,處理完之後寫到新文件裏

3、 將原來的文件刪除,將新文件名字修改成原來文件的名字

import os
with open(‘words.txt‘) as fr,open(‘words1‘,‘w‘) as fw:
for line in fr:
line = line.lstrip() #去掉左邊的空格
if line: #判斷這一行是否有數據
line = line.replace(,‘you‘

) #替換數據
fw.write(line) #寫到新文件裏面
os.remove(‘words.txt‘) #刪除原來的文件
os.rename(‘words1‘,‘words.txt‘) #將新文件重命名為原來文件名

使用with open方法打開文件會自動關閉,不需要在手動去關閉這個文件;

f = open(筆記.txt‘) #打開的文件稱為文件句柄或文件對象

for line in f: #直接循環文件對象,每次循環的時候就是去的每一行數據
print(‘line‘,line)

2 集合、json模塊

集合作用:

1、 天生去重

2、 關系測試-交集,差集,並集,反向差集,對稱差集

nums = [1,2,3,2,3,4,1,5,6]
print(set(nums))

list = [1,2,3,4,5,3,6] #列表
list_dict = {2,3,4,3}
list_2 = [2,3,5,7,8]
list = set(list) #將列表轉換為集合
list_2 = set(list_2)
print(交集:,list.intersection(list_2)) #交集,取出重復數據
print(list & list_2) #這個也叫交集

print(並集:,list.union(list_2)) #並集,去重統一展示
print(list | list_2) #這個也叫並集

print(差集:,list.difference(list_2)) #差集,取出list中有的,list_2中沒有的
print(list - list_2) #這個也叫差集

list_3 = set([1,3,6])
print(子集:,list_3.issubset(list)) #子集,list_3的值在list中全有,返回的是一個布爾類型的結果
print(父集:,list.issuperset(list_3)) #父集

print(對稱差集:,list.symmetric_difference(list_2)) #對稱差集,將listlist_2中互相沒有的值都取出來,把兩集合裏都有的去掉
print(list ^ list_2) #這個也叫對稱差集


#
集合操作
list.add(123) #每次只能添加一個
print(list)

list.update([888,999]) #可以同時添加多個
print(list)

list.remove(999) #刪除指定元素
print(list)

list.pop() #隨機刪除
print(list)

list.discard() #刪除一個不存在的元素不會報錯
print(list)

實例:

#監控日誌
#1
、如果一分鐘之內某個ip訪問超過100
#2
、就把他的ip找出來,split,取第一個元素
#3
、找出所有的ip,統計次數
#4
、判斷每個ip次數大於100,就發郵件
#5
、記錄文件指針,給下一次讀的時候用
#6
、等待60s,重新讀取文件

import time
point = 0 #存放的是文件初始的位置

while True:
with open(‘access.log‘) as f:
f.seek(point)
ip_info = {} #存放ip和它出現的次數
for line in f:
ip = line.split()[0]
if ip in ip_info:
#ip_info[ip] = ip_info[ip] + 1
ip_info[ip] += 1
else:
ip_info[ip] = 1
point = f.tell() #獲取當前文件指針的位置
for k in ip_info:
if ip_info.get(k) >= 100:
print(ip在攻擊你%s‘%k)
time.sleep(60) #等待60s

json是一個字符串,只不過長的像字典;

在json裏只有雙引號,沒有單引號;

import json
user_info = ‘‘‘
{"test1":"123456","test2":"123456"}
‘‘‘
user_dic = json.loads(user_info) #json串(字符串)轉換成字典
print(user_dic)
print(‘user_info‘,type(user_info))
print(‘user_dic‘,type(user_dic))

stu_info = {‘zhangsan‘:{‘cars‘:[‘BMW‘,‘Ben-z‘]}}
stu_str = json.dumps(stu_info) #把字典轉換成json
print(‘stu_str‘,type(stu_str))
print(stu_str)
f = open(‘stu.txt‘,‘w‘)
f.write(stu_str)
f.close()

f = open(‘stu.json‘, ‘w‘)
json.dump(stu_info,f,indent=4) #不需要自己在write,人家會幫你寫入文件,後面加入indent=4幫你自動進行縮進,4表示縮進4個字符

3 函數

1、函數就是一個功能,一個方法,簡化代碼

2、函數必須得調用才會執行

3、一個函數只做一件事

4、重復的代碼是低級的

5、實現同樣的功能,代碼越少越好

def say(name): #函數名,括號裏寫參數就是形參(形式參數即變量)
print(‘%s hahaha‘%name) #函數體
say(‘zhangshan‘) #函數名裏面加括號就是調用上面的函數,括號裏面的參數是實參(實際參數)



def say1(name,sex=): #函數名,括號裏寫參數就是形參(形式參數即變量)
#
必填參數,如name
#
默認值參數,非必填,如sex=‘
print(‘%s hahaha 性別%s‘%(name,sex)) #函數體
say1(‘zhangshan‘) #函數名裏面加括號就是調用上面的函數,括號裏面的參數是實參(實際參數)

在函數裏面的變量都是局部變量,它只能在函數裏面使用,函數執行結束就沒有這個變量了;

返回值,如果需要用到函數的處理結果的話,就寫return,不需要的話,那就不用寫;函數裏面如果碰到return,函數立即結束;

# 函數立即結束def calc(a,b):

res = a * b

print(res)

return res #沒有return返回時,函數返回的數據類型就是NoneType,有return的類型就是函數的結果類型

cur_money = 8000

nx = calc(1000,13)

print(nx+cur_money)

def my():

for i in range(100)

if i == 2:

return

print(my())

#寫一個校驗輸入的字符串是否為小數的程序
#
思路:
# 1
0.12 1.23 -12.3只有一個小數點,判斷小數點個數;
# 2
、正小數的情況下,小數點左邊和右邊都是整數的話,才合法,通過分割符去判斷
#3
、負小數的情況下,小數點右邊整數,左邊必須是“-”開頭,且只有一個負號;
#-5.4
#[‘-5‘,‘4‘]
#[1:]
def check_float(s):
s = str(s)
if s.count(‘.‘) == 1:
s_list = s.split(‘.‘)
#5.3 分割之後就是[5,3]

left = s_list[0] #小數點左邊
rigth = s_list[1] #小數點右邊
if left.isdigit() and rigth.isdigit():
return True
elif
left.startswith(‘-‘) and left.count(‘-‘) ==1 and left[1:].isdigit() and rigth.isdigit(): #left.count(‘-‘) ==1這個判斷可以不用寫
return True

return False

print(check_float(1.8))
print(check_float(-2.4))
print(check_float(‘-s.5‘))
print(check_float(‘50.232ss‘))
print(check_float(-3-4.4-9))


def my_file(name,content=None):
with open(name,‘a+‘) as f:
f.seek(0)
if content:
f.write(content)
else:
return f.read()

python基礎學習3-文件讀寫、集合、json、函數