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

2019-08-12  本文已影响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 正则表达式入门

上一篇下一篇

猜你喜欢

热点阅读