Запись списка списков в текстовый файл, по одному списку за раз - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть код ниже:

data=[(24, 'Sale', 0, 15), (16, 'Buy', 18, 0)]
with open('txt_file.txt', 'w') as x:
    for sub_list in data:
        for item in sub_list:  #Since attempt to write whole giv error
            print(item)      
            x.write(str(item) + '   ')

Как мне получить один список из «данных», который представляет собой список списков, записать его в одну строку и перейти к следующей строке, прежде чем извлечь другой список? Мне нужно, чтобы текстовый файл выглядел так:

24 Sale 0 15
16 Buy 18 0

Ответы [ 5 ]

0 голосов
/ 07 ноября 2018

Мой подход основан на вашей идее с небольшим количеством настроек (1. используйте шаблон формата, чтобы вы могли настроить окончательный вид, и 2), используя распаковку.) Окончательный код выглядит так, кроме этого, сделайте правильный шаблон формата:

data=[(24, 'Sale', 0, 15), (16, 'Buy', 18, 0)]
FMT = '{}   {}   {}'

with open('txt_file.txt', 'w') as x:
    for item in data:
        record = FMT.format(*item)
        print(record)
        x.write(record + '\n')
0 голосов
/ 07 ноября 2018

"\n" делает трюк:

data=[(24, 'Sale', 0, 15), (16, 'Buy', 18, 0)]
with open('txt_file.txt', 'w') as x:
    for sub_list in data:
        for item in sub_list:  #Since attempt to write whole giv error
            print(item)      
            x.write(str(item) + '   ')
        x.write("\n")
0 голосов
/ 07 ноября 2018

попробуйте это:

with open('txt_file.txt','wt') as f:
    [f.write(' '.join([str(it) for it in item])+'\n') for item in data]
0 голосов
/ 07 ноября 2018

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

for item in sub_list:  #Since attempt to write whole giv error
    x.write(str(item) + '   ')
x.write('\n')

Однако встроенный модуль csv обрабатывает список строк, целых чисел и т. Д. Автоматически (также обрабатывает строки с пробелами в них, заключая их в кавычки):

data=[(24, 'Sale', 0, 15), (16, 'Buy', 18, 0)]
with open('txt_file.txt', 'w', newline="") as x:
   csv.writer(x,delimiter=" ").writerows(data)

метод writerows может написать коллекцию кортежей или списков. Именно то, что вам нужно. Единственное отличие состоит в том, что csv не может разделять данные более чем одним символом (разделители с несколькими символами не допускаются). Вам придется обходиться 1 пробелом.

0 голосов
/ 07 ноября 2018

Самый краткий способ сделать это будет следующим:

with open('txt_file.txt', 'w') as x:
    x.write('\n'.join(' '.join(map(str, row)) for row in data))
...