您的位置:首页 > 编程语言 > Python开发

Operation on Excel by Python

2015-12-21 08:50 691 查看
The whole integrated program just below:

#-*-coding:utf-8-*-

'''
Create on 2015/11/16 9:05:59
@author: Chen Yu in RockChip Internship
'''

import os
import sys
import re
import string
import math
import win32api
import win32process
import win32event
import xlrd
import xlwt
from xlutils.copy import copy
from subprocess import Popen,PIPE

# processing folder path
dirGood = r"E:\ErrorConcealment\Sequence\Sequence_Bat_Good"
dirCopy = r"E:\ErrorConcealment\Sequence\Sequence_Bat"
dirFirstBatch = r"E:\ErrorConcealment\Sequence\Sequence_Bat\SmoothFile"

global columnExcel
columnExcel = 0

def MyGetFileList(dir, filelist):
if os.path.isdir(dir):
for s in os.listdir(dir):
if re.match(r"([\s\S]*)\.yuv", s):
filelist.append(s)
return filelist

def CalculateForTwoFolder(fileList1, fileList2, dir1, dir2, directive, workbook):
for f1 in fileList1:
for f2 in fileList2:
if f1 == f2:
if directive == 1:
CalculateSSIMForTwoYUVs(f1, f2, dir1, dir2, workbook)
elif directive == 0:
CalculatePSNRForTwoYUVs(f1, f2, dir1, dir2, workbook)
else:
print "---------------------------Sorry, Ur directive is wrong------------------------------\n"
print "---------------------------0: Count PSNR for two YUV files---------------------------\n"
print "---------------------------1: Count SSIM for two YUV files---------------------------\n"

def CalculateSSIMForTwoYUVs(f1, f2, dir1, dir2, newWb):
d1 = dir1 + '\\' + f1
d2 = dir2 + '\\' + f2
result = re.findall("([\s\S]*)\_(\d+)x(\d+)\_([\s\S]*)",d1)
storagePath = re.findall("([\s\S]*)\.yuv", d2)
global columnExcel
rowExcel = 0
sheetName = newWb.get_sheet(1)
ssim = 0
ssimList = []
AvaregeSsim = 0
AverageSsimNum = 0
frameNum = 0
for line in result:
width = string.atoi(line[1])
height = string.atoi(line[2])
chunkSize = (width * height * 3) >> 1
Area = width * height
frame0 = [range(height) for i in range(width)]
frame1 = [range(height) for i in range(width)]
if (os.path.isfile(d1) and os.path.isfile(d2)):
file1Object = open(d1, 'rb')
file2Object = open(d2, 'rb')
print d1
print d2
sheetName.write(rowExcel, columnExcel, d1)
rowExcel += 1
sheetName.write(rowExcel, columnExcel, d2)
rowExcel += 1
SumOfDev = 0
stdDev = 0
while True:
chunk0 = file1Object.read(chunkSize)
chunk1 = file2Object.read(chunkSize)
if not chunk0:
break
if not chunk1:
break
l0 = list(chunk0)
l1 = list(chunk1)
for i in range (Area):
if i:
ck0 = ord(l0[i])
ck1 = ord(l1[i])
frame0[i % width][i / width] = ck0
frame1[i % width][i / width] = ck1
ssim = Ssim(frame0, frame1, width, height)
if ssim < 1:
AvaregeSsim += ssim
ssimList.append(ssim)
AverageSsimNum += 1
sheetName.write(rowExcel, columnExcel, ssim)
newWb.save("PSNR&&SSIM.xls")
rowExcel += 1
print ("------------------------The %-3d------------------- frame's SSIM is | %f \n" % (frameNum, ssim))
frameNum += 1
if AverageSsimNum != 0:
AvaregeSsim /= AverageSsimNum
for itemSSIM in ssimList:
SumOfDev += ((itemSSIM - AvaregeSsim) ** 2)
stdDev = math.sqrt(SumOfDev*1.0/AverageSsimNum)
sheetName.write(rowExcel, columnExcel, AverageSsimNum)
newWb.save("PSNR&&SSIM.xls")
rowExcel += 1
sheetName.write(rowExcel, columnExcel, stdDev)
newWb.save("PSNR&&SSIM.xls")
rowExcel += 1
newWb.save("PSNR&&SSIM.xls")
print ("\n------------------------The Average SSIM for %-3d frames is %f------------------- \n" % (AverageSsimNum, AvaregeSsim))
print ("\n------------------------The Standard Deviation is %f------------------- \n\n\n" % (stdDev))
else:
print ("\n---------------------------------------There is NO error in this YUV-------------------------\n\n\n")
newWb.save("PSNR&&SSIM.xls")
columnExcel += 1
file1Object.close()
file2Object.close()

