我需要构建一个这样的文本链。
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个字符串,返回上面所示的复杂字符串行。
我认为其中一个问题是你的路径不对 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机器上测试过了。
假设你使用的是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='