【问题标题】:Extract infromation from textfile and generate output csv table with python从文本文件中提取信息并使用 python 生成输出 csv 表
【发布时间】:2018-12-29 18:08:16
【问题描述】:

我想我有一个相当复杂的问题:

我使用 EXIF 提取器从文件夹中的图片中提取一些元数据。它为每张带有元数据的图片生成一个 txt 文件。现在我正在寻找一个程序来仅提取所有 txt 文件的一些信息(GPS 数据)并用它生成一个 csv 表。我认为 Python 可以很好地解决问题,但这并不是我的强项..

包含每张图片元数据的 txt 文件如下所示:

---- ExifTool ----

ExifTool 版本号:11.23

警告:[次要] MakerNotes 无法识别

----系统----

文件名:GOPR0118.jpg

目录:Z:/myDirectory

文件大小:4.3 MB

文件修改日期/时间:2018:12:27 15:20:37+01:00

文件访问日期/时间:2018:12:29 18:33:59+01:00

文件创建日期/时间:2018:12:28 16:41:25+01:00

文件权限:rw-rw-rw-

---- 文件----

文件类型:JPEG

文件类型扩展名:jpg

MIME 类型:图片/jpeg

Exif 字节顺序:大端(摩托罗拉,MM)

图像宽度:4000

图像高度:3000

编码过程:基线DCT,霍夫曼编码

每个样本的位数:8

颜色成分:3

Y Cb Cr 子采样:YCbCr4:2:2 (2 1)

---- IFD0 ----

图片说明:DCIM\100GOPRO\GOPR0118.JPG

品牌:GoPro

相机型号名称:HERO7 Black

方向:水平(正常)

X 分辨率:72

Y 分辨率:72

分辨率单位:英寸

软件:HD7.01.01.61.00

修改日期:2018:12:27 15:20:37

Y Cb Cr 定位:居中

---- ExifIFD ----

曝光时间:1/581

F 数:2.8

曝光程序:程序 AE​​p>

ISO:100

Exif 版本:0221

日期/时间原文:2018:12:27 15:20:37

创建日期:2018:12:27 15:20:37

组件配置:Y、Cb、Cr、-

每像素压缩位数:0.003367003367

快门速度值:1/512

光圈值:2.8

曝光补偿:0

最大光圈值:2.8

主体距离:0 米

测光模式:平均

光源:未知

闪光灯:没有闪光灯功能

焦距:3.0 毫米

Flashpix 版本:....

色彩空间:未知 (0)

Exif 图片宽度:4000

Exif 图片高度:3000

曝光指数:2147483595

感应方式:单片色区

文件来源:数码相机

场景类型:直接拍摄

自定义渲染:正常

曝光模式:自动

白平衡:自动

数码变焦倍率:1

35 毫米格式焦距:15 毫米

场景捕捉类型:风景

增益控制:无

对比度:正常

饱和度:正常

锐度:硬

设备设置说明:(二进制数据4字节,使用-b选项 提取)

拍摄对象距离范围:未知

序列号:C3281324633583

---- InteropIFD ----

互操作性索引:R98 - DCF 基本文件 (sRGB)

互操作性版本:0100

---- GPS ----

GPS 纬度参考:北

GPS 纬度:47 度 32' 5.08"

GPS 经度参考:东

GPS 经度:7 度 38' 30.49"

GPS 高度参考:海平面以上

GPS 高度:391.343 米

GPS 时间戳:14:20:36

GPS 日期戳:2018:12:27

---- IFD1 ----

压缩:JPEG(旧式)

X 分辨率:72

Y 分辨率:72

分辨率单位:英寸

缩略图偏移:44032

缩略图长度:17046

缩略图:(二进制数据17046字节,使用-b 提取选项)

---- MPF0 ----

强积金版本:0100

图像数量:2

图像 UID 列表:(二进制数据 66 字节,使用 -b 选项 提取)

总帧数:1

---- MPImage1 ----

MP 图像标志:代表图像,从属 父图像

MP 图像格式:JPEG

MP 图像类型:基线 MP 主图像

MP 图像长度:4270517

MP 图像开始:0

相关图像 1 条目编号:2

从属图像 2 条目编号:0

---- MPImage2 ----

MP 图像标志:从属子图像

MP 图像格式:JPEG

MP 图像类型:大缩略图(相当于 VGA)

MP 图像长度:279747

MP 图像开始:4270517

从属图像 1 条目编号:0

从属图像 2 条目编号:0

预览图片:(二进制数据279747字节,使用-b 提取选项)

---- GoPro ----

设备 ID:1

设备名称:照片全局设置

