2014-01-08 2 views
0

У меня есть файл CSV. Затем у меня есть некоторые правила, которые необходимо применить, а затем создайте новый CSV на основе правил.Python CSV, добавление или изменение данных столбца

Так он может пойти двумя путями:

  1. Добавить новый столбец, со своим собственным заголовком и данными
  2. Возьмите существующий столбец и изменить данные этого столбца.

Это то, что я до сих пор

def applyRules(directory): 
    FILES = [] 
    for f in listdir(OUTPUT_DIR): 
     writer = csv.writer(open("%s%s" % (DZINE_DIR, f), "wb")) 
     for rule in Substring.objects.filter(source_file=f): 

      from_column = rule.from_column 
      to_column = rule.to_column 

      reader = csv.DictReader(open("%s%s" % (OUTPUT_DIR, f))) 

      headers = reader.fieldnames 

      for row in reader: 
       if rule.get_rule_type_display() == "substring": 
        string = rule.string.split(",") 
        # alter value 
        row[to_column] = string[0] + row[from_column] + string[1] 
        if rule.from_column == rule.to_column: 
         print rule.from_column 
        else: 
         print rule.from_column 

Правило как FROM_COLUMN и TO_COLUMN, если они одинаковы, то столбец остается прежним, но данные должны быть обновлены с правило, в этом случае просто добавляя строку до и после текущего значения.

Когда TO_COLUMN отличается, то его просто новый столбец с измененными данными, как указано выше в новом столбце.

Так в настоящее время я просто изменяя значения Dict, но я не уверен, как получить его обратно в новый CSV и т.д.

ответ

1

Если открыть выходной файл как DictWriter() объект, то вы можете выписать ваши измененные словари довольно легко. Вам необходимо заранее определить свои дополнительные полевые имена:

with open(os.path.join(OUTPUT_DIR, f), 'rb') as rfile: 
    reader = csv.DictReader(rfile) 
    headers = reader.fieldnames 

    rules = Substring.objects.filter(source_file=f).all() 

    # pre-process the rules to determine the headers 
    for rule in rules: 
     from_column = rule.from_column 
     to_column = rule.to_column 

     if from_column not in headers: 
      # problem; perhaps raise an error? 
     if to_column not in headers: 
      headers.append(to_column 

    with open(os.path.join(DZINE_DIR, f), "wb") as wfile: 
     writer = csv.DictWriter(wfile, fieldnames=headers) 
     for row in reader: 
      for rule in rules: 
       from_column = rule.from_column 
       to_column = rule.to_column 

       if rule.get_rule_type_display() == "substring": 
        string = rule.string.split(",") 
        row[to_column] = string[0] + row[from_column] + string[1] 

      writer.writerow(reader) 
Смежные вопросы