二椎麦、文件處理

  1. 文件讀寫
    文件讀寫部分,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()
    
  2. 常見文件讀寫函數(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")
      
  3. 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)
        
  4. 文件查找

    • 使用字符串匹配
      [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]*')
            
    • 也可以直接使用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)
      
  5. 使用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')
      
  6. 通過計(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()
    
  7. 壓縮包管理

    • 使用tarfile創(chuàng)建與讀取tar包
      讀取tar文件
      with tarfile.open('mess.tar') as inf:
            for mem in inf.getmembers():
                print mem
      
      創(chuàng)建tar文件
      with tarfile.open("mess2.tar", mode='w') as outf:
          outf.add('b2.c')
      
      tarfile對(duì)象常用方法
      • getnames()獲取tar包的文件列表
      • extract()提取單個(gè)文件
      • extractall()提取所有文件
    • 使用tarfile創(chuàng)建壓縮包時(shí),只需在mode參數(shù)指定壓縮方式
      `tarfile.open('test.tar', mode='w:bz2')
  8. 數(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}
        
    • 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}
      
  9. 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')
        
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欲逃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子饼暑,更是在濱河造成了極大的恐慌稳析,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弓叛,死亡現(xiàn)場(chǎng)離奇詭異彰居,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)撰筷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門陈惰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人毕籽,你說我怎么就攤上這事抬闯。” “怎么了影钉?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵画髓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我平委,道長(zhǎng)奈虾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任廉赔,我火速辦了婚禮肉微,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜡塌。我一直安慰自己碉纳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布馏艾。 她就那樣靜靜地躺著劳曹,像睡著了一般奴愉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铁孵,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天锭硼,我揣著相機(jī)與錄音,去河邊找鬼蜕劝。 笑死檀头,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的岖沛。 我是一名探鬼主播暑始,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼婴削!你這毒婦竟也來(lái)了廊镜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤馆蠕,失蹤者是張志新(化名)和其女友劉穎期升,沒想到半個(gè)月后惊奇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體互躬,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年颂郎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吼渡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乓序,死狀恐怖寺酪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情替劈,我是刑警寧澤寄雀,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站陨献,受9級(jí)特大地震影響盒犹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眨业,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一急膀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧龄捡,春花似錦卓嫂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)行瑞。三九已至,卻和暖如春餐禁,著一層夾襖步出監(jiān)牢的瞬間蘑辑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工坠宴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洋魂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓喜鼓,卻偏偏與公主長(zhǎng)得像副砍,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庄岖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.文件路徑1.1 不同系統(tǒng)環(huán)境下的路徑1.2 當(dāng)前工作目錄1.3 絕對(duì)路徑和相對(duì)路徑1.4 新建文件夾—— os...
    developerChenxi閱讀 956評(píng)論 0 2
  • junk是一個(gè)內(nèi)含3個(gè)數(shù)組元素的數(shù)組豁翎,每個(gè)元素內(nèi)含4個(gè)int類型值的數(shù)組∮绶蓿可以這樣聲明函數(shù)的形參
    智障猿閱讀 191評(píng)論 0 0
  • 因著你心剥,我的目光從擁擠的都市, 轉(zhuǎn)向那廣闊而神秘的穹宇背桐; 因著你优烧,我始終擁有童年的天真甜蜜, 沉迷在你萬(wàn)花筒般的魔...
    江南煙雨閱讀 270評(píng)論 2 5
  • 文/晴天過后上一章 目錄 次日,天氣終于放晴了弊仪,黎志軒晨練完熙卡,窩在家中繼續(xù)看傅人的《西游殤》,奶奶...
    晴天過后閱讀 815評(píng)論 4 22
  • 茅盾在評(píng)價(jià)水滸人物描寫時(shí)說“這就好比一人遠(yuǎn)遠(yuǎn)而來(lái)励饵,最初我們只看到他穿的是長(zhǎng)衣或短褂驳癌,然后又看清了他是肥是瘦,然...
    袁秭東閱讀 732評(píng)論 0 0