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
           )

但如果没有那个文件,我就无法对该代码进行实际检查。