2015-09-23 2 views
-2

Я пытаюсь писать списки, как это в файл CSV:Python: Даже после указания разделителя, CSV писатель разграничивает в неправильном месте

['ABC','One,Two','12'] 
['DSE','Five,Two','52'] 

Чтобы файл, например так:

ABC One,Two 12 
DSE Five,Two 52 

В принципе, пишите что-нибудь внутри '' в ячейку. Однако он разбивает один и два на разные ячейки и объединяет ABC с одним в первой ячейке.

Часть моего сценария:

out_file_handle = open(output_path, "ab") 
writer = csv.writer(out_file_handle, delimiter = "\t", dialect='excel', lineterminator='\n', quoting=csv.QUOTE_NONE)  
output_final = (tsv_name_list.split(".")[0]+"\t"+key + "\t" + str(listOfThings)) 
output_final = str([output_final]).replace("[","").replace("]","").replace('"',"").replace("'","") 
output_final = output_final.split("\\t") 
print output_final #gives the first lists of strings I mentioned above. 
writer.writerow(output_final) 

Первая output_final линия дает

ABC One,Two 12 
DSE Five,Two 52 
+0

@StevenRumbalski Да. Но у csv-файла есть ABC \ tOne в ячейке, Two \ t12 в другой ячейке, которую я не пытаюсь написать. – pam

ответ

2

Используя csv модуль просто работает, так что вы будете нуждаться, чтобы быть более конкретными о том, что убедить вас, что элементы кровоточат через клетку. Например, используя (теперь довольно устаревшее) Python 2.7:

import csv 

data_lists = [['ABC','One,Two','12'], 
       ['DSE','Five,Two','52']] 

with open("out.tsv", "wb") as fp: 
    writer = csv.writer(fp, delimiter="\t", dialect="excel", lineterminator="\n") 
    writer.writerows(data_lists) 

Я получаю out.tsv файл:

[email protected]:~/coding$ more out.tsv 
ABC One,Two 12 
DSE Five,Two 52 

или

>>> out = open("out.tsv").readlines() 
>>> for row in out: print repr(row) 
... 
'ABC\tOne,Two\t12\n' 
'DSE\tFive,Two\t52\n' 

, который точно так, как это должно быть. Теперь, если вы возьмете эти строки, которые разделены табуляцией, и по какой-то причине разделили их на запятыми в качестве разделителя, вы уверены, что есть два столбца: один с ABC\tOne и один с Two\t12. Но это было бы глупо.

+0

Спасибо за ваш ответ. Что мне делать, если я хочу использовать .csv вместо .tsv с разделителем табуляции? – pam

+0

@pam: не устанавливайте 'delimiter =" \ t "', в котором говорится, чтобы использовать вкладку в качестве разделителя. :-) Обратите внимание: если вы это сделаете, вы захотите удалить свой 'quoting = csv.QUOTE_NONE', потому что если вы хотите использовать запятые в качестве разделителей, но также иметь запятые в значениях, вам нужно убедиться, что это автоматически цитирует их, чтобы вы могли разбить его правильно позже. – DSM

0

Вы создали писатель CSV, но потом по какой-то причине вы полностью игнорировать его и попытаться вывести на линии вручную. Это бессмысленно. Используйте доступную функциональность.

writer = csv.writer(...) 
for row in tsv_list: 
    writer.writerow(row) 
+0

Спасибо за ответ! Он говорит, что объект 'AttributeError: '_csv.writer' не имеет атрибута 'write''. Когда я делаю writer.writerow, он дает ABC \ tOne в ячейке, Two \ t12 в другой. – pam

+0

Я не уверен, что вы подразумеваете под «ячейкой». Возможно, вы импортируете в Excel, но используете формат с разделителями-запятыми, а не с разделителями с табуляцией? –

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