【问题标题】:Python: TypeError: Unsupported format string passed to NoneType.__format__Python:TypeError:传递给 NoneType.__format__ 的格式字符串不受支持
【发布时间】:2019-09-21 15:06:30
【问题描述】:

我有一个程序当前从数据库中读取,可以找到here。我让用户选择他们想要显示的特定记录,以便 SQL 命令执行该记录。现在我有一个表,它当前显示一些不包含任何 NULL 或空字符串的记录。如果它确实有 NULL 或空字符串,它会给我一个错误并且程序不显示记录。我认为这就是 NoneType 错误的主要来源。我不知道如何解决这个问题。如何确保它也计算 Null 或空字符串?希望这能修复错误。

如果您要尝试测试数据库,则不会显示诸如客户之类的表,因为它具有空值。

这是回溯错误:

line '..', in read_display(record)
    line = format_.format(*rec)
TypeError: unsupported format string passed to NoneType.__format__

这是我的代码的样子:

import sqlite3

def read_display(record):
  database = 'data.db'
  connection = sqlite3.connect(database)
  c = connection.cursor()
  sql = "SELECT * FROM {0}".format(record)
  cursor.execute(sql)
  conn.commit()
  results = cursor.fetchall()

  header = tuple(i[0] for i in c.description)
  width = max((len(str(x)) for d in data for x in d))

  data = [header] + results

  config = [{'width': 0} for _ in range(len(data[0]))]

  for rec in data:
    for c, value in enumerate(rec):
        config[c]['width'] = max(config[c]['width'], len(str(value)))


  format_ = []
  for f in config:
    format_.append('{:<' + str(f['width']) + '}')

  format_ = ' | '.join(format_)
  for rec in data:
    line = format_.format(*rec)
    print(line)

【问题讨论】:

  • line = format_.format(*rec) 之前检查print(format_, rec) - 它接缝format_recNone。您可以使用'{:s}'.format(None) 得到相同的错误
  • @furas 当我使用我的调试器时,似乎 format_ 没有读取 None 因为我认为它不会将 None 识别为字符串。它会跳过其他字符并转到下一个字符串,例如“SupplierID”,并将其计为“{:
  • None 不是字符串,因此无法将其识别为字符串。您必须将其转换为字符串str(None)。您可以对所有元素使用str(),以确保:rec = [str(x) for x in rec]
  • 我应该把 rec = [str(x) for x in rec] 放在 line = format_.format(*rec) 之前以使 None 成为字符串吗?
  • 是的。你可以先试一下再问。这样你也可以学到一些东西。而且您不必等待我的回答。

标签: python sql database sqlite


【解决方案1】:

line = format_.format(*rec) 有错误,'{:s}'.format(None) 也有同样的错误,所以rec 似乎在列表中有None

您必须使用 str(None) 将其转换为字符串

您可以将str()rec 中的所有元素一起使用以确保:

 rec = [str(x) for x in rec]

所以代码应该是

for rec in data:
    rec = [str(x) for x in rec]
    line = format_.format(*rec)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2015-06-19
    • 1970-01-01
    • 2017-12-30
    • 2021-10-31
    • 2021-09-05
    相关资源
    最近更新 更多