在python中使用gpkg进行参数化的复数字符串工作。

问题描述 投票:-2回答:3

我需要构建一个这样的文本链。

 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 == out.

我需要在#Process部分修改什么才能使其为真?

此外,我需要在linux或windows下运行这个程序。

我的最终目标是创建一个函数,给出3个字符串,返回上面所示的复杂字符串行。

python string backslash
3个回答
1
投票

我认为其中一个问题是你的路径不对 pn = os.path.realpath(outdir + '/' + n + '.gpkg'). 这是试图结合UNIX路径 / 带窗口路径 \\. 在linux和windows之间的可移植性方面,一个更强大的解决方案是使用 path.join 在os模块中的函数。

此外,python f 字符串只会在你用来打开字符串的引号上加上转义符 ('"). 如果两个字符串周围的转义引号是必要的,你可能最好把它硬编码成一个f-string,而不是设置两个不同引号类型的新变量。

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机器上测试过了。


2
投票

假设你使用的是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
投票

另一个选择是使用一个三引号的字符串。

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='
© www.soinside.com 2019 - 2024. All rights reserved.