Python:通配符查找、拷貝文件的操作
把文件夾dir1中後綴為’.jpg’的文件拷貝到文件夾dir2中:
import glob import shutil import sys if __name__ == '__main__': file_names = glob.glob('dir1/*.jpg') for file_name in file_names: try: shutil.copy(file_name, 'dir2') except: print("Failed to copy file: ", sys.exc_info())
補充:Python之通配符–提取文件中的內容並輸出
前言:
我的學習進度其實沒有那麼快的,因為現在是網絡工程師實習,隻有晚上一點時間和周末有空,所以周一到周天的學習進度很慢,今天之所以突然跳到通配符是因為工作需要,大體講一下我的工作需求:網絡工程師就是寫腳本然後導入不同的網絡設備中,我現在有一份現網正在使用的設備的命令,需要更換新的設備,但新設備跟舊設備(現網中正在使用的)不是同一個廠傢的,導致他們的命令不兼容(知識,大體內容是一樣的),所以我需要把舊設備中的Mac地址啦,ip啦,網關等全部提取出來並插入到新的命令模式中,現在開始完成上述需求(簡單的,隻包含一點關於IP-MAC綁定的,用於DHCP自動分配ip地址時可以根據PC的MAC和VLAN來獲取特定的IP)
效果圖:
舊設備中命令格式:
變動的大體形式:
原:
ip source binding 0000-0000-0014 vlan 20 1.1.1.14 interface FastEthernet 0/14
新:
int g1/0/14 ip source binding ip-address 1.1.1.14 mac-address 0000-0000-0014 vlan 20
源代碼:
import re f = open('C:/Users/Shinelon/Desktop/ceshi.txt','r',encoding = 'utf-8') x = (f.readlines()) for i in range(0,51): s = x[i] mac = re.findall('.{4}-.{4}-.{4}', s) ip = re.findall('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', s) inter = re.findall('0/\d{1,2}', s) vlan = re.findall('vlan \d\d', s) inter = ''.join(inter) mac = ''.join(mac) vlan = ''.join(vlan) ip = ''.join(ip) print("int g1/%s" % inter) print("ip source binding ip-address %s mac-address %s %s" % (ip, mac, vlan))
f.close()
解析
正則表達式,學網絡的時候接觸過,但比較淺,今天重新看瞭下各命令的含義,第一次寫,有些可以精簡的地方我都沒精簡,一個是太晚瞭沒時間,另一個就是能力有限,多多包涵。
整體思路
從原文件中逐行取出,試瞭好幾次,才弄好格式問題,必須txt,用word文檔會報編碼錯誤,pycharm默認的好像是uef-8,而word是gbk,導致不兼容,總之還得改軟件的編碼方式,我嫌太麻煩,同一使用txt,也挺方便的。
然後就是讀取文件的格式,應該是open函數固定的,‘r’是指的隻讀,不往文檔中寫(f.close()是我寫博客的時候剛加的,不知道對不對,就是關閉流,不關問題不大,報錯就網上查查命令或刪除)。
讀取是readlines()(readline()沒有s隻讀一行)讀到文件尾,返回值是列表,且一次性讀出(可以用循環,那樣就要用readline()一行一行的讀)。
然後通過創建“s”字符串和for循環來一個一個的處理文件列表的內容,之所以要用字符串是因為通配符隻支持處理字符串!且通配符處理後的返回值為列表。
至於通配符規則,有點長也有點多,網上不少,可自行百度,我這裡隻提供思路。通配符匹配想要的數據(我這裡提取瞭ip地址,mac地址,所屬vlan,在哪個接口下),然後分別用不同的列表承接這些值用於方便打印。
需要註意的是,這裡的列表不需要加索引,加瞭會報錯,我也是搞瞭半天,因為這個列表是在for循環中的,每一次循環都相當於重新賦值創建,所以不存在說列表會增長,直接打印全部即可(可在循環外建列表,在循環內通過append方法增加列表長度)。
另一個需要註意的是,因為是列表,打印出來會帶著“[”]”,就很煩,不是我想要的命令那種一體化的,所以在這裡我又查找到瞭join方法,屬於列表常用方法,就是新建字符串(我特意看瞭下類型,下面有圖說明),讓字符串賦值:列表,並改變列表的分隔符(默認是單引號加逗號)為join前面單引號內的參數(可以為空None)。
我去,突然想到我前面最後一句打印的其實不是列表而是字符串,這樣的話直接打印完整的一串毫無問題,前面的疑問解決,還是多總結的好啊,能發現不足,完善自己!
Join方法:
(請忽略那幾個報錯,是因為最後的括號是中文輸入法的括號不識別報的錯)
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- python 批量重命名移動文件
- Python如何實現逐行讀取文本文件
- 十個Python自動化常用操作,即拿即用
- Python文件處理、os模塊、glob模塊
- python面試題之read、readline和readlines的區別詳解