-
文件讀寫
文件讀寫部分,python有一個(gè)基本的內(nèi)置文件讀取函數(shù)open
open(filename, mode)
其中mode可以是r材彪、w观挎、x、a段化,模式a表示打開文件會(huì)在文件末尾追加內(nèi)容嘁捷,使用w模式打開文件,如果文件存在會(huì)將文件清空显熏,再寫入雄嚣,如果使用x模式打開文件,如果文件存在會(huì)拋出異常喘蟆。open函數(shù)返回文件對(duì)象缓升,當(dāng)操作完成時(shí),使用close方法關(guān)閉文件流蕴轨,另一個(gè)優(yōu)美的做法是使用上下文管理器with open("test.txt") as f: print f.read()
-
常見文件讀寫函數(shù)
- read([size])讀取指定長(zhǎng)度文件內(nèi)容港谊,如果size為空,讀取所有
- readline()讀取文件一行
- readlines()讀取文件所有內(nèi)容到一個(gè)列表
- seek(offset[,whence])函數(shù)更改文件指針的位置橙弱,whence表示從何處偏移歧寺,默認(rèn)值是0燥狰,表示從文件頭開始
- write(str)將str寫入文件
- writelines(strlist)將字符串列表寫入文件
- 讀取文件內(nèi)容常用迭代(python文件對(duì)象是可迭代的)
with open("test.txt") as f: for line in f: print line
- 示例:將文件中所有單詞首字母變大寫
with open("program_log.txt") as inf, open("program.txt", 'w') as outf: for line in inf: outf.write(" ".join([word.capitalize() for word in line.split()])) outf.write("\n")
-
os.path中的路徑與文件管理函數(shù)
- os模塊
- os.listdir(dir)列出dir下所有的目錄與文件
- os.getcwd()獲取當(dāng)前工作目錄
- os.chdir(dir)改變工作目錄
- os.rmdir('dir')刪除空目錄
- os.mkdir(dir)創(chuàng)建目錄
- rename()重命名目錄或文件
- os.chmod(file, mod)更改文件權(quán)限
- os.access(file, auth)判斷用戶對(duì)該文件是否有指定權(quán)限
其中auth可以取os.R_OK,os.W_OK,os.X_OK
- 拆分
- os.path.split(path)將path拆分為目錄與文件名稱,并返回二元組
- os.path.dirname(path)獲取path中的目錄名稱
- os.path.filename(path)獲取path中的文件名稱
- os.path.splitext(path)獲取path中文件擴(kuò)展名和去處擴(kuò)展名后的二元組
- 構(gòu)建
- os.path.join(dir...)接收可變參數(shù)斜筐,組合為完整路徑
- os.path.abspath(dir)得到某文件絕對(duì)路徑
- os.path.expanduser(path)展開用戶目錄
os.path.expanduser('~/test/txt')
- 獲取文件屬性
- os.path.getsize(file)獲取文件大小
- os.path.{getctime(),getatime(),getmtime()}
- 判斷文件類型
- os.path.exists(file)是否存在
- os.path.isfile(file)是否是文件
- os.path.isdir(file)是否是目錄
- os.path.islink()
- os.path.ismount()
- 示例
- 獲取用戶目錄下所有的文件列表
[ name for name in os.listdir(os.path.expanduser('~')) if os.path.isfile(name)]
- 獲取用戶目錄下所有的目錄列表
[ name for name in os.listdir(os.path.expanduser('~')) if os.path.isdir(name)]
- 獲取用戶目錄下目錄到絕對(duì)路徑之間的字典
{name: os.path.abspath(name) for name in os.listdir(os.path.expanduser('~')) if os.path.isdir(name)}
- 獲取最常用的10條命令
with open(os.path.expanduser('~/.bash_history')) as inf: for line in inf: cmd = line.strip().split() if cmd[0] == 'sudo': c[cmd[1]]+=1 else: c[cmd[0]]+=1 c.most_common(10)
- 獲取用戶目錄下所有的文件列表
- os模塊
-
文件查找
- 使用字符串匹配
[item for item in os.listdir('.') if item.endswith('txt')] [item for item in os.listdir('.') if item.startswith('pro')]
- 使用fnmatch
- fnmatch是一個(gè)文件名稱匹配庫(kù)龙致,可以理解為簡(jiǎn)單的正則表達(dá)式匹配,支持的正則符號(hào)有
- *匹配任意數(shù)量任意字符
- 顷链?匹配單個(gè)任意字符
- [seq]匹配seq中的字符
- [!seq]不匹配seq中的字符
- 常用函數(shù)
- fnmatch(file,pattern)判斷文件是否符合特定模式
- fnmatchcase同上目代,忽略大小寫
- filter(names,pat)返回輸入列表中符合pat的元素組成的列表
- 示例
- 找到當(dāng)前目錄所有jpg文件
[item for item in os.listdir('.') if fnmatch.fnmatch(item, '*.jpg')]
- 返回所有a-c開頭的文件
[item for item in os.listdir('.') if fnmatch.fnmatch('[a-c]*')]
- 返回不是a-c開頭的文件
fnmatch.filter(os.listdir('.'), '[!a-c]*')
- 找到當(dāng)前目錄所有jpg文件
- fnmatch是一個(gè)文件名稱匹配庫(kù)龙致,可以理解為簡(jiǎn)單的正則表達(dá)式匹配,支持的正則符號(hào)有
- 也可以直接使用glob查找文件,相當(dāng)于os.listdir與fnmatch
glob.glob('[a-c]*.jpg')
- 使用os.walk遍歷目錄樹
os.walk(top, topdown=True, onerror=None, followlinks=False)walk函數(shù)遞歸返回三元組(dirpath, dirnames, filenames),dirpath保存當(dāng)前目錄蕴潦,dirnames返回目錄列表像啼,filenames返回文件列表俘闯,如果想要忽略掉一個(gè)子目錄潭苞,可以直接從dirnames中刪除該目錄
尋找某目錄下某類型文件通用代碼import os import fnmatch # 判斷某文件是否符合某模式 def is_file_match(filename, partterns): for parttern in partterns: if fnmatch.fnmatch(filename, parttern): return True else: return False # 查找root目錄下除exculde_dir中符合parttern的文件 def find_specific_file(root, partterns=['*'], exclude_dir=[]): for rootdir, dirnames, filenames in os.walk(root): for filename in filenames: if is_file_match(filename, partterns): yield os.path.join(rootdir, filename) for dirname in dirnames: if dirname in exclude_dir: dirnames.remove(dirname)
- 使用字符串匹配
-
使用shutil
- 復(fù)制文件或目錄
import shutil shutil.copy('a.txt', 'b.txt') shutil.copytree('dir1', 'dir2')
- 移動(dòng)與重命名
shutil.move('a.txt', 'b.txt') shutil.move('a.txt', 'dir') shutil.move('dir1', 'dir2')
- 刪除文件或目錄
shutil.rmtree('dir')
- 復(fù)制文件或目錄
-
通過計(jì)算md5校驗(yàn)碼檢查文件是否是同一個(gè)
import hashlib d = hashlib.md5() with open('backup.py') as f: for line in f: d.update(line) d.hexdigest()
查找某目錄下相同文件
from __future__ import print_function import hashlib import fnmatch import os import sys # 每次從文件中讀取8192個(gè)字節(jié) CHUNK_SIZE = 8192 # 判斷文件是否符合某模式 def is_file_match(filename, partterns): for parttern in partterns: if fnmatch.fnmatch(filename, parttern): return True else: return False # 查找指定目錄下指定文件 def find_specific_file(root, partterns=['*'], exclude_dir=[]): for rootdir, dirnames, filenames in os.walk(root): for filename in filenames: if is_file_match(filename, partterns): yield os.path.join(rootdir, filename) for dirname in dirnames: if dirname in exclude_dir: dirnames.remove(dirname) # 循環(huán)獲取文件內(nèi)容 def get_chunk(filename): with open(filename) as f: while True: chunk = f.read(CHUNK_SIZE) if not chunk: break else: yield chunk # 獲取文件md5校驗(yàn)和 def get_chsum(filename): d = hashlib.md5() for chunk in get_chunk(filename): d.update(chunk) return d.hexdigest() # 執(zhí)行查找比較過程 def main(): sys.argv.append("") if not os.path.isdir(sys.argv[1]): print("{0} is not dir!".format(sys.argv[1])) exit() record = {} for item in find_specific_file(sys.argv[1]): checkres = get_chsum(item) if checkres in record: print("find duplicate file {0} vs {1}".format(record[checkres], item)) else: record[checkres] = item print("filelist:",record) if __name__ == '__main__': main()
-
壓縮包管理
- 使用tarfile創(chuàng)建與讀取tar包
讀取tar文件
創(chuàng)建tar文件with tarfile.open('mess.tar') as inf: for mem in inf.getmembers(): print mem
tarfile對(duì)象常用方法with tarfile.open("mess2.tar", mode='w') as outf: outf.add('b2.c')
- getnames()獲取tar包的文件列表
- extract()提取單個(gè)文件
- extractall()提取所有文件
- 使用tarfile創(chuàng)建壓縮包時(shí),只需在mode參數(shù)指定壓縮方式
`tarfile.open('test.tar', mode='w:bz2')
- 使用tarfile創(chuàng)建與讀取tar包
-
數(shù)據(jù)存儲(chǔ)
- 序列化與反序列化
程序運(yùn)行時(shí)真朗,所有內(nèi)容保存在內(nèi)存中此疹,有時(shí)候需要把某些變量的內(nèi)容或是運(yùn)行時(shí)信息保存下來(lái),下次程序運(yùn)行時(shí)讀取這些保存的內(nèi)容遮婶,從而可以讓程序從停止的地方繼續(xù)執(zhí)行蝗碎。把變量、對(duì)象變?yōu)橥ㄓ么鎯?chǔ)格式的過程叫序列化旗扑,從磁盤上的數(shù)據(jù)恢復(fù)出變量蹦骑、對(duì)象的過程叫反序列化。python中的序列化與反序列化使用pickle模塊或cpickle模塊臀防,其中cpickle使用c語(yǔ)言實(shí)現(xiàn)眠菇,速度上會(huì)快很多- 導(dǎo)入
try: import cPickle as pickle except ImportError: import pickle
- dump和dumps方法可以將對(duì)象轉(zhuǎn)變?yōu)榇鎯?chǔ)字節(jié)字符串,其中dumps方法袱衷,接受一個(gè)對(duì)象捎废,返回該對(duì)象的字節(jié)字符串,dump接受一個(gè)對(duì)象和一個(gè)文件句柄致燥,直接將序列化之后的內(nèi)容寫入文件登疗。
In [3]: fp = open('dict.txt','w') In [4]: test_dict = {'index_' + i: i for i in range(5)} In [7]: cPickle.dumps(test_dict) Out[7]: "(dp1\nS'index_4'\np2\nI4\nsS'index_2'\np3\nI2\nsS'index_3'\np4\nI3\nsS'index_0'\np5\nI0\nsS'index_1'\np6\nI1\ns." In [8]: cPickle.dump(test_dict, fp) In [9]: fp.close()
- load和loads方法將字節(jié)字符串反序列化為對(duì)象,load接受一個(gè)文件句柄嫌蚤,解析出文件中的對(duì)象辐益,loads接受一個(gè)字節(jié)字符串,解析出對(duì)象
In [10]: dict_ori = cPickle.load(open('dict.txt','r')) In [11]: dict_ori Out[11]: {'index_0': 0, 'index_1': 1, 'index_2': 2, 'index_3': 3, 'index_4': 4} In [15]: pickle.loads(pickle.dumps(test_dict)) Out[15]: {'index_0': 0, 'index_1': 1, 'index_2': 2, 'index_3': 3, 'index_4': 4}
- 導(dǎo)入
- json對(duì)象存儲(chǔ)與解析
使用json模塊進(jìn)行json存儲(chǔ)與解析脱吱,json模塊常用的函數(shù)有dumps荷腊,dump,load急凰,loads與pickle類比記憶女仰,但是有一些需要注意的選項(xiàng)需要看一下,ensure_ascii參數(shù)指定了怎樣表示非ascii字符猜年,默認(rèn)為\uXXX,當(dāng)設(shè)置ensure_ascii為False時(shí)疾忍,可以正常顯示乔外。skipkeys指定,當(dāng)鍵不是python基本類型時(shí)的操作一罩,如果保持默認(rèn)False杨幼,會(huì)報(bào)Typerror異常,設(shè)置為True則會(huì)跳過該鍵In [18]: test_dict Out[18]: {'index_0': 0, 'index_1': 1, 'index_2': 2, 'index_3': 3, 'index_4': 4} In [19]: json.dumps(test_dict) Out[19]: '{"index_4": 4, "index_2": 2, "index_3": 3, "index_0": 0, "index_1": 1}' In [20]: json.dump(test_dict, open('json_dump.txt', 'w')) In [21]: json.load(open('json_dump.txt')) Out[21]: {u'index_0': 0, u'index_1': 1, u'index_2': 2, u'index_3': 3, u'index_4': 4} In [22]: json.loads(json.dumps(test_dict)) Out[22]: {u'index_0': 0, u'index_1': 1, u'index_2': 2, u'index_3': 3, u'index_4': 4}
- 序列化與反序列化
-
python操作csv與office文件
- csv文件操作使用csv模塊
csv文件是具有固定格式的一類文件聂渊,每行使用固定的行分隔符差购,每個(gè)域也是用固定的域分隔符(通常是',')。- 寫入csv文件
In [6]: title = ['host', 'port'] In [8]: row_1 = ['192.168.56.101','80'] In [9]: row_2 = ['192.168.56.101','8080'] fp = open('tmp.txt', 'w') In [12]: csv_write = csv.writer(fp) In [13]: csv_write.writerow(title) In [14]: csv_write.writerows([row_1, row_2]) In [15]: fp.close()
- 讀取csv文件,使用普通文件讀取汉嗽,或使用命名元組
In [18]: fp = open('tmp.txt','r') In [19]: csv_reader = csv.reader(fp) In [20]: title = next(csv_reader) In [21]: print title ['host', 'port'] In [22]: for line in csv_reader: ...: print line ...: ['192.168.56.101', '80'] ['192.168.56.101', '8080'] In [23]: from collections import namedtuple In [24]: fp.close() In [25]: fp = open('tmp.txt', 'r') In [26]: csv_reader = csv.reader(fp) In [27]: title = next(csv_reader) In [28]: Row = namedtuple('Row', title) In [29]: for line in csv_reader: ...: row = Row(*line) ...: print row.host,row.port ...: print row ...: 192.168.56.101 80 Row(host='192.168.56.101', port='80') 192.168.56.101 8080 Row(host='192.168.56.101', port='8080')
- 寫入csv文件
- csv文件操作使用csv模塊
二椎麦、文件處理
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門陈惰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人毕籽,你說我怎么就攤上這事抬闯。” “怎么了影钉?”我有些...
- 文/不壞的土叔 我叫張陵画髓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我平委,道長(zhǎng)奈虾,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任廉赔,我火速辦了婚禮肉微,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜡塌。我一直安慰自己碉纳,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布馏艾。 她就那樣靜靜地躺著劳曹,像睡著了一般奴愉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铁孵,一...
- 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼婴削!你這毒婦竟也來(lái)了廊镜?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤馆蠕,失蹤者是張志新(化名)和其女友劉穎期升,沒想到半個(gè)月后惊奇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體互躬,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年颂郎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吼渡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
- 正文 年R本政府宣布,位于F島的核電站陨献,受9級(jí)特大地震影響盒犹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眨业,卻給世界環(huán)境...
- 文/蒙蒙 一急膀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧龄捡,春花似錦卓嫂、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)行瑞。三九已至,卻和暖如春餐禁,著一層夾襖步出監(jiān)牢的瞬間蘑辑,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓喜鼓,卻偏偏與公主長(zhǎng)得像副砍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庄岖,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 1.文件路徑1.1 不同系統(tǒng)環(huán)境下的路徑1.2 當(dāng)前工作目錄1.3 絕對(duì)路徑和相對(duì)路徑1.4 新建文件夾—— os...
- junk是一個(gè)內(nèi)含3個(gè)數(shù)組元素的數(shù)組豁翎,每個(gè)元素內(nèi)含4個(gè)int類型值的數(shù)組∮绶蓿可以這樣聲明函數(shù)的形參
- 文/晴天過后上一章 目錄 次日,天氣終于放晴了弊仪,黎志軒晨練完熙卡,窩在家中繼續(xù)看傅人的《西游殤》,奶奶...
- 茅盾在評(píng)價(jià)水滸人物描寫時(shí)說“這就好比一人遠(yuǎn)遠(yuǎn)而來(lái)励饵,最初我們只看到他穿的是長(zhǎng)衣或短褂驳癌,然后又看清了他是肥是瘦,然...