Python:檔案批量建立、讀寫、複製、內容修改和重新命名
阿新 • • 發佈:2018-11-05
需求:一個郵件檔案對應一個CSV檔案,對大量的郵件檔案重新命名,然後把此檔案移動到對應的CSV檔案目錄下,檢查CSV檔案中郵件名稱內容與格式的正確性,不正確的做出修改,正確的保留。資料夾中最後是一個(視訊、郵件等)檔案對應一個CSV檔案。
-
1.建立並寫入CSV檔案
- os.path.join(path,file):連線兩個或多個路徑。
- os.listdir(path):返回指定路徑下的檔案的名字或者資料夾的名字的列表。
filelist=os.listdir(path) #遍歷當前資料夾下的檔案 for file in filelist:
-
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))