2015-07-18 2 views
0

Я использую модуль csv Python3 и задаюсь вопросом, почему я не могу правильно управлять цитированием. Я использую опцию quoting = csv.QUOTE_NONNUMERIC, но я все еще вижу все цитируемые записи. Любая идея, почему это так?Как управлять цитированием на не числовых записей в файле csv?

Вот мой код. По сути, я читаю в .csv файл и хочу удалить все повторяющиеся строки, которые имеют ту же строку:

import sys 
    import csv 

    class Row: 
     def __init__(self, row): 
      self.text, self.a, self.b = row 
      self.elements = row 


    with open(sys.argv[2], 'w', newline='') as output: 

     writer = csv.writer(output, delimiter=';', quotechar='"', 
     quoting=csv.QUOTE_NONNUMERIC) 

     with open(sys.argv[1]) as input: 

      reader = csv.reader(input, delimiter=';') 

      header = next(reader) 

      Row.labels = header   
      assert Row.labels[1] == 'Label1' 

      writer.writerow(header) 
      texts = set() 

      for row in reader: 

       row_object = Row(row) 

       if row_object.text not in texts: 
        writer.writerow(row_object.elements) 
        texts.add(row_object.text) 

Когда я смотрю на сгенерированный файл, содержание выглядит следующим образом:

"Label1";"Label2";"Label3" 
    "AAA";"123";"456" 
    ... 

Но я хочу этого:

"Label1";"Label2";"Label3" 
    "AAA";123;456 
    ... 

ответ

0

ОК ... Я сам это понял. Ответ, я боюсь, был довольно простым - и очевидным в ретроспективе. Поскольку содержимое каждой строки получается из csv.reader(), ее элементы по умолчанию являются строками. В результате получается, что цитируемый впоследствии использованный csv.writer().

Лечиться как int, они сначала должны быть поданы к int:

row_object.elements[1]= int(row_object.a) 

Это объяснение может быть доказано, вставив проверку типа до и после этого броска:

print('Type: {}'.format(type(row_object.elements[1]))) 
Смежные вопросы