f-Strings在 Python 3.6 中可用,对于格式化字符串非常有用:
>>> n='you'
>>> f'hello {n}, how are you?'
'hello you, how are you?'
Run Code Online (Sandbox Code Playgroud)
在Python 3 的 f-Strings: An Improvement String Formatting Syntax (Guide) 中阅读更多关于它们的信息。我发现了一个有趣的模式:
请注意,使用三个大括号将导致您的字符串中只有一个大括号:
Run Code Online (Sandbox Code Playgroud)>>> f"{{{74}}}" '{74}'但是,如果您使用三个以上的大括号,您可以获得更多的大括号来显示:
Run Code Online (Sandbox Code Playgroud)>>> f"{{{{74}}}}" '{{74}}'
情况正是如此:
>>> f'{74}'
'74'
>>> f'{{74}}'
'{74}'
Run Code Online (Sandbox Code Playgroud)
现在如果我们从二{传到三,结果是一样的:
>>> f'{{{74}}}'
'{74}' # same as f'{{74}}' !
Run Code Online (Sandbox Code Playgroud)
所以我们最多需要4个!( {{{{) 得到两个大括号作为输出:
>>> f'{{{{74}}}}'
'{{74}}'
Run Code Online (Sandbox Code Playgroud)
为什么是这样?从那一刻起,用两个大括号让 Python 需要一个额外的大括号会发生什么?
我想知道如何在使用 f-string 的同时r获取原始字符串文字。我目前有它如下但想要允许任何名称替换的选项Alex我正在考虑添加一个 f 字符串,然后用Alex花括号替换并将用户名放在里面,但这不适用于r.
username = input('Enter name')
download_folder = r'C:\Users\Alex\Downloads'
Run Code Online (Sandbox Code Playgroud) 我编写了一个函数来创建VALUESSQL查询的一部分:
def query_values(data_iterator):
return ',\n'.join('\n({})\n'.format(',\n'.join('"{}"'.format(value) for value in data_row)
) for data_row in data_iterator
),
Run Code Online (Sandbox Code Playgroud)
当我调用此函数和print结果时,得到的是:
query_values:
('\n("801",\n"printer",\n"barcode printer")\n,\n\n("844",\n"laptop",\n"windows")\n,\n\n("997",\n"printer",\n"barcode printer")\n',)
Run Code Online (Sandbox Code Playgroud)
合而为一。而不是换行,\n而是显示。
本来我有一个\n,但是后来我插入了多个,只是看它们是否会显示出来。
第二个问题是整个内容中都有括号,这是我不想要的。
我对这两个问题感到困惑,我想出了第二个问题的解决方案:
函数结尾处有一个逗号。逗号导致函数返回一个元组,而不是单个字符串。
我删除了逗号:
def query_values(data_iterator):
return ',\n'.join('\n({})\n'.format(',\n'.join('"{}"'.format(value) for value in data_row)
) for data_row in data_iterator
)
Run Code Online (Sandbox Code Playgroud)
并且解决了两个问题。现在的输出是:
query_values:
("801",
"printer",
"barcode printer")
,
("844",
"laptop",
"windows")
,
("997",
"printer",
"barcode printer")
Run Code Online (Sandbox Code Playgroud)
我把逗号放回去,并且\n显示了。我删除了逗号,并且再次有多行。
我删除了无关的东西\n,所以现在我得到了想要的:
query_values:
("801","printer","barcode printer"),
("844","laptop","windows"),
("997","printer","barcode printer")
Run Code Online (Sandbox Code Playgroud)
因此,我的代码可以正常工作,但是我\n对旧版本代码中显示的字符完全感到困惑。为什么会这样呢? …
我有一个 pandas DataFrame,需要将其存储到数据库中。这是我当前用于插入的代码行:
df.to_sql(table,con=engine,if_exists='append',index_label=index_col)
Run Code Online (Sandbox Code Playgroud)
如果我的表中不存在任何行,则此方法可以正常工作df。如果行已存在,我会收到此错误:
sqlalchemy.exc.IntegrityError: (psycopg2.IntegrityError) duplicate key
value violates unique constraint "mypk"
DETAIL: Key (id)=(42) already exists.
[SQL: 'INSERT INTO mytable (id, owner,...) VALUES (%(id)s, %(owner)s,...']
[parameters:...] (Background on this error at: http://sqlalche.me/e/gkpj)
Run Code Online (Sandbox Code Playgroud)
并且没有插入任何内容。
PostgreSQL 有可选ON CONFLICT子句,可用于UPDATE现有表行。我阅读了整个pandas.DataFrame.to_sql 手册页,但找不到任何在函数ON CONFLICT内使用的方法DataFrame.to_sql()。
我考虑过根据数据库表中已有的内容将我的 DataFrame 一分为二。所以现在我有两个 DataFrameinsert_rows和update_rows,我可以安全地执行
insert_rows.to_sql(table, con=engine, if_exists='append', index_label=index_col)
Run Code Online (Sandbox Code Playgroud)
但是,似乎没有UPDATE相当于 的东西DataFrame.to_sql()。那么如何使用 DataFrame 更新表呢update_rows?
假设我有两个变量:
>>> a = "hello"
>>> b = "world"
Run Code Online (Sandbox Code Playgroud)
我可以通过两种方式连接它们;使用+:
>>> a = "hello"
>>> b = "world"
Run Code Online (Sandbox Code Playgroud)
或者使用 f 字符串:
>>> a + b
"helloworld"
Run Code Online (Sandbox Code Playgroud)
哪种方式更好或更好的做法?有人告诉我 f-string 在性能和健壮性方面是更好的做法,我想详细了解原因。
我有两个具有相同主键的不相关表。
ip mac
11.11.11.11 48-C0-09-1F-9B-54
33.33.33.33 4E-10-A3-BC-B8-9D
44.44.44.44 CD-00-60-08-56-2A
55.55.55.55 23-CE-D3-B1-39-A6
ip type owner
22.22.22.22 laptop John Doe
33.33.33.33 server XYZ Department
44.44.44.44 VM Mary Smith
66.66.66.66 printer ZWV Department
Run Code Online (Sandbox Code Playgroud)
第一个表每分钟自动刷新一次。我无法更改数据库结构或填充它的脚本。
两个表都有ip作为主键。
在视图中,我想显示一个这样的表:
ip mac type owner Alert
11.11.11.11 48-C0-09-1F-9B-54 Unauthorized
55.55.55.55 23-CE-D3-B1-39-A6 Unauthorized
22.22.22.22 laptop John Doe Down
66.66.66.66 printer ZWV Department Down
33.33.33.33 4E-10-A3-BC-B8-9D server XYZ Department OK
44.44.44.44 CD-00-60-08-56-2A VM Mary Smith OK
Run Code Online (Sandbox Code Playgroud)
我该如何建模?我是否应该将两个主键中的一个作为外键?
代码运行后,将有大量数据,因此我想确保它足够快。
检索数据最快的方法是什么?
更新:
我尝试OneToOneField用于第二张桌子。
这有助于我获得两个表中的记录以及未授权设备的记录(第二个表中缺少IP):
ip mac type owner …Run Code Online (Sandbox Code Playgroud) 在大部分时间使用 VSCode 之后,我将切换回使用 VS2017 进行大部分 Python 开发。在 VSCode 中,我能够很好地使用带有语法高亮和智能感知的 f 字符串。
在 VS2017 中,当我使用 f 字符串时,它只会显示为原始字符串而不突出显示。这在程序运行时有效,但对于调试和编写,它使事情变得更加痛苦。
有谁知道这是否可以添加到VS2017?两者都在运行 python 3.6,所以我认为不应该有问题。
为了澄清,我指的是这些:
f'Hello My Name Is { user.Name }'
Run Code Online (Sandbox Code Playgroud) 我的一个模型中有许多相关对象__str__。这使得管理站点运行速度非常慢。
即使没有明确请求,是否可以以始终执行 prefetch_lated 的方式设置模型?
我有一个代码,可以使用大量注释等从不同的表创建多个复杂的查询集......
然后代码使用 union 连接这些查询集。
每个查询集本身似乎都很好。打电话print(len(qset))对他们每个人都有效。
但之后combined_qset = qset1.union(qset2),我收到以下错误:
django.db.utils.ProgrammingError: each UNION query must have the
same number of columns
LINE 1: ..., '') AS "owner" FROM "t1") UNION (SELECT "field_x...
^
Run Code Online (Sandbox Code Playgroud)
.only(...)当我查看代码时,我计算并调用中的字段数量.values(...),计算注释的数量等,似乎所有这些查询集都具有完全相同的列数。
错误消息仅显示生成的 SQL 的一小部分(见上文),因此它并没有多大帮助。
有没有一种简单的方法来获取查询集的列列表,以便我可以找到差异并修复它?
使用 % 格式,我可以四舍五入字符串中的小数位数:
pi = 3.14159265
print('pi = %0.2f' %pi)
Run Code Online (Sandbox Code Playgroud)
在输出中(在终端中)这会给我:
pi = 3.14
Run Code Online (Sandbox Code Playgroud)
我可以使用 f-strings 来完成这个任务吗?此功能已在 Python 3.6 中添加
python ×7
f-string ×5
string ×4
django ×3
python-3.x ×3
dataframe ×1
formatting ×1
ide ×1
multiline ×1
newline ×1
pandas ×1
performance ×1
postgresql ×1
prefetch ×1
repr ×1
tuples ×1