版权声明:转载请标明出处 https://blog.csdn.net/w1418899532/article/details/83056356
需求:一个邮件文件对应一个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))