2016-05-25 9 views
1

Ich versuche, XLS-Blätter in CSV-Dateien zu konvertieren.zurück ein Zeichen während CSV schreiben

workbook1 = xlrd.open_workbook(path+'diseaseData.xls') 
for sheet in workbook1.sheet_names(): 
    sh = workbook1.sheet_by_name(sheet) 
    csvFile = open('//....../disease-'+sheet+'.csv', 'w') 
    wr = csv.writer(csvFile, quoting=csv.QUOTE_ALL) 
    for rownum in range(sh.nrows): 
     # print (sh.row_values(rownum)) 
     wr.writerow(sh.row_values(rownum)) 
    csvFile.close() 

es funktioniert, aber das ausgegebene CSV ist eine leere Zeile nach jeder Zeile

"ID","Caption","Sequela type","Visible","" 

"infection","Infection","infection","1","" 

"acute","Symptomatic infection","acute","1","" 

"asymptomatic","Asymptomatic infection","sequela","1","" 

"ards_long","Permanent disability due to ARDS","sequela","1","" 

"fatalAcute","Fatal cases","sequela","1","" 

Wie kann ich die wr.writerow sagen, dass es das letzte Zeichen überschrieben werden muss?

Ich denke, das würde die zusätzlichen Wagenrückläufe beseitigen.

versuchte ich .strip('\n') aber

AttributeError: 'list' object has no attribute 'strip'

+0

Versuchen Sie '[s für s in Miestrings if s! = '\ N']' oder wenn Sie alle Strings mit Zeilenumbrüchen eliminieren möchten, '[s für s in Miestrings if '\ n' nicht in s]' –

Antwort

3

Sie müssen nicht ein Zeichen zurückgehen. Verwenden Sie einfach das Lineterminator-Argument für den csv-Writer.

wr = csv.writer(csvFile, lineterminator='\n') 

Andere Thread zu diesem Verhalten z. here.

+0

Awesome, lassen Sie die Bibliothek immer die String-Verarbeitung für Sie tun, es sei denn, Sie haben einen guten Grund, nicht zu! Ich wusste, dass es eine gute Antwort auf diese Frage gab. –

0

Wenn die Strings in der Liste müssen \n von ihnen entfernt, strip verwenden haben:

>> a = ["\nfrog", "\ncow", "\nsnake"] 
>> print map(str.strip, a) 
['frog', 'cow', 'snake'] 

Wenn die Liste \n von ihm entfernt haben muss, versuchen Sie remove für ein einzelnes Element oder ein Listenverständnis wie dieses für alle von ihnen:

b = [x for x in a if not x == "\n"] 

remove hat den Vor-/Nachteil, die ursprüngliche Liste zu ändern. Sie könnten remove auf der Liste while "\n" in list aufrufen.

+1

Ich liebe "map" das funktionale Paradigma, aber es ist mehr idiomatisch und in python besser lesbar, um comprehensions zu verwenden, zB '[x.strip() für x in a]' –

+0

es ist die Liste, die ein '\ n' hat zu viel, nicht jedes Element der Liste. (Da hier eine Liste eine CSV-Zeile ist und ein Element der Liste 1 Wert ist) habe ich 'wr.writerow (map (str.strip, sh.row_values ​​(rownum))) 'versucht, aber es funktioniert nicht, derselbe Fehler –