def CalculatePSNRForTwoYUVs(f1, f2, dir1, dir2, newWb):
d1 = dir1 + '\\' + f1
d2 = dir2 + '\\' + f2
global columnExcel
rowExcel = 0
sheetName = newWb.get_sheet(0)
result = re.findall("([\s\S]*)\_(\d+)x(\d+)\_([\s\S]*)",d1)
storagePath = re.findall("([\s\S]*)\.yuv", d2)
for line in result:
width = string.atoi(line[1])
height = string.atoi(line[2])
Area = width * height
chunkSize = (Area * 3) >> 1  # 420
frameNum = 0
MSE = 0
MAXDivMSE = 0
PSNR = 0
AveragePSNR = 0
CountAveragePSNRFrame = 0
ListPSNR = []
if (os.path.isfile(d1) and os.path.isfile(d2)):
file1Object = open(d1, 'rb')
file2Object = open(d2, 'rb')
print d1
print d2
sheetName.write(rowExcel, columnExcel, d1)
rowExcel += 1
sheetName.write(rowExcel, columnExcel, d2)
rowExcel += 1
while True:
chunk1 = file1Object.read(chunkSize)
chunk2 = file2Object.read(chunkSize)
if not chunk1:
break
if not chunk2:
break
sumOfMSE = 0
l1 = list(chunk1)
l2 = list(chunk2)
for i in range (Area):
ck1 = ord(l1[i])
ck2 = ord(l2[i])
sumOfMSE += (abs(ck1 - ck2)**2)
MSE = math.sqrt(sumOfMSE*1.0/Area)
if MSE != 0:
MAXDivMSE = 255 / MSE
else:
MAXDivMSE = 0
if MAXDivMSE > 0:
PSNR = 20 * math.log10(MAXDivMSE)
else:
PSNR = 0
print ("------------------------The %-3d------------------- frame's PSNR is | %f \n" % (frameNum, PSNR))
sheetName.write(rowExcel, columnExcel, PSNR)
newWb.save("PSNR&&SSIM.xls")
rowExcel += 1
frameNum += 1
if PSNR != 0:
CountAveragePSNRFrame += 1
AveragePSNR += PSNR
ListPSNR.append(PSNR)
AveragePSNR = 0 if CountAveragePSNRFrame == 0 else (AveragePSNR*1.0/CountAveragePSNRFrame)
SumOfDev = 0
stdDev = 0
if CountAveragePSNRFrame != 0:
for itemPSNR in ListPSNR:
SumOfDev += ((itemPSNR - AveragePSNR) ** 2)
stdDev = math.sqrt(SumOfDev*1.0/CountAveragePSNRFrame)
print ("------------------------The Average PSNR is %f-------------------\n" % (AveragePSNR))
print("----------------------The Standard Deviation is %f----------------------\n" % (stdDev))
sheetName.write(rowExcel, columnExcel, AveragePSNR)
newWb.save("PSNR&&SSIM.xls")
rowExcel += 1
sheetName.write(rowExcel, columnExcel, stdDev)
newWb.save("PSNR&&SSIM.xls")
rowExcel += 1
file1Object.close()
file2Object.close()
newWb.save("PSNR&&SSIM.xls")
print "--------------------------------------------------------------------\n\n"
columnExcel += 1

def BatchCalculate(directive):
if(os.path.isfile("PSNR&&SSIM.xls") == False):
DataFile = xlwt.Workbook()
NewSheetForPSNR = DataFile.add_sheet("PSNR", cell_overwrite_ok = True)
NewSheetForSSIM = DataFile.add_sheet("SSIM", cell_overwrite_ok = True)
DataFile.save("PSNR&&SSIM.xls")
book = xlrd.open_workbook('PSNR&&SSIM.xls', formatting_info = True)
newWb = copy(book)

FileListOfGood = MyGetFileList(dirGood, [])
#   FileListOfCopy = MyGetFileList(dirCopy, [])
FileListOfFirstBatch = MyGetFileList(dirFirstBatch, [])
#   FileListOfSecondBatch = MyGetFileList(dirSecondBatch, [])

#   CalculateForTwoFolder(FileListOfGood, FileListOfCopy, dirGood, dirCopy, directive)
CalculateForTwoFolder(FileListOfGood, FileListOfFirstBatch, dirGood, dirFirstBatch, directive, newWb)
#   CalculateForTwoFolder(FileListOfGood, FileListOfSecondBatch, dirGood, dirSecondBatch, directive)

