Python 将对象值转换为 int
Python convert object value to int
我已经使用 python 一段时间了,但我仍然 运行 会遇到一些初级问题。
我目前正在 python 中使用 exifread 库来获取纬度和经度。我需要将 DMS 值转换为 DD。
到目前为止,我已经写了以下内容:
#!/bin/python
import math
import exifread
path_name = './IMAG0658.jpg'
f = open(path_name, 'rb')
tags = exifread.process_file(f)
GPSLat = tags['GPS GPSLatitude']
print tags['GPS GPSLatitudeRef']
print GPSLat.values[0]
print GPSLat.values[1]
print GPSLat.values[2]
GPSDDLat = GPSLat.values[0] + ((GPSLat.values[1] / 60) + (GPSLat.values[2]/3600))
print GPSDDLat
但是在打印以下内容后它崩溃了:
$python tempexif.py
N
33
52
433621/10000
Traceback (most recent call last):
File "tempexif.py", line 14, in <module>
GPSDDLat = GPSLat.values[0] + ((GPSLat.values[1] / 60) + (GPSLat.values[2]/3600))
TypeError: unsupported operand type(s) for /: 'instance' and 'int'
如何针对列表值而不是对象本身进行数学运算?
GPSLat.values[x]
是一个对象(一个实例,正如它在 Traceback 中所说)。
为了获得学位你需要做的事情:
def val_2_deg(value):
return float(value.num) / float(value.den)
然后将您的公式更改为:
GPSDDLat = val_2_deg(GPSLat.values[0]) + val_2_deg(GPSLat.values[1])/60 + val_2_deg(GPSLat.values[2])/3600
您的代码不完整,因为您没有提供输入文件 IMAG0658.jpg
。但是有些话还是可以说的,我们还是可以回答你的问题的。
根据您的打印语句,看起来 GPSLat.values[0]
和 GPSLat.values[1]
都是 int
值。但是我们看到 GPSLat.values[2]
看起来像一个分数,因此不是 int
值。从您的错误回溯中我们看到 GPSLat.values[1]
或 GPSLat.values[2]
实际上是一个对象实例。因此,这些值中至少有一个看起来像数值,但实际上是一个对象实例。
您的问题的解决方案是采用 print
函数中显示的那些明显的数值,因此 str
函数也可以访问这些数值,然后将它们转换为数值进一步计算。由于 GPSLat.values[2]
不像 int 那样打印,而是像分数一样打印,我们可以使用 fractions
模块中的 Fraction
类型来轻松转换为 float
。因此,对于每个值,我们使用 str
来获取看起来像数字的值,然后将其转换为实际的数字 float
值。
所以我们可以做到
from fractions import Fraction
GPSDDLat = ( float(str(GPSLat.values[0]))
+ float(str(GPSLat.values[1])) / 60
+ float(Fraction(str(GPSLat.values[2]))) / 3600
)
但如果没有那个文件,我就无法对该代码进行实际检查。
我已经使用 python 一段时间了,但我仍然 运行 会遇到一些初级问题。 我目前正在 python 中使用 exifread 库来获取纬度和经度。我需要将 DMS 值转换为 DD。
到目前为止,我已经写了以下内容:
#!/bin/python
import math
import exifread
path_name = './IMAG0658.jpg'
f = open(path_name, 'rb')
tags = exifread.process_file(f)
GPSLat = tags['GPS GPSLatitude']
print tags['GPS GPSLatitudeRef']
print GPSLat.values[0]
print GPSLat.values[1]
print GPSLat.values[2]
GPSDDLat = GPSLat.values[0] + ((GPSLat.values[1] / 60) + (GPSLat.values[2]/3600))
print GPSDDLat
但是在打印以下内容后它崩溃了:
$python tempexif.py
N
33
52
433621/10000
Traceback (most recent call last):
File "tempexif.py", line 14, in <module>
GPSDDLat = GPSLat.values[0] + ((GPSLat.values[1] / 60) + (GPSLat.values[2]/3600))
TypeError: unsupported operand type(s) for /: 'instance' and 'int'
如何针对列表值而不是对象本身进行数学运算?
GPSLat.values[x]
是一个对象(一个实例,正如它在 Traceback 中所说)。
为了获得学位你需要做的事情:
def val_2_deg(value):
return float(value.num) / float(value.den)
然后将您的公式更改为:
GPSDDLat = val_2_deg(GPSLat.values[0]) + val_2_deg(GPSLat.values[1])/60 + val_2_deg(GPSLat.values[2])/3600
您的代码不完整,因为您没有提供输入文件 IMAG0658.jpg
。但是有些话还是可以说的,我们还是可以回答你的问题的。
根据您的打印语句,看起来 GPSLat.values[0]
和 GPSLat.values[1]
都是 int
值。但是我们看到 GPSLat.values[2]
看起来像一个分数,因此不是 int
值。从您的错误回溯中我们看到 GPSLat.values[1]
或 GPSLat.values[2]
实际上是一个对象实例。因此,这些值中至少有一个看起来像数值,但实际上是一个对象实例。
您的问题的解决方案是采用 print
函数中显示的那些明显的数值,因此 str
函数也可以访问这些数值,然后将它们转换为数值进一步计算。由于 GPSLat.values[2]
不像 int 那样打印,而是像分数一样打印,我们可以使用 fractions
模块中的 Fraction
类型来轻松转换为 float
。因此,对于每个值,我们使用 str
来获取看起来像数字的值,然后将其转换为实际的数字 float
值。
所以我们可以做到
from fractions import Fraction
GPSDDLat = ( float(str(GPSLat.values[0]))
+ float(str(GPSLat.values[1])) / 60
+ float(Fraction(str(GPSLat.values[2]))) / 3600
)
但如果没有那个文件,我就无法对该代码进行实际检查。