Извлечение информации из текстового файла и создание выходной таблицы CSV с Python - PullRequest
0 голосов
/ 29 декабря 2018

Наверное, у меня довольно сложный вопрос:

Я извлекаю некоторые метаданные из картинок в папке с помощью экстрактора EXIF.Он генерировал текстовый файл для каждого изображения с метаданными.Теперь я ищу процедуру для извлечения только некоторой информации (GPS-данные) из всех текстовых файлов и создания таблицы CSV с ним.Я думаю, что Python отлично подойдет для решения проблемы, но это не совсем моя сила ..

TXT-файлы с метаданными для каждого изображения выглядят так:

---- ExifTool ----

ExifTool Номер версии: 11.23

Предупреждение: [несовершеннолетний] Нераспознанные заметки

---- Система ----

Имя файла: GOPR0118.jpg

Каталог: Z: / myDirectory

Размер файла: 4,3 МБ

Дата и время изменения файла: 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-тип: image / jpeg

Порядок байтов Exif: Big-endian (Motorola, MM)

Ширина изображения: 4000

Высота изображения: 3000

Процесс кодирования: базовый DCT, кодирование Хаффмана

Биты PПример: 8

Компоненты цвета: 3

Y Cb Cr Sub Sampling: 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

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 Ref: Север

Широта 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 ----

Версия MPF: 0100

Количество изображений: 2

Список UID изображений: (Двоичные данные66 байт, используйте опцию -b для извлечения)

Всего кадров: 1

---- MPImage1 ----

Флаги изображения MP: Репрезентативное изображение, Зависимый родительизображение

MP Формат изображения: JPEG

MP Тип изображения: базовое MP Основное изображение

MP Длина изображения: 4270517

MP Начало изображения: 0

Зависимое изображение 1 Номер записи: 2

Dependent Image 2 Номер записи: 0

---- MPImage2 ----

Флаги изображения MP: Зависимое дочернее изображение

Формат изображения MP: JPEG

*Тип изображения 1225 * MP: большой эскиз (эквивалент VGA)

Длина изображения MP: 279747

Начало изображения MP: 4270517

Зависимое изображение 1 Номер записи: 0

Зависимое изображение 2, номер записи: 0

Предварительный просмотр изображения: (двоичные данные 279747 байт, используйте опцию -b для извлечения)

---- GoPro ----

Идентификатор устройства: 1

Имя устройства: Глобальные настройки фотографий

Версия прошивки: HD7.01.01.61.00

GoPro LINF: LAJ8052335601085

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

Серийный номер камеры: C3281324633583

Название модели камеры: HERO7 Черный

GoPro MUID: 95699661 1724720628 3274885403 3965803574 0 0 0

GoPro CMOD: 17

GoPro MTYP: 11

Автоповорот: вверх

Цифровой зум: Да

GoPro DZST: 0

GoPro SMTR: N

Pro Tune: Off

Баланс белого:

Резкость:

Цветовой режим:

GoPro EXPT: AUTO

АвтоМакс. ISO: 0

Авто Мин. ISO: 0

Компенсация экспозиции:

Скорость: 4_1SEC

Разрешение фото: 12MP_W

HDRНастройка: OFF

GoPro PRAW: N

GoPro HFLG: 0

---- Композитный ----

Диафрагма: 2,8

Высота GPS: 391,3 м над уровнем моря

Дата / время GPS: 2018: 12: 27 14: 20: 36Z

Широта GPS: 47 град. 32 '5,08' N

Долгота GPS: 7 град. 38 '30,49 "E

Положение GPS: 47 град.32 "5,08" N, 7 град. 38 '30,49 "E

Размер изображения: 4000x3000

Мегапиксели: 12,0

Коэффициент масштабирования до 35 мм Эквивалент: 5,0

Скорость затвора: 1/581

Круг путаницы: 0,006 мм

Поле зрения: 100,4 градуса

Фокусное расстояние: 3,0 мм (эквивалент 35 мм: 15,0 мм)

Гиперфокальное расстояние: 0,53 м

Значение освещенности: 12,2

Шаблон CSV должен содержать имя файла и данные GPS и отображаться следующим образом:

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

Любая помощь очень ценится!

Приветствия Фаби

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Как предлагается в комментарии, вместо того, чтобы пытаться анализировать вывод текста из инструмента exif, который вы использовали, вы можете решить весь конвейер, используя Python и библиотеку PIL.

Например:

#!/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.Может быть немного чище, чем пытаться разобрать текст, и даст вам некоторую гибкость в том, что вы хотите использовать десятичный лат, long вместо градусов, минут и секунд.

Немного больше деталей для работы с Exif, включаяПреобразование широты и долготы в десятичное число можно найти в этом сообщении в блоге: Начало работы с геокодированием Метаданные изображений Exif в Python 3

0 голосов
/ 31 декабря 2018

Тем временем мне удалось собрать небольшой код, который добился цели.Если кому-то нужно решить ту же или похожую проблему:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...