Параметризованная комплексная струна - PullRequest
0 голосов
/ 01 февраля 2020

Мне нужно построить цепочку текста следующим образом:

 out = 'ogr:dbname=\'C:\\output\\2020.gpkg\' table=\"2020\" (geom) sql='

Вот мой код:

import glob, time, sys, threading, os
from datetime import date, timedelta, datetime
import time, threading

#Parameters
layer = 'C:\\layer.gpkg' 
n ='2020'
outdir = 'C:\\output'

#Process
l = os.path.realpath(layer)
pn = os.path.realpath(outdir + '/' + n + '.gpkg')
p = f"'{pn}'"
f = f"'{n}'"
o = f'ogr:dbname={p} table={f} (geom) sql='

#Test
out = 'ogr:dbname=\'C:\\output\\2020.gpkg\' table=\"2020\" (geom) sql='
o == out

Цель состоит в том, чтобы вывести o ==.

Что мне нужно изменить в части #Process, чтобы получить значение True?

Более того, мне нужно запустить это либо в linux, либо в windows.

Моя конечная цель - создать функцию, которая дает 3 строки, возвращает сложную строку, показанную выше.

Ответы [ 3 ]

2 голосов
/ 01 февраля 2020

Предполагая, что вы используете python 3.6 или выше, вы должны использовать строки форматирования (также известные как f-строки) для создания строк из переменных. Начните строку с буквы «f» и затем поместите все переменные в фигурные скобки {}. Также, если вы используете одинарные кавычки в качестве внешней кавычки, вам не нужно избегать двойных кавычек и наоборот.

Код:

db_name = "'home/user/output/prueba.gpkg'"
table_name = '"prueba"'
outputlayer = f'ogr:dbname={db_name} table={table_name} (geom) sql='
outputlayer

Вывод:

'ogr:dbname=\'home/user/output/prueba.gpkg\' table="prueba" (geom) sql='
1 голос
/ 07 февраля 2020

Я думаю, что одна из проблем, с которой это не работает, - ваш путь сюда pn = os.path.realpath(outdir + '/' + n + '.gpkg'). Это пытается объединить UNIX путь / с windows путь \\. Более надежное решение с точки зрения переносимости между linux и windows заключается в использовании функции path.join в модуле os.

Кроме того, строки python f будут добавлять экранирование только к тому символу кавычки Вы использовали, чтобы открыть строку (' или "). Если экранированные кавычки вокруг обеих строк необходимы, вам, вероятно, лучше жестко закодировать их в f-строку вместо установки 2 новых переменных с разными типами кавычек.

import glob, time, sys, threading, os
from datetime import date, timedelta, datetime
import time, threading

#Parameters
layer = 'C:\\layer.gpkg' 
n ='2020'
outdir = 'C:\\output'

#Process
l = os.path.realpath(layer)
pn = os.path.realpath(os.path.join(outdir, f"{n}.gpkg"))
o = f'ogr:dbname=\'{pn}\' table=\"{n}\" (geom) sql='

#Test
out = 'ogr:dbname=\'C:\\output\\2020.gpkg\' table=\"2020\" (geom) sql='
o == out

Версия этого (другого путь) был протестирован для работы на моей linux машине.

1 голос
/ 02 февраля 2020

Другой вариант - использовать строку в тройных кавычках:

dbname = """/home/user/output/prueba.gpkg"""
outputlayer = """ogr:dbname='"""+dbname+"""' table="prueba" (geom) sql="""

, что дает:

'ogr:dbname=\'/home/user/output/prueba.gpkg\' table="prueba" (geom) sql='
...