固件版本:HD7.01.01.61.00

GoPro LINF:LAJ8052335601085

GoPro CINF:205 66 180 5 244 37 205 102 27 201 50 195 54 92 97 236

相机序列号:C3281324633583

相机型号名称:HERO7 Black

GoPro MUID:95699661 1724720628 3274885403 3965803574 0 0 0 0

GoPro CMOD:17

GoPro MTYP:11

自动旋转:向上

数码变焦:是的

GoPro DZST:0

GoPro SMTR:否

专业调音:关闭

白平衡:

清晰度:

色彩模式:

GoPro EXPT:自动

自动 ISO 最大值:0

自动 ISO 最小值:0

曝光补偿:

速率:4_1SEC

照片分辨率:12MP_W

HDR 设置:关闭

GoPro PRAW : 否

GoPro HFLG:0

---- 复合----

光圈:2.8

GPS 高度:海拔 391.3 m

GPS 日期/时间:2018:12:27 14:20:36Z

GPS 纬度:47 度 32' 5.08" N

GPS 经度:7 度 38' 30.49" E

GPS 位置:北纬 47 度 32' 5.08",北纬 7 度 38' 30.49" E

图像尺寸:4000x3000

百万像素:12.0

35 毫米等效比例因子:5.0

快门速度:1/581

混乱圈:0.006 毫米

视野:100.4 度

焦距:3.0 毫米(相当于 35 毫米:15.0 毫米)

超焦距:0.53 m

光值:12.2

csv 模板应包含文件名和 GPS 数据,并显示如下:

|---------------------|----------------------|--------------------|
|      filename       |     lat              | long               |
|---------------------|----------------------|--------------------|
|    GOPR0118.jpg     | 47 deg 32' 5.08" N   |7 deg 38' 30.49" E  |
|---------------------|----------------------|--------------------|

非常感谢任何帮助!

干杯 法比

【问题讨论】:

  • 使用 Python EXIF 库并直接访问信息会容易得多。然后直接编写 CSV 文件将非常简单。
  • @Mark Tolonen:感谢您的回复。我知道这一定看起来我想让别人做我的工作。我是 Python 的菜鸟,我做了一些研究并尝试了一些代码,但它们没有用,所以我想我只是在这里详细介绍一下我的问题,而不是放一些不起作用的代码完全没有。
  • @Martin Evans:感谢您的意见,我没有意识到有这样的解决方案。非常感谢您的意见。

标签: python csv text gps


【解决方案1】:

与此同时,我设法将一些代码组合在一起,可以解决问题。如果有人需要解决相同或类似的问题:

import os

folder = "C:\\yourPath"

files = os.listdir(folder)

print(files)

forcsv = []

for i in files:
    #print(i[-3:])
    if i[-3:] == "txt":
        gps = [i]
        file = open(folder + "\\" + i)
        for line in file:
            l = line.split(":")
            if l[0][:3] == "GPS":
                gps.append(l[1].replace("\n",""))

    forcsv.append(gps)
    file.close()

for i in forcsv:
    print(i)

file = open(folder + "\\" + "output.csv", "w")

head = "Name;North;East;AboveSeaLevel;Datetime" + "\n"
file.write(head)
for i in forcsv:
    string = i[0] + ";" + i[2] + ";" + i[4] + ";" + i[6] + ";" + i[10] + "\n"
    file.write(string)

file.close()

【讨论】:

    【解决方案2】:

    正如评论中所建议的,您可以使用 Python 和 PIL 库来解决整个管道,而不是尝试解析您使用的 exif 工具的文本输出。

    例如:

    #!/usr/bin/env python
    
    from PIL import Image
    from PIL.ExifTags import GPSTAGS
    
    def get_exif(filename):
        image = Image.open(filename)
        image.verify()
        return image._getexif()
    
    def get_geotagging(exif):
        if not exif:
            raise ValueError("No EXIF metadata found")
    
        geotagging = {}
        for (idx, tag) in TAGS.items():
            if tag == 'GPSInfo':
                if idx not in exif:
                    raise ValueError("No EXIF geotagging found")
    
                for (key, val) in GPSTAGS.items():
                    if key in exif[idx]:
                        geotagging[val] = exif[idx][key]
    
        return geotagging
    

    因此,它只是使用 Python 来迭代图像而不是文本文件并写出 CSV 文件。可能比尝试解析文本更简洁一些,并且可以让您更灵活地使用十进制 lat、long 而不是度、分和秒。

    有关使用 Exif 的更多详细信息,包括将纬度和经度转换为十进制,可以在此博客文章中找到:Getting Started with Geocoding Exif Image Metadata in Python 3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多