1. 程式人生 > >Python:檔案批量建立、讀寫、複製、內容修改和重新命名

Python:檔案批量建立、讀寫、複製、內容修改和重新命名

需求:一個郵件檔案對應一個CSV檔案,對大量的郵件檔案重新命名,然後把此檔案移動到對應的CSV檔案目錄下,檢查CSV檔案中郵件名稱內容與格式的正確性,不正確的做出修改,正確的保留。資料夾中最後是一個(視訊、郵件等)檔案對應一個CSV檔案。

  • 1.建立並寫入CSV檔案

    • os.path.join(path,file):連線兩個或多個路徑。
    • os.listdir(path):返回指定路徑下的檔案的名字或者資料夾的名字的列表。
    filelist=os.listdir(path)
    #遍歷當前資料夾下的檔案
    for file in filelist:
    i+=1 filename=os.path.join(path,file) csvFile=os.path.join(filename,file+'資料表'+'%04d'%i+'.csv') #csv檔案存在時直接開啟,不存在,則建立 with open(csvFile,'wb') as csvFb: #呼叫writer方法,寫入檔案物件 csv_write = csv.writer(csvFb) csv_write .writerow(["原始檔案\t提取型別\t提取內容\t結構"]) csv_content=[file+'圖片檔案'+'%04d'%i+'\t'+'場景'
    +'\t'+file+'\t'+'非結構化'] #內容寫入csv檔案 csv_write .writerow(csv_content)
  • 2.複製檔案到另一資料夾並重命名

    • endswith():判斷字串是否以指定字尾結尾,是則返回True,否則返回False。可設定起始位置 。
    • split():根據指定分隔符對字串進行切片分片,返回分割後的字串列表。可設定第二個num引數,表示僅分割num個子字串。
      語法:str.split(str="", num=string.count(str)).
      str:分隔符,包括空格、換行(\n)、製表符(\t)等。
      num:分割次數。
    • find():檢查字串是否包含子字串str,如果指定beg(開始)和end(結束)範圍,則檢查是否包含在指定範圍內,如果包含子字串,則返回開始的索引值;否則返回-1.
    • shutil.copy(src,dest):檔案複製,將src檔案複製到dest資料夾中,兩個引數都是字串格式,如果dest是一個檔名稱,會被用來當做複製後的檔名稱,即等於複製+重新命名。
      例如:
    for filename in filedirList:
          if filename.endswith('eml'):
              mainfilename=filename.split('.')[-3]
              
              #很據mainfilename找對應的csv檔案
              csvlist=os.listdir(csvpath)
              for csvfile in csvlist:
                  if csvfile.endswith('csv'):
                      if -1 != csvfile.find(mainfilename):
                          #csvfilepath=os.path.join(path,csvfile)
                          #.txt.eml檔案複製到對應的csv檔案下,重新命名為mainfilename.eml
                          srcfile=os.path.join(filedir,filename)
                          dstfile=os.path.join(csvpath, mainfilename+".eml")
                          shutil.copy(srcfile, dstfile)
    
  • 3.讀檔案
    磁碟中已存在的檔案不能任意修改,因此只能先把磁碟中檔案一次性讀取完,再根據要求修改,然後再全部寫入磁碟。

    • readlines():用於讀取所有行(直到結束符 EOF)並返回列表。逐行讀取檔案內容。
    • readline():用於從檔案讀取整行,包括 “\n” 字元。只讀取一行。
    csvfilepath=os.path.join(csvpath, csvfile)
          #讀csv檔案
           try:
               FileObj = open(csvfilepath, 'r')
               TextLines = FileObj.readlines()
               FileObj.close()
           except IOError as err:
               print ("開啟檔案%s失敗:%s" % (csvfile, err))
    
  • 4.寫檔案

    #判斷行數
    if 1>len(TextLines):
        break
     #行內各項以\t分割
     field_list = TextLines[1].split('\t')
     if 1>len(field_list):
         break
     field_list[0] = mainfilename+".eml"
     #修改第二行內容
     szTemp = ""
     for field in field_list:
         szTemp += field+"\t"
     szTemp = szTemp[:len(szTemp)-1]
     TextLines[1] = szTemp
    
     #寫入檔案
     try:
         FileObj = open(csvfilepath, 'w')
         
         for text in TextLines:
             TextLines = FileObj.write(text)
         FileObj.close()
     except IOError as err:
         print ("寫入檔案%s失敗:%s" % (csvfilepath, err))