def SsimEnd1(s1, s2, ss, s12):
ssim_c1 = (int)(.01*.01*255*255*64 + .5)
ssim_c2 = (int)(.03*.03*255*255*64*63 + .5)
vars = ss*64 - s1*s1 - s2*s2
covar = s12*64 - s1*s2
return (float)(2*s1*s2 + ssim_c1) * (float)(2*covar + ssim_c2)\
/ ((float)(s1*s1 + s2*s2 + ssim_c1) * (float)(vars + ssim_c2));

# Here I make the decision that for a list list[x][y], x stands column(like a picture)
def SsimEnd4(l1, l2, width):
ssim = 0
for i in range(width):
ssim += SsimEnd1(l1[i][0] + l1[i + 1][0] + l2[i][0] + l2[i + 1][0],
l1[i][1] + l1[i + 1][1] + l2[i][1] + l2[i + 1][1],
l1[i][2] + l1[i + 1][2] + l2[i][2] + l2[i + 1][2],
l1[i][3] + l1[i + 1][3] + l2[i][3] + l2[i + 1][3])
return ssim

# Size is 32 for pix1 and pix2, and sums is [2][4]
def ssim_4x4x2_core( pix1, pix2, sums):
for z in range(2):
s1 = 0
s2 = 0
ss = 0
s12 = 0
for x in range(16):
a = pix1[x + (z << 4)]
b = pix2[x + (z << 4)]
s1  += a
s2  += b
ss  += a*a
ss  += b*b
s12 += a*b
sums[z][0] = s1
sums[z][1] = s2
sums[z][2] = ss
sums[z][3] = s12

# Calculate Two Frame's SSIM
def Ssim(pixel0, pixel1, width, height):
Sums0 = [range(4) for i in range((width >> 2) + 3)] # width x 4( column x row = width x height )
Sums1 = [range(4) for i in range((width >> 2) + 3)]
width = (width >> 2)
height = (height >> 2)
z = 0
ssim = 0.0
pix0Ck = range(32)
pix1Ck = range(32)
sums0 = [range(4) for i in range(2)]
sums1 = [range(4) for i in range(2)]

for y in range(1,height):
while(z <= y):
for x in range(0, width, 2):
for i in range(4):
for j in range(8):
if j >= 4:
pix0Ck[(i << 2) + j + 12] = pixel0[(x << 2) + j][(z << 2) + i]
pix1Ck[(i << 2) + j + 12] = pixel1[(x << 2) + j][(z << 2) + i]
else:
pix0Ck[(i << 2) + j] = pixel0[(x << 2) + j][(z << 2) + i]
pix1Ck[(i << 2) + j] = pixel1[(x << 2) + j][(z << 2) + i]
if z % 2 == 0:
ssim_4x4x2_core(pix0Ck, pix1Ck, sums0)
Sums0[x] = sums0[0]
Sums0[x + 1] = sums0[1]
else:
ssim_4x4x2_core(pix0Ck, pix1Ck, sums1)
Sums1[x] = sums1[0]
Sums1[x + 1] = sums1[1]
z += 1
for x in range(0, width - 1, 4):
ssim += SsimEnd4(Sums0[x : x + 5], Sums1[x : x + 5], min(4, width - 1 - x))

return 0 if (width - 1 == 0) or (height - 1 == 0) else ssim * 1.0/((width - 1.0)*(height - 1.0))

if __name__ == "__main__":
BatchCalculate(0)
BatchCalculate(1)


Reference:

Ref 1:

http://www.crifan.com/python_append_new_data_into_existing_excel_xls_file/

http://blog.chinaunix.net/uid-21222282-id-3420444.html

http://www.xuebuyuan.com/1436412.html

http://www.jb51.net/article/60510.htm

http://www.tuicool.com/articles/BFFbUvu

Ref 2:

http://blog.csdn.net/a491057947/article/details/47614263

http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html

http://huaxia524151.iteye.com/blog/1173828

http://blog.csdn.net/hongqiang200/article/details/38171517

http://blog.csdn.net/five3/article/details/7034826

Ref 3:

http://www.cnblogs.com/snake-hand/p/3153158.html

http://download.csdn.net/download/u013634684/9074603

http://zhaojing366.blog.163.com/blog/static/952384020124311071392/

http://biotopiblog.sinaapp.com/2014/06/python%E8%AF%BB%E5%86%99excel%E5%A6%82%E4%BD%95%E4%BF%9D%E7%95%99%E5%8E%9F%E6%9C%89%E6%A0%BC%E5%BC%8F/

http://blog.csdn.net/mr__fang/article/details/7089581

Ref 4:

Global Variable definition:

global a
a = 3

def Fuc():
global a
print a
a = a + 1
if __name__ == "__main__":
  global a
for i in range(10):
Fuc()print 'hello'
print a
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息