一、random子產品
1、random子產品用法
1
2
3
4
5
6
7
8
9
10
<code>import</code> <code>random</code>
<code>print</code><code>(random.random()) </code><code># 列印大于0且小于1之間的一個小數</code>
<code>print</code><code>(random.randint(</code><code>1</code><code>, </code><code>3</code><code>)) </code><code># 列印大于等于1且小于等于3之間的一個整數</code>
<code>print</code><code>(random.randrange(</code><code>1</code><code>, </code><code>3</code><code>)) </code><code># 列印大于等于1且小于3之間的一個整數</code>
<code>print</code><code>(random.choice([</code><code>1</code><code>, </code><code>'23'</code><code>, [</code><code>4</code><code>, </code><code>5</code><code>]])) </code><code># 結果為1或者23或者[4,5]</code>
<code>print</code><code>(random.sample([</code><code>1</code><code>, </code><code>'23'</code><code>, [</code><code>4</code><code>, </code><code>5</code><code>]], </code><code>2</code><code>)) </code><code># 列印清單元素任意2個組合</code>
<code>print</code><code>(random.uniform(</code><code>1</code><code>, </code><code>3</code><code>)) </code><code># 列印大于1小于3的小數</code>
<code>item </code><code>=</code> <code>[</code><code>1</code><code>, </code><code>3</code><code>, </code><code>5</code><code>, </code><code>7</code><code>, </code><code>9</code><code>]</code>
<code>random.shuffle(item) </code><code># 打亂item的順序,相當于"洗牌",如[9, 1, 7, 3, 5]</code>
<code>print</code><code>(item)</code>
2、生成随機驗證碼
<code>def</code> <code>make_code(n): </code><code>#n表示驗證碼的位數</code>
<code> </code><code>res</code><code>=</code><code>''</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>range</code><code>(n): </code><code>#傳參數,表示生成多少位的驗證碼</code>
<code> </code><code>s1</code><code>=</code><code>chr</code><code>(random.randint(</code><code>65</code><code>,</code><code>90</code><code>)) </code><code>#對應ASCII碼的數字,再取到對應字母</code>
<code> </code><code>s2</code><code>=</code><code>str</code><code>(random.randint(</code><code>0</code><code>,</code><code>9</code><code>)) </code><code>#0到9的數字随機取一個</code>
<code> </code><code>res</code><code>+</code><code>=</code><code>random.choice([s1,s2]) </code><code>#對s1,s2的值進行随機取一個值,取到的字元串不斷相加</code>
<code> </code><code>return</code> <code>res</code>
<code>print</code><code>(make_code(</code><code>9</code><code>))</code>
二、os子產品
1、os子產品的用法
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<code>import</code> <code>os</code>
<code>os.getcwd() </code><code>#擷取目前工作目錄,即目前python腳本工作的目錄路徑</code>
<code>os.chdir(</code><code>"dirname"</code><code>) </code><code>#改變目前腳本工作目錄;切換目錄</code>
<code>os.curdir </code><code>#傳回目前目錄: ('.')</code>
<code>os.pardir </code><code>#擷取目前目錄的父目錄字元串名:('..')</code>
<code>os.makedirs(</code><code>'dirname1/dirname2'</code><code>) </code><code>#可生成多層遞歸目錄</code>
<code>os.removedirs(</code><code>'dirname1'</code><code>) </code><code>#若目錄為空,則删除,并遞歸到上一級目錄,如若也為空,則删除,依此類推</code>
<code>os.mkdir(</code><code>'dirname'</code><code>) </code><code>#生成單級目錄;</code>
<code>os.rmdir(</code><code>'dirname'</code><code>) </code><code>#删除單級空目錄,若目錄不為空則無法删除,報錯;</code>
<code>os.listdir(</code><code>'dirname'</code><code>) </code><code>#列出指定目錄下的所有檔案和子目錄,包括隐藏檔案,并以清單方式列印</code>
<code>os.remove() </code><code>#删除一個檔案</code>
<code>os.rename(</code><code>"oldname"</code><code>,</code><code>"newname"</code><code>) </code><code>#重命名檔案/目錄</code>
<code>os.stat(</code><code>'path/filename'</code><code>) </code><code>#擷取檔案/目錄資訊</code>
<code>os.sep </code><code>#輸出作業系統特定的路徑分隔符,win下為"\\",Linux下為"/"</code>
<code>os.linesep </code><code>#輸出目前平台使用的行終止符,win下為"\r\n",Linux下為"\n"</code>
<code>os.pathsep </code><code>#輸出用于分割檔案路徑的字元串 win下為分号;,Linux下為冒号:</code>
<code>os.name </code><code>#輸出字元串訓示目前使用平台。win->'nt'; Linux->'posix'</code>
<code>os.system(</code><code>"bash command"</code><code>) </code><code>#運作shell指令,直接顯示,是以取不到我們想要的傳回值</code>
<code>os.environ </code><code>#擷取系統環境變量</code>
<code>os.path.abspath(path) </code><code>#傳回path規範化的絕對路徑</code>
<code>os.path.split(path) </code><code>#将path分割成目錄和檔案名二進制組傳回</code>
<code>os.path.dirname(path) </code><code>#傳回path的目錄。即是os.path.split(path)的第一個元素</code>
<code>os.path.basename(path) </code><code>#傳回path最後的檔案名。如何path以/或\結尾,那麼就會傳回空值。即os.path.split(path)的第二個元素</code>
<code>os.path.exists(path) </code><code>#如果path存在,傳回True;如果path不存在,傳回False</code>
<code>os.path.isabs(path) </code><code>#如果path是絕對路徑,傳回True</code>
<code>os.path.isfile(path) </code><code>#如果path是一個存在的檔案,傳回True。否則傳回False</code>
<code>os.path.isdir(path) </code><code>#如果path是一個存在的目錄,則傳回True。否則傳回False</code>
<code>os.path.join(path1[, path2[, ...]]) </code><code>#将多個路徑組合後傳回,第一個絕對路徑之前的參數将被忽略</code>
<code>os.path.getatime(path) </code><code>#傳回path所指向的檔案或者目錄的最後存取時間</code>
<code>os.path.getmtime(path) </code><code>#傳回path所指向的檔案或者目錄的最後修改時間</code>
<code>os.path.getsize(path) </code><code>#傳回path的大小</code>
2、跨平台相關用法
<code>在Linux和Mac平台上,該函數會原樣傳回path,在windows平台上會将路徑中所有字元轉換為小寫,并将所有斜杠轉換為飯斜杠。</code>
<code>os.path.normcase(</code><code>'c:/windows\\system32\\'</code><code>)</code>
<code>print</code> <code>(os.path.normcase(</code><code>'c:/windows\\system32\\'</code><code>)) </code><code>#列印結果c:\windows\system32\</code>
<code>規範化路徑,如..和 </code><code>/</code>
<code>os.path.normpath(</code><code>'c://windows\\System32\\../Temp/'</code><code>)</code>
<code>print</code> <code>(os.path.normpath(</code><code>'c://windows\\System32\\../Temp/'</code><code>)) </code><code>#列印結果c:\windows\Temp</code>
<code>a </code><code>=</code> <code>'/Users/test1/\\\a1/\\\\aa.py/../..'</code>
<code>print</code><code>(os.path.normpath(a)) </code><code>#列印結果\Users\test1</code>
3、os路徑處理
<code>#方式一:</code>
<code>print</code> <code>(os.path.normpath(os.path.join(</code>
<code> </code><code>os.path.abspath(__file__), </code><code>#取到目前檔案的絕對路徑</code>
<code> </code><code>'..'</code><code>, </code><code>#取上一級目錄</code>
<code> </code><code>'..'</code> <code>#取上一級目錄</code>
<code>)</code>
<code>))</code>
<code>#方式二:</code>
<code>print</code> <code>(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))</code>
三、sys子產品
1、sys子產品的用法
import sys
sys.argv #指令行參數List,第一個元素是程式本身路徑,執行腳本會得到所有的參數
sys.exit(n) #退出程式,正常退出時exit(0)
sys.version #擷取Python解釋程式的版本資訊
sys.maxint #最大的Int值
sys.path #傳回子產品的搜尋路徑,初始化時使用PYTHONPATH環境變量的值
sys.platform #傳回作業系統平台名稱
2、列印進度條
<code>print</code><code>(</code><code>'[%-50s]'</code> <code>%</code><code>'#'</code><code>) #指定寬度為</code><code>50</code><code>,左對齊,結果[# ]</code>
<code>print</code> <code>((</code><code>'[%%-%ds]'</code> <code>%</code><code>50</code><code>)) </code><code>#%%表示取消%的特殊意義,結果[%-50s]</code>
<code>print</code><code>((</code><code>'[%%-%ds]'</code> <code>%</code><code>50</code><code>) </code><code>%</code><code>'#'</code><code>) #結果[# ]</code>
<code>print</code><code>((</code><code>'[%%-%ds]'</code> <code>%</code><code>50</code><code>) </code><code>%</code><code>(</code><code>'#'</code><code>*</code><code>5</code><code>)) #結果[##### ]</code>
<code>#完整代碼如下:</code>
<code>import</code> <code>sys</code>
<code>import</code> <code>time</code>
<code>def</code> <code>progress(percent,width</code><code>=</code><code>50</code><code>):</code>
<code> </code><code>if</code> <code>percent ></code><code>=</code> <code>1</code><code>: </code><code>#百分比大于1讓其強制等于1,否則會超過百分之百</code>
<code> </code><code>percent</code><code>=</code><code>1</code>
<code> </code><code>show_str</code><code>=</code><code>(</code><code>'[%%-%ds]'</code> <code>%</code><code>width) </code><code>%</code><code>(</code><code>int</code><code>(width</code><code>*</code><code>percent)</code><code>*</code><code>'#'</code><code>)</code>
<code> </code><code>print</code><code>(</code><code>'\r%s %d%%'</code> <code>%</code><code>(show_str,</code><code>int</code><code>(</code><code>100</code><code>*</code><code>percent)),</code><code>file</code><code>=</code><code>sys.stdout,flush</code><code>=</code><code>True</code><code>,end</code><code>=</code><code>'') </code><code>#\r表示跳到行首</code>
<code>#模拟資料下載下傳:</code>
<code>data_size </code><code>=</code> <code>102511</code> <code>#檔案總大小</code>
<code>recv_size </code><code>=</code> <code>0</code> <code>#接收檔案大小</code>
<code>while</code> <code>recv_size < data_size:</code>
<code> </code><code>time.sleep(</code><code>0.1</code><code>) </code><code># 模拟資料的傳輸延遲</code>
<code> </code><code>recv_size </code><code>+</code><code>=</code> <code>1024</code> <code># 每次收1024</code>
<code> </code><code>percent </code><code>=</code> <code>recv_size </code><code>/</code> <code>data_size </code><code># 接收的比例</code>
<code> </code><code>progress(percent, width</code><code>=</code><code>70</code><code>) </code><code># 進度條的寬度70</code>
四、shutil子產品
1、shutil子產品用法
<code>import</code> <code>shutil</code>
<code>shutil.copyfileobj(</code><code>open</code><code>(</code><code>'old.xml'</code><code>, </code><code>'r'</code><code>), </code><code>open</code><code>(</code><code>'new.xml'</code><code>, </code><code>'w'</code><code>)) </code><code>#将檔案内容拷貝到另一個檔案中</code>
<code>shutil.copyfile(</code><code>'f1.log'</code><code>, </code><code>'f2.log'</code><code>) </code><code># 拷貝檔案,目标檔案無需存在</code>
<code>shutil.copymode(</code><code>'f1.log'</code><code>, </code><code>'f2.log'</code><code>) </code><code># 僅拷貝權限。内容、組、使用者均不變,目标檔案必須存在</code>
<code>shutil.copystat(</code><code>'f1.log'</code><code>, </code><code>'f2.log'</code><code>) </code><code># 僅拷貝狀态的資訊,包括:mode bits, atime, mtime, flags,目标檔案必須存在</code>
<code>shutil.copy(</code><code>'f1.log'</code><code>, </code><code>'f2.log'</code><code>) </code><code>#拷貝檔案和權限</code>
<code>shutil.copy2(</code><code>'f1.log'</code><code>, </code><code>'f2.log'</code><code>) </code><code>#拷貝檔案和狀态資訊</code>
<code>shutil.copytree(</code><code>'folder1'</code><code>, </code><code>'folder2'</code><code>,ignore</code><code>=</code><code>shutil.ignore_patterns(</code><code>'*.pyc'</code><code>, </code><code>'tmp*'</code><code>)) </code><code># 遞歸的去拷貝檔案夾,目标目錄不能存在,ignore的意思是排除</code>
<code>shutil.copytree(</code><code>'f1'</code><code>, </code><code>'f2'</code><code>, symlinks</code><code>=</code><code>True</code><code>, ignore</code><code>=</code><code>shutil.ignore_patterns(</code><code>'*.pyc'</code><code>, </code><code>'tmp*'</code><code>)) </code><code>#拷貝軟連結,</code>
<code>shutil.rmtree(</code><code>'folder1'</code><code>) </code><code>#遞歸的去删除檔案</code>
<code>shutil.move(</code><code>'folder1'</code><code>, </code><code>'folder3'</code><code>) </code><code>#遞歸的去移動檔案,其實就是重命名</code>
2、壓縮檔案
<code>(</code><code>1</code><code>) 将 </code><code>/</code><code>data 下的檔案打包放置目前程式目錄</code>
<code>ret </code><code>=</code> <code>shutil.make_archive(</code><code>"data_bak"</code><code>, </code><code>'gztar'</code><code>, root_dir</code><code>=</code><code>'/data'</code><code>)</code>
<code>(</code><code>2</code><code>)将 </code><code>/</code><code>data下的檔案打包放置 </code><code>/</code><code>tmp</code><code>/</code><code>目錄</code>
<code>ret </code><code>=</code> <code>shutil.make_archive(</code><code>"/tmp/data_bak"</code><code>, </code><code>'gztar'</code><code>, root_dir</code><code>=</code><code>'/data'</code><code>)</code>
五、json&pickle子產品
1、序列化
我們把對象(變量)從記憶體中變成可存儲或傳輸的過程稱之為序列化,在Python中叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等
作用是:(1)持久儲存狀态
(2)跨平台資料互動
2、json子產品用法
<code>dic</code><code>=</code><code>{</code>
<code> </code><code>'wang'</code><code>:{</code><code>'password'</code><code>:</code><code>'123'</code><code>,</code><code>'sex'</code><code>:</code><code>'male'</code><code>},</code>
<code> </code><code>'li'</code><code>:{</code><code>'password'</code><code>:</code><code>'123'</code><code>,</code><code>'sex'</code><code>:</code><code>'male'</code><code>},</code>
<code>}</code>
<code>import</code> <code>json</code>
<code>json.dump(dic,</code><code>open</code><code>(r</code><code>'C:\Users\db\db.json'</code><code>,</code><code>'w'</code><code>)) </code><code>#會将資料按照json的格式寫入檔案db.json</code>
<code>json.load(</code><code>open</code><code>(r</code><code>'C:\Users\db\db.json'</code><code>,</code><code>'r'</code><code>)) </code><code>#取到db.json裡面的資料</code>
<code>#</code>
<code>#無論資料是怎樣建立的,隻要滿足json格式,就可以json.loads出來,不一定非要dumps的資料才能loads</code>
3、pickle子產品用法
<code>import</code> <code>pickle</code>
<code>pickle.dump(dic,</code><code>open</code><code>(r</code><code>'C:\Users\db\db.json'</code><code>,</code><code>'wb'</code><code>))</code>
<code>pickle.load(</code><code>open</code><code>(r</code><code>'C:\Users\db\db.json'</code><code>,</code><code>'rb'</code><code>))</code>
<code>#pickle的用法和json差不多,不過讀寫是bytes類型</code>
六、shelve子產品
shelve子產品隻有一個open函數,傳回類似字典的對象,可讀可寫;key必須為字元串,而值可以是python所支援的資料類型
<code>import</code> <code>shelve</code>
<code>f</code><code>=</code><code>shelve.</code><code>open</code><code>(r</code><code>'sheve.txt'</code><code>)</code>
<code>f[</code><code>'stu1_info'</code><code>]</code><code>=</code><code>{</code><code>'name'</code><code>:</code><code>'wang'</code><code>,</code><code>'age'</code><code>:</code><code>18</code><code>,</code><code>'hobby'</code><code>:[</code><code>'smoking'</code><code>,</code><code>'drinking'</code><code>]}</code>
<code>f[</code><code>'stu2_info'</code><code>]</code><code>=</code><code>{</code><code>'name'</code><code>:</code><code>'gangdan'</code><code>,</code><code>'age'</code><code>:</code><code>53</code><code>}</code>
<code>f[</code><code>'school_info'</code><code>]</code><code>=</code><code>{</code><code>'website'</code><code>:</code><code>'http://www.pypy.org'</code><code>,</code><code>'city'</code><code>:</code><code>'beijing'</code><code>}</code>
<code>print</code><code>(f[</code><code>'stu1_info'</code><code>][</code><code>'hobby'</code><code>])</code>
<code>f.close()</code>
七、xml子產品
如下一個xml檔案a.xml:
<?xml version="1.0"?>
<data v="1.0">
hello world
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
<country name="Panama">
<rank updated="yes">69</rank>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</data>
1、xml子產品的用法
<code>from</code> <code>xml.etree </code><code>import</code> <code>ElementTree</code>
<code>tree</code><code>=</code><code>ElementTree.parse(</code><code>'a.xml'</code><code>)</code>
<code>root</code><code>=</code><code>tree.getroot()</code>
<code>print</code><code>(root) </code><code>#<Element 'data' at 0x0000000001E0ACC8></code>
<code>print</code><code>(root.tag) </code><code>#得到标簽的名字 data</code>
<code>print</code><code>(root.attrib) </code><code>#标簽的屬性{'v': '1.0'}</code>
<code>print</code><code>(root.text) </code><code>#标簽的内容hello world</code>
2、查找方式
<code>(</code><code>1</code><code>)從子節點中查找</code>
<code>print</code><code>(root.find(</code><code>'country'</code><code>)) </code><code>#<Element 'country' at 0x0000000001E6CC28></code>
<code>print</code><code>(root.findall(</code><code>'country'</code><code>)) </code><code>#[<Element 'country' at 0x00000000027ECC28>, <Element 'country' at 0x0000000002A62C78>, <Element 'country' at 0x0000000002A62E08>]</code>
<code>print</code><code>(root.find(</code><code>'rank'</code><code>)) </code><code>#None</code>
<code>直接查找rank傳回</code><code>None</code><code>,要實作找到rank,需要借助腳本:</code>
<code>for</code> <code>country </code><code>in</code> <code>root.findall(</code><code>'country'</code><code>):</code>
<code> </code><code>rank</code><code>=</code><code>country.find(</code><code>'rank'</code><code>)</code>
<code> </code><code>print</code><code>(rank.tag,rank.attrib,rank.text)</code>
<code>'''</code>
<code>#執行結果是:</code>
<code>rank {'updated': 'yes'} 2</code>
<code>rank {'updated': 'yes'} 5</code>
<code>rank {'updated': 'yes'} 69</code>
<code>(</code><code>2</code><code>)從整個樹形結構中查找</code>
<code>print</code><code>(</code><code>list</code><code>(root.</code><code>iter</code><code>(</code><code>'rank'</code><code>))) </code><code>#[<Element 'rank' at 0x0000000002A1B598>, <Element 'rank' at 0x0000000002A53CC8>, <Element 'rank' at 0x0000000002A53E58>]</code>
3、周遊整個文檔
<code>for</code> <code>country </code><code>in</code> <code>root:</code>
<code> </code><code>print</code><code>(country.attrib[</code><code>'name'</code><code>])</code>
<code> </code><code>for</code> <code>item </code><code>in</code> <code>country:</code>
<code> </code><code>print</code><code>(item.tag,item.attrib,item.text)</code>
<code>for</code> <code>year </code><code>in</code> <code>root.</code><code>iter</code><code>(</code><code>'year'</code><code>): </code><code>#在整個文檔中找year</code>
<code> </code><code>print</code><code>(year.tag,year.attrib,year.text)</code>
4、修改檔案中的内容
<code>for</code> <code>year </code><code>in</code> <code>root.</code><code>iter</code><code>(</code><code>'year'</code><code>):</code>
<code> </code><code>year.</code><code>set</code><code>(</code><code>'updated'</code><code>,</code><code>'yes'</code><code>)</code>
<code> </code><code>year.text</code><code>=</code><code>str</code><code>(</code><code>int</code><code>(year.text)</code><code>+</code><code>1</code><code>) </code><code>#年份加1</code>
<code>tree.write(</code><code>'b.xml'</code><code>) </code><code>#結果寫到新檔案b.xml,也可以直接修改到源檔案a.xml</code>
5、添加新内容
<code> </code><code>obj</code><code>=</code><code>ElementTree.Element(</code><code>'admin'</code><code>)</code>
<code> </code><code>obj.attrib</code><code>=</code><code>{</code><code>'name'</code><code>:</code><code>'wang'</code><code>,</code><code>'age'</code><code>:</code><code>'18'</code><code>}</code>
<code> </code><code>obj.text</code><code>=</code><code>'hello,wang'</code>
<code> </code><code>country.append(obj) </code><code>#添加進檔案</code>
<code>tree.write(</code><code>'b.xml'</code><code>) </code><code>#寫入檔案,所有的country下面都添加了<admin age="18" name="wang">hello,wang</admin></country></code>
<code>添加到固定位置:</code>
<code>for</code> <code>rank </code><code>in</code> <code>root.</code><code>iter</code><code>(</code><code>'rank'</code><code>):</code>
<code> </code><code>if</code> <code>int</code><code>(rank.text) </code><code>=</code><code>=</code> <code>5</code><code>: </code><code>#隻在rank值為5的地方添加</code>
<code> </code><code>obj </code><code>=</code> <code>ElementTree.Element(</code><code>'admin'</code><code>)</code>
<code> </code><code>obj.attrib </code><code>=</code> <code>{</code><code>'name'</code><code>: </code><code>'wang'</code><code>, </code><code>'age'</code><code>: </code><code>'18'</code><code>}</code>
<code> </code><code>obj.text </code><code>=</code> <code>'hello,wang'</code>
<code> </code><code>rank.append(obj)</code>
<code>tree.write(</code><code>'b.xml'</code><code>)</code>
八、configparser子產品
有如下檔案a.cfg,在C:\Users\a.cfg
[mysql]
user=root
password=123456
[mysqld]
port=3306
1、讀取檔案中的資料
<code>import</code> <code>configparser</code>
<code>config </code><code>=</code> <code>configparser.ConfigParser()</code>
<code>config.read(r</code><code>'C:\Users\a.cfg'</code><code>)</code>
<code>print</code><code>(config.sections()) </code><code>#檢視所有标題 ['mysql', 'mysqld']</code>
<code>print</code><code>(config.options(</code><code>'mysql'</code><code>)) </code><code>#得到sections下對應的options的key,['user', 'password']</code>
<code>print</code> <code>(config.items(</code><code>'mysql'</code><code>)) </code><code>#[('user', 'root'), ('password', '123456')]</code>
<code>val</code><code>=</code><code>config.get(</code><code>'mysql'</code><code>,</code><code>'user'</code><code>) </code><code>#得到key對應的值,結果是 root</code>
<code>print</code> <code>(val)</code>
<code>print</code><code>(config.getint(</code><code>'mysql'</code><code>,</code><code>'age'</code><code>)) </code><code>#取的值是整型</code>
<code>print</code><code>(config.getfloat(</code><code>'mysql'</code><code>,</code><code>'age'</code><code>)) </code><code>#取的值是浮點型</code>
2、修改檔案中的資料
<code>config</code><code>=</code><code>configparser.ConfigParser()</code>
<code>config.read(</code><code>'a.cfg'</code><code>,encoding</code><code>=</code><code>'utf-8'</code><code>)</code>
<code>config.remove_section(</code><code>'mysqld'</code><code>) </code><code>#删除整個标題mysqld</code>
<code>config.remove_option(</code><code>'mysqld'</code><code>,</code><code>'port'</code><code>) </code><code>#删除标題mysqld下的port</code>
<code>print</code><code>(config.has_section(</code><code>'mysqld'</code><code>)) </code><code>#判斷是否存在mysqld标題</code>
<code>print</code><code>(config.has_option(</code><code>'mysql'</code><code>,</code><code>'user'</code><code>)) </code><code>#判斷标題mysql下是否有user</code>
<code>config.add_section(</code><code>'admin'</code><code>) </code><code>#添加一個标題admin</code>
<code>config.</code><code>set</code><code>(</code><code>'admin'</code><code>,</code><code>'name'</code><code>,</code><code>'wang'</code><code>) </code><code>#在标題admin下添加name=wang,age=18的配置</code>
<code>config.</code><code>set</code><code>(</code><code>'admin'</code><code>,</code><code>'age'</code><code>,</code><code>'18'</code><code>) </code><code>#添加的必須是字元串</code>
<code>config.write(</code><code>open</code><code>(</code><code>'a.cfg'</code><code>,</code><code>'w'</code><code>)) </code><code>#最後将修改的内容寫入檔案,完成最終的修改</code>
基于上述方法添加一個ini文檔:
<code>config[</code><code>"DEFAULT"</code><code>] </code><code>=</code> <code>{</code><code>'ServerAliveInterval'</code><code>: </code><code>'45'</code><code>,</code>
<code> </code><code>'Compression'</code><code>: </code><code>'yes'</code><code>,</code>
<code> </code><code>'CompressionLevel'</code><code>: </code><code>'9'</code><code>}</code>
<code>config[</code><code>'bitbucket.org'</code><code>] </code><code>=</code> <code>{}</code>
<code>config[</code><code>'bitbucket.org'</code><code>][</code><code>'User'</code><code>] </code><code>=</code> <code>'hg'</code>
<code>config[</code><code>'topsecret.server.com'</code><code>] </code><code>=</code> <code>{}</code>
<code>topsecret </code><code>=</code> <code>config[</code><code>'topsecret.server.com'</code><code>]</code>
<code>topsecret[</code><code>'Host Port'</code><code>] </code><code>=</code> <code>'50022'</code>
<code>topsecret[</code><code>'ForwardX11'</code><code>] </code><code>=</code> <code>'no'</code>
<code>config[</code><code>'DEFAULT'</code><code>][</code><code>'ForwardX11'</code><code>] </code><code>=</code> <code>'yes'</code>
<code>with </code><code>open</code><code>(</code><code>'example.ini'</code><code>, </code><code>'w'</code><code>) as configfile:</code>
<code> </code><code>config.write(configfile)</code>
<code>#結果是生成檔案:example.ini</code>
<code>[DEFAULT]</code>
<code>serveraliveinterval </code><code>=</code> <code>45</code>
<code>compression </code><code>=</code> <code>yes</code>
<code>compressionlevel </code><code>=</code> <code>9</code>
<code>forwardx11 </code><code>=</code> <code>yes</code>
<code>[bitbucket.org]</code>
<code>user </code><code>=</code> <code>hg</code>
<code>[topsecret.server.com]</code>
<code>host port </code><code>=</code> <code>50022</code>
<code>forwardx11 </code><code>=</code> <code>no</code>
九、hashlib子產品
1、介紹
hash:一種算法 ,python3裡代替了md5子產品和sha子產品,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
有三個特點:
(1)内容相同則hash運算結果相同,内容稍微改變則hash值則變
(2)不可逆推
(3)相同算法:無論校驗多長的資料,得到的哈希值長度固定。
2、hashlib子產品用法
<code>import</code> <code>hashlib</code>
<code>m </code><code>=</code> <code>hashlib.md5() </code><code># m=hashlib.sha256()</code>
<code>m.update(</code><code>'hello'</code><code>.encode(</code><code>'utf8'</code><code>))</code>
<code>print</code><code>(m.hexdigest()) </code><code># 5d41402abc4b2a76b9719d911017c592</code>
<code>m.update(</code><code>'world'</code><code>.encode(</code><code>'utf8'</code><code>))</code>
<code>print</code><code>(m.hexdigest()) </code><code># fc5e038d38a57032085441e7fe7010b0</code>
<code>m2 </code><code>=</code> <code>hashlib.md5()</code>
<code>m2.update(</code><code>'helloworld'</code><code>.encode(</code><code>'utf8'</code><code>))</code>
<code>print</code><code>(m2.hexdigest()) </code><code># fc5e038d38a57032085441e7fe7010b0</code>
注意:把一段很長的資料update多次,與一次update這段長資料,得到的結果一樣
這樣update多次就為校驗大檔案提供了可能。
3、密碼加密
(1)為防止撞庫反解出密碼。是以,有必要對加密算法中添加自定義key再來做加密
<code>hash</code> <code>=</code> <code>hashlib.sha256(</code><code>'w123q321'</code><code>.encode(</code><code>'utf8'</code><code>)) </code><code>#加密(加鹽),增加密碼破解難度</code>
<code>hash</code><code>.update(</code><code>'helloworld'</code><code>.encode(</code><code>'utf8'</code><code>))</code>
<code>print</code><code>(</code><code>hash</code><code>.hexdigest()) </code><code># d11039095aafd7cb72f6681aab9d55e5eff453940287e9799fdb52e09fef170c</code>
(2)python還有一個hmac子產品,它内部對我們建立key和内容進行進一步的處理然後再加密:
<code>import</code> <code>hmac</code>
<code>h </code><code>=</code> <code>hmac.new(</code><code>'hello'</code><code>.encode(</code><code>'utf8'</code><code>))</code>
<code>h.update(</code><code>'world'</code><code>.encode(</code><code>'utf8'</code><code>))</code>
<code>print</code> <code>(h.hexdigest()) </code><code>#0e2564b7e100f034341ea477c23f283b</code>
注意:要想保證hmac最終結果一緻,必須保證
# 1:hmac.new括号内指定的初始key一樣
# 2:無論update多少次,校驗的内容累加到一起是一樣的内容
4、模拟撞庫破解
<code>passwds</code><code>=</code><code>[ </code><code>#猜測使用者可能的密碼</code>
<code> </code><code>'alex3714'</code><code>,</code>
<code> </code><code>'alex123'</code><code>,</code>
<code> </code><code>'alex123456'</code><code>,</code>
<code> </code><code>'123456'</code><code>,</code>
<code> </code><code>'1234567890'</code><code>,</code>
<code> </code><code>'a123456'</code><code>,</code>
<code> </code><code>]</code>
<code>def</code> <code>make_passwd_dic(passwds):</code>
<code> </code><code>dic</code><code>=</code><code>{}</code>
<code> </code><code>for</code> <code>passwd </code><code>in</code> <code>passwds:</code>
<code> </code><code>m</code><code>=</code><code>hashlib.md5()</code>
<code> </code><code>m.update(passwd.encode(</code><code>'utf-8'</code><code>))</code>
<code> </code><code>dic[passwd]</code><code>=</code><code>m.hexdigest()</code>
<code> </code><code>return</code> <code>dic </code><code>#dic得到的是原始密碼和加密密碼的鍵值對</code>
<code>def</code> <code>break_code(cryptograph,passwd_dic):</code>
<code> </code><code>for</code> <code>k,v </code><code>in</code> <code>passwd_dic.items():</code>
<code> </code><code>if</code> <code>v </code><code>=</code><code>=</code> <code>cryptograph:</code>
<code> </code><code>print</code><code>(</code><code>'密碼是===>\033[46m%s\033[0m'</code> <code>%</code><code>k)</code>
<code>cryptograph</code><code>=</code><code>'aee949757a2e698417463d47acac93df'</code> <code>#抓包得到的加密後的密碼</code>
<code>break_code(cryptograph,make_passwd_dic(passwds))</code>
十、subprocess子產品
1、subprocess子產品用法
<code>import</code> <code>subprocess</code>
<code>subprocess.Popen(</code><code>'tasklist'</code><code>,shell</code><code>=</code><code>True</code><code>,</code>
<code> </code><code>stdout </code><code>=</code> <code>subprocess.PIPE,</code>
<code> </code><code>stderr </code><code>=</code> <code>subprocess.PIPE,</code>
<code>) </code><code>#交給子程序執行,不等子程序傳回結果就執行後面的代碼</code>
<code>print</code><code>(subprocess.Popen(</code><code>'tasklist'</code><code>,shell</code><code>=</code><code>True</code><code>) )</code>
<code>time.sleep(</code><code>1</code><code>) </code><code>#列印到終端的有我們需要的資料,不加這行結果隻是<subprocess.Popen object at 0x00000000021F88D0></code>
<code>最終代碼為:</code>
<code>obj</code><code>=</code><code>subprocess.Popen(</code><code>'tasklist'</code><code>,shell</code><code>=</code><code>True</code><code>,</code>
<code>print</code> <code>(obj.stdout.read().decode(</code><code>'gbk'</code><code>))</code>
2、subprocess子產品執行個體
(1)執行個體一:
<code>sh-3.2# ls /Users/egon/Desktop |grep txt$</code>
<code>mysql.txt</code>
<code>tt.txt</code>
<code>事物.txt</code>
<code>import</code> <code>subprocess</code>
<code>res1</code><code>=</code><code>subprocess.Popen(</code><code>'ls /Users/jieli/Desktop'</code><code>,shell</code><code>=</code><code>True</code><code>,stdout</code><code>=</code><code>subprocess.PIPE)</code>
<code>res</code><code>=</code><code>subprocess.Popen(</code><code>'grep txt$'</code><code>,shell</code><code>=</code><code>True</code><code>,stdin</code><code>=</code><code>res1.stdout,</code>
<code> </code><code>stdout</code><code>=</code><code>subprocess.PIPE)</code>
<code>print</code><code>(res.stdout.read().decode(</code><code>'utf-8'</code><code>))</code>
<code>#等同于上面,但是上面的優勢在于,一個資料流可以和另外一個資料流互動,可以通過爬蟲得到結果然後交給grep</code>
<code>res1</code><code>=</code><code>subprocess.Popen(</code><code>'ls /Users/jieli/Desktop |grep txt$'</code><code>,shell</code><code>=</code><code>True</code><code>,stdout</code><code>=</code><code>subprocess.PIPE)</code>
<code>print</code><code>(res1.stdout.read().decode(</code><code>'utf-8'</code><code>))</code>
<code>windows下:</code>
<code># dir | findstr 'test*'</code>
<code># dir | findstr 'txt$'</code>
<code>res1</code><code>=</code><code>subprocess.Popen(r</code><code>'dir C:\Users\Administrator\Desktop'</code><code>,shell</code><code>=</code><code>True</code><code>,stdout</code><code>=</code><code>subprocess.PIPE)</code>
<code>res</code><code>=</code><code>subprocess.Popen(</code><code>'findstr txt'</code><code>,shell</code><code>=</code><code>True</code><code>,stdin</code><code>=</code><code>res1.stdout,</code>
<code> </code><code>stdout</code><code>=</code><code>subprocess.PIPE) </code><code>#過濾包含txt字元的檔案</code>
<code>print</code><code>(res.stdout.read().decode(</code><code>'gbk'</code><code>)) </code><code>#得到結果為bytes類型,在windows下需要用gbk解碼</code>
(2)執行個體二:得到關于python的程序資訊
<code>obj1</code><code>=</code><code>subprocess.Popen(</code><code>'tasklist'</code><code>,shell</code><code>=</code><code>True</code><code>,</code>
<code> </code><code>stdout</code><code>=</code><code>subprocess.PIPE,</code>
<code> </code><code>stderr</code><code>=</code><code>subprocess.PIPE,</code>
<code> </code><code>)</code>
<code>obj2</code><code>=</code><code>subprocess.Popen(</code><code>'findstr python'</code><code>,shell</code><code>=</code><code>True</code><code>, </code><code>#過濾有python字元串的行</code>
<code> </code><code>stdin</code><code>=</code><code>obj1.stdout,</code>
<code>print</code><code>(obj2.stdout.read())</code>
<code></code>
本文轉自 宋鵬超 51CTO部落格,原文連結:http://blog.51cto.com/qidian510/2061130,如需轉載請自行聯系原作者