Python - записать переменную, созданную в al oop, в выходной файл - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть функция, которая берет вложенный список, который я ввожу, и записывает его в консоль в нужном мне формате.

def print_table(table):
    longest_cols = [(max(
        [len(str(row[i])) for row in table]) + 2) 
        for i in range(len(table[0]))]
    row_format = "".join(["{:>" + str(longest_col) + "}" 
        for longest_col in longest_cols])
    for row in table:
        print(row_format.format(*row))

Как мне изменить функцию, чтобы она записывала вывод в выходной файл?

Я попытался сделать это, сказав

x = print_table(table)

, а затем

f.write(x)
f.close()

Но все, что он сделал, это ничего не записал в выходной файл

Любая помощь в этом очень ценится. Спасибо!

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020

Когда вы определяете функцию и вызываете ее, вы должны использовать return, чтобы назначить ее чему-либо.
Но если ее row_format.format(*row) вы хотите сохранить, откройте ее в функции:

def print_table(table,f):
    longest_cols = [ (max([len(str(row[i])) for row in table]) + 2) for i in range(len(table[0]))]
    row_format = "".join(["{:>" + str(longest_col) + "}" for longest_col in longest_cols])
    for row in table:
        f.write(row_format.format(*row))
    f.close()

Теперь просто назовите это:

print_table(table,f)

Допустим, вы хотите добавить его построчно, затем используйте:

for row in table:
    f.seek(0)
    f.write("\n") #not possible if file opened as byte
    f.write(row_format.format(*row))

Теперь, если вы этого хотите по-вашему, попробуйте:

def print_table(table):
    longest_cols = [(max(
        [len(str(row[i])) for row in table]) + 2) 
        for i in range(len(table[0]))]
    row_format = "".join(["{:>" + str(longest_col) + "}" 
        for longest_col in longest_cols])
    return '\n'.join(row_format.format(*row) for row in table)

Теперь назовите это:

x = print_table(table)
f.write(x)
f.close()
2 голосов
/ 08 апреля 2020

Есть много способов решить эту проблему, в зависимости от того, какие обязанности вы хотите выполнять в своей функции. Вы могли бы иметь функцию форматирования таблицы, но оставить вывод вызывающей стороне (это может быть более полезным, если вызывающая сторона хочет, чтобы отформатированная таблица была go в разных местах)

def print_table(table):
    longest_cols = [(max(
        [len(str(row[i])) for row in table]) + 2) 
        for i in range(len(table[0]))]
    for longest_col in longest_cols:
        yield "".join(["{:>" + str(longest_col) + "}" 

with open("foo.txt", "w") as f:
    f.writelines(row + "\n" for row in print_table(table))

Или вы могли бы дать передать ответственность функции и передать ей желаемый поток вывода

import sys

def print_table(table, file=sys.stdout):
    longest_cols = [(max(
        [len(str(row[i])) for row in table]) + 2) 
        for i in range(len(table[0]))]
    row_format = "".join(["{:>" + str(longest_col) + "}" 
        for longest_col in longest_cols])
    for row in table:
        print(row_format.format(*row), file=file)

with open("foo.txt", "w") as f:
    print_table(table, f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...