美文网首页
python脚本:表格和文本操作和re正则和zip压缩

python脚本:表格和文本操作和re正则和zip压缩

作者: 赋闲 | 来源:发表于2019-08-12 00:32 被阅读0次

    时隔一年多,再次到简书上记录点东西,之前写的几个脚本。
    工作使用是的DiVinci和MATLAB,这个有专门的教程文档,看以后有空在简书上转载。

    简单python脚本的框架

    import os
    import re
    import time
    import csv
    import sys
    import linecache
    import openpyxl
    
    try:
    #code
    except Exception as e:   #IOError
        print(e)
    

    文本操作

    注释:
    txtFile是路径,txt_file 是文本描述(打开文本的返回),txt_line 文本的一行
    
    txt_file = open(txtFile, 'r+', encoding='utf-8')
    txt_line = linecache.getline(txtFile,3)#读指定行,读取到内存里,没有写模块
    while True:
        txt_line = txt_file.readline()#通过while循环迭代来读文本
    
    txt_line[2].replace(buf1,buf2,1)#字符串2替换为1,执行一次(可选)
    #用r+打开读文本内容,修改后用w+打开再写入,这个方法很蠢,有空我再找一下其他好的方法
    txt_file= open(txtFile, 'w+')#w+打开txt
    txt_file.writelines(txt_line)#写入
    txt_file.close()#关闭
    
    txt_lines = txt_file.readlines()#readlines全部读到内存里,加快速度
    #.readlines() 自动将文件内容分析成一个个的行的列表
    #该列表可以由 Python 的 for ... in ... 结构进行处理。
    for txt_line in txt_lines :#每循环一次,文件指针自动向下移一行
    txt_file.readline()#每读一次,文件指针自动向下移一行
    
    #.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。
    #另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。
    #仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()
    #with open是支持打开大文本10G的
    with open(txtFile, 'r+', encoding='utf-8') as txt_file:#with open打开文件
    txt_lines .seek(0)#文件指针移到开头
    next(txt_file)#下一行
    readlines()读文件,无法判断是否读到末尾,
    可以用readline()读文件,直接判断末尾是否为空字符''就可以了
    

    表格操作

    f_xlsx = openpyxl.load_workbook(excelFile)#用的openpyxl库
    f_xlsx = openpyxl.Workbook()    #新建表格
    sheetNames = f_xlsx.get_sheet_names()#获取所有页的list
    sheet = f_xlsx["sheet1"]#打开sheet1页
    while i<sheet .max_row-1:#自动判断表格末尾,而不是默认的2^32
    #如果要遍历表格,还是将表格先读到list里,再遍历,这样能极大提高运行速度
    excle_line = sheet.cell(row=i,column=n).value#读,注意判断空是None不是''
    sheet.cell(row=i,column=n,value = buff)#写
    f_xlsx.save(excelFile)#保存,如果是其他名字是另存为
    f_xlsx.close()
    sheet.merge_cells(start_row=i, end_row=n-1,start_column=1, end_column=1)#单元格合并
    s_ws = s_wb.active()#获取当前使用页
    

    其他

    global n #申明使用的是全局变量
    os.chdir("D:\\user")#更换脚本的工作目录
    time.strftime('%Y_%m_%d',time.localtime(time.time()))#年月日
    time.strftime('%H:%M:%S',time.localtime(time.time()))#时分秒
    p.subprocess.Popen("cmd.exe/c"+"D:\\user\\a.bat",stdout=subprocess.PIPE,stderr=subprocess.STDOUT)#调用.bat脚本
    p.wait()#等待脚本执行完成
    os.system("a.bat")#直接通过sys执行脚本
    temp = addr[0].strip()#strip(),字符串函数,去除字符串前后的空格和Tab
    

    正则匹配

    ret = re.match(r'line :',txt_line)
    #用match要在前一个字符处加r,转义,否则会报错,search则不用
    temp=re.findall(r'(?<=(CAL_))(.+)(?=(_Val))', excle_line,re.I)
    #前向界定?<=与后向界定?=,?表示最近匹配,不贪心,re.I表示去除结果里的空格和Tab
    #前向界定和后向界定这个要加(),[]是表示[]的任一,()是全匹配,加的界定的返回值要注意类型
    因为加了界定,导致返回的是一个元祖列表temp[0][1]
    temp = re.search('line :',txt_line)
    #re找到的结果是list,List用“”或None或[]或len(list[0])==0,判空不可行,可以直接用
    if temp:#这种方式
    
    re.findall(r'_'+string+'(.+?)_', txt_line)
    前向界定和后向界定这个要加(),[]是表示[]的任一,()是全匹配,加的界定的返回值要注意类型
    re匹配里加变量,是直接用‘+temp+’隔出来就可以,也可以用'+str(temp)+',
    这个是里面的特殊字符不会被转义,若需要转义,则加'+re.escape(temp)+'
    
    

    zip 压缩
    python 压缩整个文件夹到指定路径
    python 压缩

    import zipfile
    import os
    
    def zip_files( Filepath, zip_name ):
        #filelist = os.listdir(Filepath)
        zip = zipfile.ZipFile( zip_name, 'w', zipfile.ZIP_DEFLATED)
        for root, dirs, files in os.walk(Filepath):
            fpath = root.replace(Filepath,'')#压缩包里不额外有路径
            fpath = fpath and fpath + os.sep or ''
            for file in files:
                zip.write(os.path.join(root,file),fpath+file)
                print ('compressing', file)
    
        zip.close()
        #print ('compressing finished')
    
    files = 'D:\\user\\script'#文件的位置,多个文件用“,”隔开
    zip_file = 'D:\\a.zip'#压缩包名字+路径
    zip_files(files,zip_file)
    #shutil.copytree("olddir","newdir")        olddir和newdir都只能是目录,且newdir必须不存在
    
    下面是一些经验

    try:可以加在任意处,可嵌套,try可省略
    print()会增加很多运行时间,if判断会增加运行时间,要优化if判断的次数
    re正则匹配返回的是一个lest,要加下标取值
    表格和文件可以先读到内存里,再进行操作,这样能提高速度很多
    合并框搜索匹配,只在第一行有值,下面行是None
    去除字符串里的空格和Tab可以用.strip(),replace(),re.sub()
    文本读完要将文件指针移回文件首
    re返回的是列表,List,可能会有返回为空的情况,注意加判断

    链接

    使用openpyxl excel 合并拆分单元格
    Python 正则表达式入门

    相关文章

      网友评论

          本文标题:python脚本:表格和文本操作和re正则和zip压缩

          本文链接:https://www.haomeiwen.com/subject/nirejctx.html