我正在 Python 3.6.6 中创建一个字典字符串(稍后添加到 .txt 文件中)。
当我对字典的字符串进行硬编码时,我没有遇到任何问题:
my_string = '{"source": "s3://some_s3_bucket/random_filename.csv"} \n'
print(my_string)
Run Code Online (Sandbox Code Playgroud)
输出
{“源”:“s3://some_s3_bucket/random_filename.csv”}
然而,当我尝试用硬编码文件路径替换变量时,Python 似乎开始假设“source”是我想要替换的变量:
bucket = "some_s3_bucket"
filename = "random_filename.csv"
my_new_string = '{"source": "s3://{0}/{1}"} \n'.format(bucket, filename)
print(my_new_string)
Run Code Online (Sandbox Code Playgroud)
输出
模块中的 KeyError Traceback(最近一次调用最后一次)
--> 1 my_new_string = '{"source": "s3://{0}/{1}"} \n'.format(bucket, filename)
2 print(my_new_string )关键错误:'“来源”'
我应该如何格式化该字符串以便 Python 正确读取我的存储桶和文件名变量?
format触发花括号上的替换。字符串的开头有一个大括号。顺便说一句,在字段名称之后,您可以附加格式修饰符,以冒号分隔。因此,大括号和冒号之间的所有内容都将被视为字段名称,并且您没有命名的字段"source"(与引号一起)。
要输出大括号,请将其加倍:
my_new_string = '{{"source": "s3://{0}/{1}"}} \n'.format(bucket, filename)
Run Code Online (Sandbox Code Playgroud)
但 Talon 的评论是正确的,使用json模块比手工制作 JSON 更好,因为在一般情况下变量的值可能需要转义。由于您将不再需要输出大括号,因此您的format问题就消失了:
import json
my_new_string = json.dumps({"source": "s3://{0}/{1}".format(bucket, filename) })
Run Code Online (Sandbox Code Playgroud)