任务: 我得到一份暑期工作的公司有一个不断扩大的测试数据库,其中包含越来越多的每个项目的子文件夹,其中包括从 .jpeg 文件到我感兴趣的 .xlsx 的所有内容。就像我一样有点习惯了之前的 Python,我决定尝试一下这个任务。我想搜索将“测试电子表格”作为其标题一部分的 exceldocuments(例如“测试电子表格模型 259”)。我感兴趣的所有文档都是以相同的方式构建的(重量总是“A3”等),看起来有点像这样:
Model: 259
Lenght: meters 27
Weight: kg 2500
Speed: m/s 25
我希望完成程序的用户能够使用我的脚本将不同测试的结果相互比较。这意味着脚本必须查看是否存在同时满足两个条件的 x 值:
inputlength = x*length of model 259
inputweight = x*weight of model 259
程序应该循环遍历主文件夹中的所有文件。如果模型存在这样的 X,我希望程序将其返回到拟合模型列表。x 值将是一个变量,每个模型都不同。
结果,我想要一个适合输入的所有文件的列表,它们的比例(x 值)以及可能的文件链接。例如:
Model scale Link
ModelA 21.1 link_to_fileA
ModelB 0.78 link_to_fileB
脚本 到目前为止,我尝试开始工作的脚本如下,但如果您对如何处理任务有其他建议,我会很乐意接受。不要害怕问我是否没有很好地解释任务。XLRD 已经安装,我使用 Eclipse 作为我的 IDE。我现在一直试图让它以多种方式工作,所以我的大部分脚本纯粹是为了测试。
编辑:
#-*- coding: utf-8 -*-
#Accepts norwegian letters
import xlrd, os, fnmatch
folder = 'C:\eclipse\TST-folder'
def excelfiles(pattern):
file_list = []
for root, dirs, files in os.walk(start_dir):
for filename in files:
if fnmatch.fnmatch(filename.lower(), pattern):
if filename.endswith(".xls") or filename.endswith(".xlsx") or filename.endswith(".xlsm"):
file_list.append(os.path.join(root, filename))
return file_list
file_list = excelfiles('*tst*') # only accept docs hwom title includes tst
print excelfiles()
为什么我在返回值后打印 excelfiles() 时只得到一个结果,但是当我将 "return os.path.join(filename)" 与 "print os.path.join(filename)" 交换时,它显示所有 . .xls 文件?这是否意味着不会传递 excelfiles-function 的结果?在评论中回答
''' Inputvals '''
inputweight = int(raw_input('legg inn vekt')) #inputbox for weight
inputlength = int(raw_input('legg inn lengd')) #inputbox for lenght
inputspeed = int(raw_input('legg inn hastighet')) #inputbox for speed
'''Location of each val from the excel spreadsheet'''
def locate_vals():
val_dict = {}
for filename in file_list:
wb = xlrd.open_workbook(os.path.join(start_dir, filename))
sheet = wb.sheet_by_index(0)
weightvalue = sheet.cell_value(1, 1)
lenghtvalue = sheet.cell_value(1, 1)
speedvalue = sheet.cell_value(1, 1)
val_dict[filename] = [weightvalue, lenghtvalue, speedvalue]
return val_dict
val_dict = locate_vals()
print locate_vals()
count = 0
关于如何从 excelfiles-function 找到的每个文档中读取的任何想法?“funcdox”似乎不起作用。当我插入打印测试时,例如在 weightvalue = sheet.cell(3,3).value 函数之后打印 weightvalue,我根本没有得到任何反馈。没有提到的打印测试的错误消息:编辑到上面的脚本,它创建了一个不同值的列表 + 删除错误消息的微小更改
脚本运行良好,直到这一点
对下一部分做了一些小改动。它应该通过将电子表格中的值乘以常数 ( x1 ) 来缩放它。然后我希望用户能够定义另一个输入值,这反过来又定义了另一个常量(x2)以使电子表格值适合。最终,将比较这些常数以找出哪些模型实际上适合测试。
'''Calculates vals from excel from the given dimensions'''
def dimension(): # Maybe exchange exec-statement with the function itself.
if count == 0:
if inputweight != 0:
exec scale_weight()
elif inputlenght != 0:
exec scale_lenght()
elif inputspeed != 0:
exec scale_speed()
def scale_weight(x1, x2): # Repeat for each value.
for weightvalue in locate_vals():
if count == 0:
x1 * weightvalue == inputweight
count += 1
exec criteria2
return weightvalue, x1
elif count == 2:
inputweight2 = int(raw_input('Insert weight')) #inputbox for weight
x2 * weightvalue == inputweight2
return weightvalue, x2
x1 和 x2 是我想用这个函数找到的,所以我希望它们完全“免费”。有什么方法可以测试这个函数而不必插入 x1 和 x2 的值?
def scale_lenght(): # Almost identical to scale_weight
return
def scale_speed(): # Almost identical to scale_weight
return
def criteria2(weight, lenght, speed):
if count == 1:
k2 = raw_input('Criteria two, write weight, length or speed.')
if k2 == weight:
count += 1
exec scale_weight
elif k2 == lenght:
count += 1
exec scale_lenght
elif k2 == speed:
count += 1
exec scale_speed
else:
return
你有什么更简单的方法来处理这个问题吗?(希望我能够解释得足够好。到目前为止我编写代码的方式非常混乱,但由于我没有那么有经验,所以我只需要制作它首先工作,然后如果我有时间就清理它。
由于可能没有一个值完全适合两个 x 常数,我想我会使用 approx_Equal 来处理它:
def approx_Equal(x1, x2, tolerance=int(raw_input('Insert tolerance for scaling difference')),err_msg='Unacceptable tolerance', verbose = True ): # Gives the approximation for how close the two values of x must be for
if x1 == x2:
x = x1+ (x2-x1)/2
return x
最后,我想要一张所有使用的变量的图表 + 每个文档的链接到文件和名称。
不知道我将如何做到这一点,因此非常感谢任何提示。
谢谢!