2016-11-21 3 views
0

Я пишу сценарий для записи списка с вкладкой, разделенной, как показано ниже, в файл csv. Но я не получаю должного результата.Python csv написать список в файл

out_l = ['host\tuptime\tnfsserver\tnfs status\n', 'node1\t2\tnfs_host\tok\n', 'node2\t100\tnfs_host\tna\n', 'node3\t59\tnfs_host\tok\n'] 

код:

out_f = open('test.csv', 'w') 
w = csv.writer(out_f) 

for l in out_l: 
    w.writerow(l) 
out_f.close() 

Выходной файл CSV читает, как показано ниже.

h,o,s,t, ,s,s,h, , , , , ,s,u,d,o,_,h,o,s,t, , , , , , , ,n,f,s," 
"1,9,2,.,1,6,8,.,1,2,2,.,2,0,1, ,o,k, ,n,f,s,h,o,s,t, ,o,k," 
"1,9,2,.,1,6,8,.,1,2,2,.,2,0,2, ,f,a,i,l,e,d, ,n,a, ,n,a," 
"1,9,2,.,1,6,8,.,1,2,2,.,2,0,3, ,o,k, ,n,f,s,h,o,s,t, ,s,h,o,w,m,o,u,n,t, ,f,a,i,l,e,d," 

"

Кроме того, я проверил вариант csv.writer как разделитель, диалект = первенствовать, но не повезло. Может кто-то один поможет форматировать вывод?

ответ

0

С форматированием вы имеете в out_l, вы можете просто записать его в файл:

out_l = ['host\tuptime\tnfsserver\tnfs status\n', 'node1\t2\tnfs_host\tok\n', 'node2\t100\tnfs_host\tna\n', 'node3\t59\tnfs_host\tok\n'] 

with open('test.csv', 'w') as out_f: 
    for l in out_l: 
     out_f.write(l) 

Чтобы правильно использовать csv, out_l просто должны быть списки столбцов, и пусть csv модуль сделать форматирование с вкладки и переводы строк:

import csv 

out_l = [['host','uptime','nfsserver','nfs status'], 
     ['node1','2','nfs_host','ok'], 
     ['node2','100','nfs_host','na'], 
     ['node3','59','nfs_host','ok']] 

#with open('test.csv', 'wb') as out_f:   # Python 2 
with open('test.csv', 'w', newline='') as out_f: # Python 3 
    w = csv.writer(out_f, delimiter='\t')  # override for tab delimiter 
    w.writerows(out_l)       # writerows (plural) doesn't need for loop 

Обратите внимание, что with автоматически закроет файл.

Для того, чтобы открыть файл с csv.reader или csv.writer, см. csv documentation.

0

Метод csv.Writer.writerow принимает итератор, и записывает сказал итерацию производит в CSV полей, разделенных указанной разделители:

out_f = open('test.csv', 'w') 
w = csv.writer(out_f, delimiter='\t') # set tab as delimiter 

for l in out_l: # l is string (iterable of chars!) 
    w.writerow(l.split('\t')) # split to get the correct tokens 
out_f.close() 

как строка s в вашем списке уже содержат необходимые вкладки, вы можете просто записать их непосредственно в файл, не требуя каких-либо инструментов csv. Если вы построили/присоединили строки в out_l вручную, вы можете опустить этот шаг и просто передать исходную структуру данных до writerow.

+0

Если запятые являются обязательными, вы можете найдите и замените вкладки запятыми в своем списке, затем используйте метод shwobaseggl, вместо этого вместо запятой установите разделитель. –

+0

Это работало. Спасибо вам за помощь. – Jijo

0

delimiter Параметр

Параметр delimiter контролирует разделитель в выходе. Он не имеет ничего общего с входом out_l.

Почему ваш выход искажается

csv.writer.writerow перебирает входные. В вашем случае вы даете ему строку (host\tuptime\tnfsserver\tnfs status\n' и т. Д.), Поэтому функция выполняет итерацию строки, предоставляя вам последовательность символов.

Как произвести правильный выход

Дайте ему список полей вместо полной строки с помощью str.split().В вашем случае строка заканчивается \n, так что используйте str.strip(), а также:

import csv 

out_l = ['host\tuptime\tnfsserver\tnfs status\n', 
     'node1\t2\tnfs_host\tok\n', 
     'node2\t100\tnfs_host\tna\n', 
     'node3\t59\tnfs_host\tok\n'] 
out_f = open('test.csv', 'w') 
w = csv.writer(out_f) 
for l in out_l: 
    w.writerow(l.strip().split('\t')) 
out_f.close() 

Это должно быть то, что вы хотите:

host,uptime,nfsserver,nfs status 
node1,2,nfs_host,ok 
node2,100,nfs_host,na 
node3,59,nfs_host,ok 

Ссылка: https://docs.python.org/3/library/csv.html

Смежные вопросы