我正在尝试将此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} 以获得相同的结果?
更改在于将格式字符串应用于未实现__format__
的类型的方式。在您的情况下,您的x
列表中包含None
。您可以删除任何None
(或替换它们(,也可以强制将所有参数格式化为字符串。
# 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,所以很可能有更好的方法来实现第二个选项。