Как я могу изменить форматирование "{: <25}" в обновлении Python 2 до 3 - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь преобразовать этот код 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 в этом примере

Чем заменить {: <25} в Python3, чтобы получить тот же результат? </p>

1 Ответ

1 голос
/ 07 октября 2019

Изменение заключается в том, что строки формата применяются к типам, которые не реализуют __format__. В вашем случае список x содержит None s. Вы можете удалить любые None s (или заменить их) или принудительно отформатировать все аргументы как строки.

# 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))

NB. Я не знаю numpy, так что, возможно, есть лучший способ реализовать второй вариант.

...