タスク: 私がサマージョブを獲得した会社には、.jpeg ファイルから私が興味を持っている .xlsx までのすべてを含む、各プロジェクトのサブフォルダーの数が増加することで構成される拡張テストデータベースがあります。以前から Python に少し慣れていたので、このタスクに挑戦することにしました。タイトルの一部として「テスト スプレッドシート」を含む Excel ドキュメントを検索したい (たとえば、「テスト スプレッドシート モデル 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 は既にインストールされており、IDE として Eclipse を使用しています。私は今、さまざまな方法でそれを機能させようとしてきたので、私のスクリプトのほとんどは純粋にテスト用です。
編集:
#-*- 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() を印刷しているときに結果が 1 つしか得られないのはなぜですか。 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 関数の後に print 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
最終的には、使用されるすべての変数の図 + ファイルへのリンクと各ドキュメントの名前が必要です。
どうすればいいのかわからないので、ヒントをいただければ幸いです。
ありがとう!