檔案讀寫,函式,元組和集合
阿新 • • 發佈:2018-12-01
1、檔案讀寫
f = open('day4','r+',encoding = 'utf-8')
#讀模式 r 開啟不存在的檔案會報錯、只能讀、不能寫
#寫模式 w #1、開啟不存在的檔案,會新建一個檔案,會清空原有檔案
#2、不能讀、只能寫
#追加模式 a #1、開啟不存在的檔案,會新建
#2、不能讀、只能寫
#讀寫模式 r+ 1、能讀也能寫
2、開啟不存在檔案的時候會報錯
#寫讀模式 w+
1、能讀
2、讀不到內容,因為w先把檔案內容清空
#追加讀模式 a+
1、能讀
2、能不能讀到內容,讀不到內容,因為上來指標就在最後,必須要有seek才能讀到內容
f.seek(0)
1)檔案直接迴圈
你直接迴圈檔案物件,每次取的就是檔案裡面的每一行
for line in f:
print(line)
2)移動指標:
f.seek(0) # 移動檔案指標到最前面
f.flush() # 重新整理緩衝區,立即寫到磁碟上。
# 計算機處理時,磁碟上的東西先讀取到記憶體上,CPU再去讀記憶體。讀後再傳入記憶體,再存到磁碟。
# 而定義變數是存在記憶體裡。
# 記憶體和磁碟交換頻繁會影響效能,所以有緩衝區,滿了再寫到磁盤裡。
3)讀取行:
print(f.readline())
讀取一行的內容,
print(f.readlines())
讀取所有內容,取每行元素組成的list
print(f.read())
讀取所有內容
這三個會彼此影響,因為依次讀,檔案指標(寫字元,游標)會移動。
4)刪除更改檔名字:
import os
os.remove('stu.txt')#把user檔案刪掉
os.rename('.stu.txt','stu.txt') #更改檔名
5)記錄指標位置:
f = open('access.log',encoding='utf-8')
point = f.tell() #記錄指標的位置
f.seek(point) #指標回到記錄的位置
2、集合、元組
1)集合: 用set,{}
s = set()
集合是無序的,自動去重的
# 集合天生可以去重
l = [1,2,2,5,5,3,5]
lset = set(l)
print(lset)
stus1 = {'胡紹燕','王義','王新','馬春波','高文平'}
stus2 = {'胡紹燕','張芳芳','王新','馬春波','高文平'}
#取交集(2種方法)
print(stus1.intersection(stus2))
print(stus1&stus2)
#取並集
print(stus1.union(stus2))
#print(stus1|stus2)
#差集
print(stus1-stus2)
print(stus1.difference(stus2))
#對稱差集 只在一個集合裡面出現過的
print(stus1.symmetric_difference(stus2))
print(stus1^stus2)
#增加元素
stus1.add('孫悟空')
#刪除
stus1.pop()#隨機刪除一個
#stus1.remove('王新')
# 直接迴圈集合:取每一個元素
for s in stus1:
print(s)
2)元組: 用()
元組也是一個list,但是它的值不能改變
# s = [1,2,3]
# t = (1,2,3) #元組。優先順序高。
# m = (123)# 如果只一個元素,判斷不出是否是元組。
# 如果一個元素的元組,元素後邊要加,
# t[1]=4 #會報錯。元組也無序,不可以修改
# print(t)
#print((4+5)*4)
3)倆個模組:
import string
print(string.ascii_lowercase)#取所有小寫字母
print(string.ascii_uppercase)#取所有大寫字母
print(string.digits)#取1-9自然數
print(string.ascii_letters)#取所有小寫字母和大寫字母
print(string.punctuation)#取特殊符號
import random
print(random.randint(1,23))#取1-23間的一個隨機整數
s = [1,2,3,4]
print(random.choice(s))#隨機選擇一個元素
print(random.sample(s,3))#隨機選擇3個元素,放到list裡
print(random.shuffle(s))#只能傳list,打亂s順序。但打亂後沒有返回list,而是None
print(random.uniform(1,13))#取範圍內一個小數,保留了很多位小數
f = random.uniform(1,13)
print(round(f,3))#取3位小數
3、函式
實現某個功能的一些程式碼。
提高程式碼的複用性。
函式必須被呼叫才會執行。
函式裡面定義的變數:區域性變數,只要一出了函式都不能用了
#定義一個函式
def hello():#定義一個叫hello的函式
print('hello')
#函式必須被呼叫才會執行
#呼叫函式
hello()#函式名後邊加括號,才呼叫了函式
#定義函式
def write_file(file_name,content):#入參。定義個函式,有倆個變數名.其中file_name和content叫形參,是倆個形式引數
print(file_name,content)
with open(file_name,'a+',encoding='utf-8') as f:
f.write(content)
#呼叫函式:
# write_file('b.txt','123')
# write_file('a.txt','123')
# write_file('c.txt','12d3')
括號中的這個叫實參,實際引數
def read_file(file_name):#下邊縮排部分叫函式體
with open(file_name,'a+',encoding='utf-8') as f:
f.seek(0)#a+,要注意指標位置
content = f.read()
return content#不寫的話會返回None
#函式裡面定義的變數,都是區域性變數。只要一出了函式,就不能用了。
#需要思考怎樣、需要不需要入參,怎樣寫return
#個人思考:入參是條件,return是目標
print(read_file('stu.txt'))#呼叫函式
return和print的區別:
return能返回一個值,而且能在呼叫的時候定義一個變數來接收。
print只是列印,只能看。
4.判斷
非空即真,非0即真(不是真就是假,空就是假)(能省很多程式碼)
True
False '' None [] {}
username = input('username:').strip()
if username:#if是真了才走,空是假的,所以空的時候不走。
print('username不為空')
else:
print('username為空')
if 1:#1是true
print('true')
else:
print('false')
if 0:#0是false
print('true')
else:
print('false')
5.高效處理檔案方法:
#將檔案的行做成一個字典
f = open('user')#檔案物件,或者檔案控制代碼。
d = {}
while 1: #第一種,但要求檔案裡不能有空行
line = f.readline()#一行一行讀,效率高
if line:#直接迴圈,取代read
user,passwd = line.split(',')
d[user]=passwd
else:#見空停止
break
print(d)
#取檔案行內容
2.直接迴圈
for line in f:#直接迴圈檔案物件,取的就是每一行
print('每次迴圈的是',line)
#增加行
f = open('user','a+')
#f.write()
l = ['abc123\n','bcd123\n']
s = 'adfsdfasf\n'
f.writelines(l)#高效方法,依迴圈依次將定義的list每一個元素寫進去
如果是字串兒的話,還是用write吧
更改檔案:第一種
with open('user','a+') as f:#會自動判斷,關閉檔案
f.seek(0)
result = f.read()
new_result = result.replace('jjj','ABC')#替換了,但並不能更改到檔案中
f.seek(0)
f.truncate()#清空檔案內容
f.write(new_result)
#更改檔案:第二種
import os
with open('user')as fr,open('.users','w')as fw:
for line in fr:#從需要修改的檔案裡面讀
new_line = line.replace('abc','ABC')#需要更改的更改,不需要的不做更改,直接定義
fw.write(new_line)
os.remove('user')#把user檔案刪掉
os.rename('.users','user')#把users改名兒為user