一、文件修改的兩種方式
文件修改的原理:把硬盤數據讀入內存,在內存修改完畢后,再覆蓋回硬盤具體來說又分為兩種方案。
#方案一:
with open('test.txt',mode='rt',encoding='utf-8') as f:
data = f.read()
with open('test.txt',mode='wt',encoding='utf-8') as f:
f.write(data.replace('egon','EGON'))
# 方案二:
import os # 調用os模塊
with open('test.txt',mode='rt',encoding='utf-8') as f1,\
open('.test.txt.swp',mode='wt',encoding='utf-8') as f2:
for line in f1:
f2.write(line.replace('EGON',"egon"))
os.remove('test.txt') # 移除文本text.txt
os.rename('.test.txt.swp','test.txt') # 將.test.txt.swp文本名改為test.txt
總結:
方案一:優點是對硬盤沒有要求。缺點是源文件過大了,就很費內存。(電腦中的文本編輯器編輯 文件的方式一般都是用方案一)
方案二:優點是不費內存。缺點:不費硬盤,但在某時刻運行對硬盤有要求:不能用完,要留有足夠的空間。
擴展知識:
1、.開頭的在Linux系統中是隱藏文件(在桌面是看不見的,除非一些特殊的命令才能查看),將其作為臨時的文件。
2、注意不要在Pycharm環境下用vim(就相當於我們使用的文本編輯器)打開大文件,耗內存。
二、函數
1 什么是函數 函數就是盛放功能(一系列代碼)的容器 定義函數就是造出了一個工具
事先准備工具的過程->函數的定義 遇到應用場景拿來就用->函數的調用
2 為何要用函數 不用函數寫出的代碼問題是: 1 程序的組織結構不清晰,可讀性差,可維護性差 2 可擴展性差
3 如何用函數 原則: 先定義 后調用
定義函數的語法: def 函數名(參數1,參數2,參數3,...): (推薦寫文檔注釋) 代碼1 代碼2 代碼3 return 值
調用函數語法: res = 函數名(值1,值2,值3)
4.return返回值的語法
函數內可以有多個return,但只要執行一次,整個函數就立即結束,並且將return后的值當做本次調用的產品返回
具體的函數返回值有三種形式:
1、 return 值 # 返回的就是該值的本身
2、 return 值1,值2,值3 # 返回的是小元組
3、 沒有return或者return無值或者return None # 返回的都是None
如果這個函數只是完成了一個簡單的文件處理,沒有后續的處理就不需要返回值。如果需要進行后續的處理就需要返回值。例:功能.append()和.pop(),當我們用.append()進行附加時不存在返回值,而.pop()就存在返回值。
擴展知識:
1、變量名與函數名的差別:當我們打印變量名與函數名時,理論上這里打印的變量名與函數名都是變量名與函數名對應的內存地址。因此我們正常打印函數名得到的只是內存地址,但是變量名做了一些處理,使得打印出的變量名為變量名所對應的值。函數地址加括號觸發函數內部代碼的運行,而變量沒有這種語法
2、return的額外功能:如果函數內套入很多while,for循環,return可以直接結束函數的運行
三、模塊
1 什么是模塊 模塊一系列功能的集合體(一個py文件也可以是一個模塊)
模塊分為四種通用的類別 1 使用python編寫的.py文件(主要接觸)
2 已被編譯為共享庫或DLL的C或C++擴展
3 把一系列模塊組織到一起的文件夾(注:文件夾下有一個init.py文件,該文件夾稱之為包)
4 使用C編寫並鏈接到python解釋器的內置模塊
模塊有三種來源: 1 python自帶的模塊/庫 內置模塊 標准庫
2 第三方的庫
3 自定義庫
2 為何要用模塊 1 拿來主義,提升開發效率 2 減少代碼冗余
3 如何用模塊
import導入的這種方式,在使用的時候一定要加模塊名.作為前綴,優點是不會與當前變量名發生沖突,缺點是每次訪問都需要加前綴。
from ... import導入的這種方式,優點是每次訪問都不需要加前綴,缺點是容易與當前變量名沖突
四、常用模塊
1、time模塊
import time
時間戳:
print(time.time()) # 打印的是1970年的某一天到現在的秒數。主要用來時間的運算
格式化的字符串:
print(time.strftime('%Y-%m-%d %H:%M:%S')) # 主要用來看時間
格式化的時間:
obj = time.localtime()
print(obj.tm_year) # 獲取今天是哪一年 print(obj.tm_yday) # 獲取今天是哪一天
obj2 = time.gmtime() # 獲取utc時間(世界標准時間) print(obj2)
print(obj)
用於獲取時間的一部分,比如今天是哪一天,哪一年,那一月。。。
2、random模塊
import random
print(random.random()) # 取0到1之間小數的隨機值 print(random.randint(1,3)) #取1到3之間的整數(1和3都能取到) print(random.randrange(1,3)) # 取1到3之間的整數,取不到3(顧頭不顧尾) print(random.choice([11,"aaa",333])) # 從你輸入的值11,aaa,333值中隨機選一個 print(random.sample([11,"aaa",333,444],2)) # 從輸入的值中隨即取出兩個
print(random.uniform(1, 3)) # 獲取大於1和小於3的小數
item=[1,3,5,7,9] random.shuffle(item) # 將item中的值全部打亂 print(item)
儲備知識 print(chr(65)) # chr用於輸出ASCII編碼表中數字對應的字母 print(chr(90))
print(ord('A')) # ord用於輸出ASCII編碼表中字母對應的數字 print(ord('Z'))
隨即驗證碼的功能:
import random
def make_code(size):
res = ''
for i in range(size):
num = str(random.randint(0,9))
s = chr(random.randint(65,90))
res += random.choice([num,s])
return res
print(make_code(6))
3、os模塊
os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑 os.chdir("dirname") 改變當前腳本工作目錄;相當於shell下cd os.curdir 返回當前目錄: ('.') os.pardir 獲取當前目錄的父目錄字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄 os.removedirs('dirname1') 若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推 os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中rmdir dirname os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式打印 os.remove() 刪除一個文件 os.rename("oldname","newname") 重命名文件/目錄 os.stat('path/filename') 獲取文件/目錄信息 os.sep 輸出操作系統特定的路徑分隔符,win下為"\",Linux下為"/" os.linesep 輸出當前平台使用的行終止符,win下為"\r\n",Linux下為"\n" os.pathsep 輸出用於分割文件路徑的字符串 win下為;,Linux下為: os.name 輸出字符串指示當前使用平台。win->'nt'; Linux->'posix' os.system("bash command") 運行shell命令,直接顯示 os.environ 獲取系統環境變量 os.path.abspath(path) 返回path規范化的絕對路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 os.path.basename(path) 返回path最后的文件名。如何path以/或\結尾,那么就會返回空值。即os.path.split(path)的第二個元素 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False os.path.isabs(path) 如果path是絕對路徑,返回True os.path.isfile(path) 如果path是一個存在的文件,返回True。否則返回False os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False os.path.join(path1[, path2[, ...]]) 將多個路徑組合后返回,第一個絕對路徑之前的參數將被忽略 os.path.getatime(path) 返回path所指向的文件或者目錄的最后存取時間 os.path.getmtime(path) 返回path所指向的文件或者目錄的最后修改時間 os.path.getsize(path) 返回path的大小
4、subprocess