как правильно открыть файл в GDAL на python'е (Windows)?

Ответить
Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

как правильно открыть файл в GDAL на python'е (Windows)?

Сообщение Boris » 17 дек 2013, 00:45

Я заранее извиняюсь за приставучесть, но предыдущая тема про русские буквы вынудила обращаться к скриптам на python'е, в частности к gdal_merge. Буду рад за любой конкретный совет как должно быть организовано открытие файлов файлов в скрипте, если название передается из командной строки Windows.
Пример кода приводимый в руководстве и примерах, таков что либо имя файла указывается либо на прямую

Код: Выделить всё

gdalData = gdal.Open( "/home/alex/test/input.tiff", GA_ReadOnly )
# или так
# gdalData = gdal.Open( "/home/alex/test/input.tiff" )
либо так

Код: Выделить всё

    if argv is None:
        argv = sys.argv
    argv = gdal.GeneralCmdLineProcessor( argv )
    if argv is None:
        sys.exit( 0 )
    ....
    filename=argv[i]
    fh = gdal.Open( filename )
Командная строка - стандартный cmd. Файл имеет русские буквы либо в названии, либо в пути.
Совет "никак" то же сойдет. Или "запускайте не через BAT, а вот так..."
Если надо заменить cmd на какой то клон от Unix, то желательно, что бы совет был подкреплен практикой.
Единственно, чего не стоит советовать, то это избавится от русских букв, такой путь мне и самому очевиден, но они (русские буквы) в названии уже есть, поскольку это номенклатура планшетов.

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: как правильно открыть файл в GDAL на python'е (Windows)?

Сообщение gamm » 17 дек 2013, 04:41

Boris писал(а):Единственно, чего не стоит советовать, то это избавится от русских букв, такой путь мне и самому очевиден, но они (русские буквы) в названии уже есть, поскольку это номенклатура планшетов.
ну отчего же - вставьте
copy планшет.tif c:/temp/gumus.tif
в bat-файл, и наслаждайтесь.

говорят, помогает установка переменных
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
CPLSetThreadLocalConfigOption("GDAL_FILENAME_IS_UTF8","NO");
Set a configuration option for GDAL/OGR use.

Those options are defined as a (key, value) couple. The value corresponding to a key can be got later with the CPLGetConfigOption() method.

This mechanism is similar to environment variables, but options set with CPLSetConfigOption() overrides, for CPLGetConfigOption() point of view, values defined in the environment.

If CPLSetConfigOption() is called several times with the same key, the value provided during the last call will be used.

Options can also be passed on the command line of most GDAL utilities with the with '--config KEY VALUE'. For example, ogrinfo --config CPL_DEBUG ON ~/data/test/point.shp

Sergey Astakhov
Активный участник
Сообщения: 218
Зарегистрирован: 21 дек 2012, 01:57
Репутация: 52
Откуда: Питер

Re: как правильно открыть файл в GDAL на python'е (Windows)?

Сообщение Sergey Astakhov » 17 дек 2013, 12:24

Вот как раз при использовании gdal через python имеет смысл выставить GDAL_FILENAME_IS_UTF8=YES.

Дело в следующем - python под windows вроде как использует "правильные" функции (wmain и т.п.) для получения аргументов + 3-й python unicode нормально поддерживает, поэтому строки внутри python-а должны быть корректными. Для проверки можно попробовать эти строки сохранить во внешний файл и сравнить.

При вызове gdal-овского кода выполняется безусловная конвертация строк в UTF-8 (код прослойки http://trac.osgeo.org/gdal/browser/trun ... l_wrap.cpp). А gdal-овские функции при установленном GDAL_FILENAME_IS_UTF8=YES выполняют обратную конвертацию из UTF-8 в UTF-16 и вызов unicode-функций виндов (примеры есть в http://svn.osgeo.org/gdal/trunk/gdal/po ... _win32.cpp).

Так что может и заработать, если ввод/вывод на консоль и получение аргументов делать только средствами python-а.

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: как правильно открыть файл в GDAL на python'е (Windows)?

Сообщение Boris » 18 дек 2013, 03:27

gamm писал(а): copy планшет.tif c:/temp/gumus.tif
в bat-файл, и наслаждайтесь.
Спасибо за советы. Буду пробовать. Приведенные функции относятся к python-у? А то мои первые поиски привели к тому, что каждый из языков, который предназначен для общения с библиотекой, использует свои функции для вызова.
---
В отношении BAT файла я знаю гораздо более простой способ, хотя потенциально менее безопасный - переименовывать файл со случайным именем, а после использования восстанавливать имя.

Boris
Гуру
Сообщения: 4205
Зарегистрирован: 10 апр 2006, 22:34
Репутация: 433
Откуда: Париж

Re: как правильно открыть файл в GDAL на python'е (Windows)?

Сообщение Boris » 18 дек 2013, 03:30

Sergey Astakhov писал(а):Вот как раз при использовании gdal через python имеет смысл выставить GDAL_FILENAME_IS_UTF8=YES.
Спасибо и это попробую.
Вот только pyton в моем GDAl 2.7 . Так на первый взгляд sytem.argv уже вернул командную строку, где русские буквы заменил на \xшестнадцетиричное число.

Sergey Astakhov
Активный участник
Сообщения: 218
Зарегистрирован: 21 дек 2012, 01:57
Репутация: 52
Откуда: Питер

Re: как правильно открыть файл в GDAL на python'е (Windows)?

Сообщение Sergey Astakhov » 18 дек 2013, 10:33

Boris писал(а):Так на первый взгляд sytem.argv уже вернул командную строку, где русские буквы заменил на \xшестнадцетиричное число.
Это как раз не страшно, всё зависит от того, какое именно там "шестнадцетиричное число".

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: как правильно открыть файл в GDAL на python'е (Windows)?

Сообщение Ariki » 19 фев 2014, 22:15

Вот кроссплатформенный способ работать с кодировками в Python 2.x. Работает в том числе и в консоли Windows, где кодировка по умолчанию отличается от всей остальной системы.

Код: Выделить всё

# -*- coding: utf-8 -*-

from __future__ import unicode_literals # or always use u'literal' syntax
import os
import sys

filename = sys.argv[1].decode(sys.getfilesystemencoding())
assert isinstance(filename, unicode)

for textline in open(filename):
    assert isinstance(textline, str)
    unicode_textline = textline.decode('cp1251').rstrip(os.linesep)
    print unicode_textline.encode(sys.stdout.encoding)
    
# Alternative way
import codecs
for unicode_textline in codecs.open(filename, encoding='cp1251'):
    assert isinstance(unicode_textline, unicode)
    sys.stdout.write(unicode_textline.encode(sys.stdout.encoding))

Ответить

Вернуться в «GDAL/OGR»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 13 гостей