Python / xldr:如何使用 raw_input 变量从 excel 文件中提取数据?
Python / xldr : How do I pull data from an excel file using a raw_input variable?
所以我正在尝试使用 python 2.7 和 excel 文件为游戏 Arma 3 制作一个简单的弹道计算器。目的是制作一个在终端中运行的简单程序,询问您要计算的镜头中涉及的数据,并输出一个等于 mil-dot hold over(狙击镜范围内的点)的值您需要成功射中目标。 link 以table 为例会详细说明这涉及到什么。很简单。
它涉及进行三角函数计算以找到到目标的真实水平距离。然后将该范围与 excel 文件中的一个值(解析?使用 xlrd)结合使用,该文件包含一个在保持计算中使用的变量。
即水平距离 = 范围 * cos(角度)
水平距离 - 归零 = hold_over_variable_x ;
然后使用 a table from this steam page 获取另一个用于保持计算的变量。在本例中,M320 LRR 步枪的 table,将保存在 excel 文件中。 (以后想加更多的步枪,用一个raw_input变量去挑对应的excel sheet)
归零将是一个通过 raw_input 分配的变量,并且需要从所述 table 中提取正确的值。
例如归零 = 1000
范围 = 1125
角度 = 15.5
水平距离 = 1125 cos(15.5) = 1100
水平距离 - 归零 = 100 = hold_over_variable_x
hold_over_variable_y = -1.5(使用归零变量从 excel 文件中解析)
hold_over = 100 * -1.5 = -150
hold_over 理想情况下打印为 -1.5。
这是我目前的代码,很抱歉格式不佳*编辑;初始代码的正确格式:
zeroing = int(raw_input("Zeroing?"))
designator_range = int(raw_input("Range?"))
angle = float(raw_input("Angle?"))
from math import cos, radians
horizontal_distance = designator_range * cos (radians(angle))
import xlrd
workbook = xlrd.open_workbook('mildot_arma.xls')
worksheet = workbook.sheet_by_name('M320')
hold_over_variable_x = horizontal_distance - zeroing
if zeroing == 300:
hold_over_variable_y == sheet.cell(1,1).value
elif zeroing == 400:
hold_over_variable_y == sheet.cell(2,1).value
elif zeroing == 500:
hold_over_variable_y == sheet.cell(3,1).value
elif zeroing == 600:
hold_over_variable_y == sheet.cell(4,1).value
elif zeroing == 700:
hold_over_variable_y == sheet.cell(5,1).value
elif zeroing == 800:
hold_over_variable_y == sheet.cell(6,1).value
elif zeroing == 900:
hold_over_variable_y == sheet.cell(7,1).value
elif zeroing == 1000:
hold_over_variable_y == sheet.cell(8,1).value
elif zeroing == 1100:
hold_over_variable_y == sheet.cell(9,1).value
elif zeroing == 1200:
hold_over_variable_y == sheet.cell(10,1).value
elif zeroing == 1300:
hold_over_variable_y == sheet.cell(11,1).value
elif zeroing == 1400:
hold_over_variable_y == sheet.cell(12,1).value
elif zeroing == 1500:
hold_over_variable_y == sheet.cell(13,1).value
else:
hold_over_variable_y = sheet.cell(14,1).value
hold_over = hold_over_variable_x * hold_over_variable_y
print hold_over
我遇到错误:
Using variable 'hold_over_variable_y' before assignment
Undefined variable 'sheet'
当我点击 if 函数时开始。
我在这方面超级菜鸟。对不起巨人 post。非常感谢任何帮助或建议!
*编辑#2:
Lars 确切地知道我需要修复什么。在我应该使用 = 的地方使用了 ==,我需要将 sheet.cell 更改为 worksheet.cell。这是我的第一个可能对我有用的实际项目,我为此感到自豪。感谢大家的帮助。
这是现在的代码。将尝试将其全部置于 True 下:希望它能让我输入新数据并在不关闭终端的情况下计算下一个镜头。
#Horizontal distance and Mil-dot Hold Calculator for M320 in Arma 3
#Asks for ballistic data to assign values to variables that will be used in range and mil-dot calculations
zeroing = int(raw_input("Zeroing?"))
designator_range = int(raw_input("Range?"))
angle = float(raw_input("Angle?"))
#Imports cos and radians from math module
from math import cos, radians
#Trigonometric, horizontal distance calculation. Converts angle to radian and multiplies its cosine with the designator range.
horizontal_distance = designator_range * cos (radians(angle))
#Imports excel workbook, 'mildot_arma.xls", worksheet 'M320'. A mil-dot balistics table for the M320 to be used in hold over calculation
import xlrd
workbook = xlrd.open_workbook('mildot_arma.xls')
worksheet = workbook.sheet_by_name('M320')
#Beginning of Mil-dot calculation process
#Creates hold over variable_x from distance minus zeroing to be calculated with sheet
hold_over_variable_x = horizontal_distance - zeroing
#Parses hold over variable_y from sheet to be calculated with previous variable, (the most complicated part)
if zeroing == 300:
hold_over_variable_y = worksheet.cell(1,1).value
elif zeroing == 400:
hold_over_variable_y = worksheet.cell(2,1).value
elif zeroing == 500:
hold_over_variable_y = worksheet.cell(3,1).value
elif zeroing == 600:
hold_over_variable_y = worksheet.cell(4,1).value
elif zeroing == 700:
hold_over_variable_y = worksheet.cell(5,1).value
elif zeroing == 800:
hold_over_variable_y = worksheet.cell(6,1).value
elif zeroing == 900:
hold_over_variable_y = worksheet.cell(7,1).value
elif zeroing == 1000:
hold_over_variable_y = worksheet.cell(8,1).value
elif zeroing == 1100:
hold_over_variable_y = worksheet.cell(9,1).value
elif zeroing == 1200:
hold_over_variable_y = worksheet.cell(10,1).value
elif zeroing == 1300:
hold_over_variable_y = worksheet.cell(11,1).value
elif zeroing == 1400:
hold_over_variable_y = worksheet.cell(12,1).value
elif zeroing == 1500:
hold_over_variable_y = worksheet.cell(13,1).value
else:
hold_over_variable_y = worksheet.cell(14,1).value
#Calculates mil-dot hold over from variables, and assigns mil-dot hold over value
hold_over = hold_over_variable_x * hold_over_variable_y
#Prints final hold over calculation
print hold_over
正如错误告诉您的那样,您的代码中没有定义名为 sheet 的变量,但您正在调用 sheet 上的函数。 您可能需要重命名 sheet 才能工作sheet。
变量hold_over_variable_y在你使用之前也没有定义。在将它与某物进行比较之前,先给它一个值。
例如这里:
hold_over_variable_y == sheet.cell(1,1).value
如果 hold_over_variable_y 没有值,你怎么知道这是对还是错?
所以我正在尝试使用 python 2.7 和 excel 文件为游戏 Arma 3 制作一个简单的弹道计算器。目的是制作一个在终端中运行的简单程序,询问您要计算的镜头中涉及的数据,并输出一个等于 mil-dot hold over(狙击镜范围内的点)的值您需要成功射中目标。 link 以table 为例会详细说明这涉及到什么。很简单。
它涉及进行三角函数计算以找到到目标的真实水平距离。然后将该范围与 excel 文件中的一个值(解析?使用 xlrd)结合使用,该文件包含一个在保持计算中使用的变量。
即水平距离 = 范围 * cos(角度)
水平距离 - 归零 = hold_over_variable_x ;
然后使用 a table from this steam page 获取另一个用于保持计算的变量。在本例中,M320 LRR 步枪的 table,将保存在 excel 文件中。 (以后想加更多的步枪,用一个raw_input变量去挑对应的excel sheet)
归零将是一个通过 raw_input 分配的变量,并且需要从所述 table 中提取正确的值。
例如归零 = 1000
范围 = 1125
角度 = 15.5
水平距离 = 1125 cos(15.5) = 1100
水平距离 - 归零 = 100 = hold_over_variable_x
hold_over_variable_y = -1.5(使用归零变量从 excel 文件中解析)
hold_over = 100 * -1.5 = -150
hold_over 理想情况下打印为 -1.5。
这是我目前的代码,很抱歉格式不佳*编辑;初始代码的正确格式:
zeroing = int(raw_input("Zeroing?"))
designator_range = int(raw_input("Range?"))
angle = float(raw_input("Angle?"))
from math import cos, radians
horizontal_distance = designator_range * cos (radians(angle))
import xlrd
workbook = xlrd.open_workbook('mildot_arma.xls')
worksheet = workbook.sheet_by_name('M320')
hold_over_variable_x = horizontal_distance - zeroing
if zeroing == 300:
hold_over_variable_y == sheet.cell(1,1).value
elif zeroing == 400:
hold_over_variable_y == sheet.cell(2,1).value
elif zeroing == 500:
hold_over_variable_y == sheet.cell(3,1).value
elif zeroing == 600:
hold_over_variable_y == sheet.cell(4,1).value
elif zeroing == 700:
hold_over_variable_y == sheet.cell(5,1).value
elif zeroing == 800:
hold_over_variable_y == sheet.cell(6,1).value
elif zeroing == 900:
hold_over_variable_y == sheet.cell(7,1).value
elif zeroing == 1000:
hold_over_variable_y == sheet.cell(8,1).value
elif zeroing == 1100:
hold_over_variable_y == sheet.cell(9,1).value
elif zeroing == 1200:
hold_over_variable_y == sheet.cell(10,1).value
elif zeroing == 1300:
hold_over_variable_y == sheet.cell(11,1).value
elif zeroing == 1400:
hold_over_variable_y == sheet.cell(12,1).value
elif zeroing == 1500:
hold_over_variable_y == sheet.cell(13,1).value
else:
hold_over_variable_y = sheet.cell(14,1).value
hold_over = hold_over_variable_x * hold_over_variable_y
print hold_over
我遇到错误:
Using variable 'hold_over_variable_y' before assignment
Undefined variable 'sheet'
当我点击 if 函数时开始。
我在这方面超级菜鸟。对不起巨人 post。非常感谢任何帮助或建议!
*编辑#2:
Lars 确切地知道我需要修复什么。在我应该使用 = 的地方使用了 ==,我需要将 sheet.cell 更改为 worksheet.cell。这是我的第一个可能对我有用的实际项目,我为此感到自豪。感谢大家的帮助。
这是现在的代码。将尝试将其全部置于 True 下:希望它能让我输入新数据并在不关闭终端的情况下计算下一个镜头。
#Horizontal distance and Mil-dot Hold Calculator for M320 in Arma 3
#Asks for ballistic data to assign values to variables that will be used in range and mil-dot calculations
zeroing = int(raw_input("Zeroing?"))
designator_range = int(raw_input("Range?"))
angle = float(raw_input("Angle?"))
#Imports cos and radians from math module
from math import cos, radians
#Trigonometric, horizontal distance calculation. Converts angle to radian and multiplies its cosine with the designator range.
horizontal_distance = designator_range * cos (radians(angle))
#Imports excel workbook, 'mildot_arma.xls", worksheet 'M320'. A mil-dot balistics table for the M320 to be used in hold over calculation
import xlrd
workbook = xlrd.open_workbook('mildot_arma.xls')
worksheet = workbook.sheet_by_name('M320')
#Beginning of Mil-dot calculation process
#Creates hold over variable_x from distance minus zeroing to be calculated with sheet
hold_over_variable_x = horizontal_distance - zeroing
#Parses hold over variable_y from sheet to be calculated with previous variable, (the most complicated part)
if zeroing == 300:
hold_over_variable_y = worksheet.cell(1,1).value
elif zeroing == 400:
hold_over_variable_y = worksheet.cell(2,1).value
elif zeroing == 500:
hold_over_variable_y = worksheet.cell(3,1).value
elif zeroing == 600:
hold_over_variable_y = worksheet.cell(4,1).value
elif zeroing == 700:
hold_over_variable_y = worksheet.cell(5,1).value
elif zeroing == 800:
hold_over_variable_y = worksheet.cell(6,1).value
elif zeroing == 900:
hold_over_variable_y = worksheet.cell(7,1).value
elif zeroing == 1000:
hold_over_variable_y = worksheet.cell(8,1).value
elif zeroing == 1100:
hold_over_variable_y = worksheet.cell(9,1).value
elif zeroing == 1200:
hold_over_variable_y = worksheet.cell(10,1).value
elif zeroing == 1300:
hold_over_variable_y = worksheet.cell(11,1).value
elif zeroing == 1400:
hold_over_variable_y = worksheet.cell(12,1).value
elif zeroing == 1500:
hold_over_variable_y = worksheet.cell(13,1).value
else:
hold_over_variable_y = worksheet.cell(14,1).value
#Calculates mil-dot hold over from variables, and assigns mil-dot hold over value
hold_over = hold_over_variable_x * hold_over_variable_y
#Prints final hold over calculation
print hold_over
正如错误告诉您的那样,您的代码中没有定义名为 sheet 的变量,但您正在调用 sheet 上的函数。 您可能需要重命名 sheet 才能工作sheet。
变量hold_over_variable_y在你使用之前也没有定义。在将它与某物进行比较之前,先给它一个值。
例如这里:
hold_over_variable_y == sheet.cell(1,1).value
如果 hold_over_variable_y 没有值,你怎么知道这是对还是错?