在 python 中使用 gpkg 的参数化复杂字符串

Parametrized complex string working with gpkg in python

我需要像这样构造一个文本链:

 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 个字符串的函数 returns 如上所示的复杂字符串行。

假设您使用的是 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='

另一种选择是使用三引号字符串:

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='

我认为这不起作用的问题之一是您在此处的路径 pn = os.path.realpath(outdir + '/' + n + '.gpkg')。这是试图将 UNIX 路径 / 与 windows 路径 \ 结合起来。就 linux 和 windows 之间的可移植性而言,一个更强大的解决方案是使用 os 模块中的 path.join 函数。

此外,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 机器上运行。