1

我正在尝试将此 python2.7 代码转换为 python3.6

def write_to_zip(x, zf, vocab_start):
    curr_name = "{0}_S{1}_{2}".format(x['study_name'], x['subject_id'], x['repeat_num'])
    vocab_string = x[vocab_start:].to_string(header = False, index = False).replace('\n','').encode("utf-8")
    demo_string = ("{:<25}"*(vocab_start)).format(*x[0:vocab_start].replace(r'', np.nan, regex=True))
    print(demo_string)
    string_to_write = demo_string + vocab_string
    zf.writestr("{}.txt".format(curr_name), string_to_write)

但我收到以下错误demo_string = ("{:<25}"*(vocab_start)).format(*x[0:vocab_start].replace(r'', np.nan, regex=True))

('不支持的格式字符串传递给 NoneType.__format__', '发生在索引 0')

x看起来像:

study_name                 English L1
subject_id                          2
repeat_num                          1
completed                        True
last_modified    2019-08-05 06:57 UTC

并生成demo_string一个

English L1               2                        1                        1                        2019-08-05 06:57 UTC

vocab_start= 34 在这个例子中

我在 Python3 中用什么替换 {:<25} 以获得相同的结果?

4

1 回答 1

1

变化在于格式字符串应用于未实现的类型的方式__format__。在您的情况下,您的x列表中有Nones 。您可以删除任何Nones(或替换它们),或强制将所有参数格式化为字符串。

# Convert `None` values
demo_string = ("{:<25}"*(vocab_start)).format(*('None' if value is None else value for value in x[0:vocab_start].replace(r'', np.nan, regex=True)))

# Force everything to be converted to a string before formatting (with !s)
demo_string = ("{!s:<25}"*(vocab_start)).format(*x[0:vocab_start].replace(r'', np.nan, regex=True))

注意。我不知道 numpy 所以可能有更好的方法来实现第二个选项。

于 2019-10-07T10:52:28.743 回答