Python: добавить столбец в файл CSV на основе существующего столбца

#python #csv

#питон #csv-файл #python #csv

Вопрос:

Я уже написал, что мне нужно для определения и анализа значения, которое я ищу, мне нужна помощь в записи столбца в csv-файл (или новый csv-файл) с проанализированным значением. Вот некоторый псевдокод / несколько реалистичный код Python для того, что я пытаюсь сделать:

 # Given a CSV file, this function creates a new CSV file with all values parsed
def handleCSVfile(csvfile):
  with open(csvfile, 'rb') as file:
    reader = csv.reader(file, delimiter=',', lineterminator='n')
    for row in reader:
        for field in row:
          if isWhatIWant(field):
            parsedValue = parse(field)
            # write new column to row containing parsed value
  

Я уже написал функции isWhatIWant и. parse Если мне нужно написать совершенно новый csv-файл, то я не уверен, как открыть оба файла одновременно, а также читать и записывать из одного в другой.

Ответ №1:

Я бы сделал это так. Я предполагаю, isWhatIWant() что это то, что должно заменить поле на месте.

 import csv

def handleCSVfile(infilename, outfilename):
    with open(infilename, 'rb') as infile:
        with open(outfilename, 'wb') as outfile:
            reader = csv.reader(infile, lineterminator='n')
            writer = csv.writer(outfile, lineterminator='n')

            for row in reader:
                for field_index, field in enumerate(row):
                    if isWhatIWant(field):
                        row[field_index] = parse(field)
                writer.writerow(row)
  

Такой шаблон встречается часто и приводит к очень длинным строкам. Иногда может быть полезно разделить логику открытия и файлов на другую функцию, например:

 import csv

def load_save_csvfile(infilename, outfilename):
    with open(infilename, 'rb') as infile:
        with open(outfilename, 'wb') as outfile:
            reader = csv.reader(infile, lineterminator='n')
            writer = csv.writer(outfile, lineterminator='n')

            read_write_csvfile(reader, writer)

def read_write_csvfile(reader, writer)
    for row in reader:
        for field_index, field in enumerate(row):
            if isWhatIWant(field):
                row[field_index] = parse(field)
        writer.writerow(row)
  

Это модулирует код, упрощая вам изменение способа обработки файлов и форматов из логики независимо друг от друга.

Дополнительные подсказки:

  • Не называйте переменные file , поскольку это встроенная функция. Затенение этих имен укусит вас, когда вы меньше всего этого ожидаете.
  • delimiter=',' используется по умолчанию, поэтому вам не нужно указывать его явно.

Комментарии:

1. Это имеет смысл. Я запутался только в одной части. Моя функция parse получает только искомое значение и возвращает проанализированное значение. Он не выполняет никакой обработки файлов. isWhatIWant просто возвращает true или false в зависимости от того, является ли поле тем, что я ищу. Я не уверен, как заставить это работать с этой моделью….

2. Это работает лучше, если вы можете привести полный минимальный пример, включая определение этих функций (определение заглушки подойдет). Код, который я написал, предполагает, что isWhatIWant() возвращает что-то, что может быть интерпретировано как True или False и, которое parse() примет одно значение поля и вернет другое. Какую часть этого мы можем помочь вам понять?

3. Неважно, это отлично работает. Единственная проблема заключается в том, что для имени файла требовались w b разрешения, rwb было недопустимым, это была единственная проблема. В противном случае это работает отлично. Спасибо,

4. Моя ошибка там. «wb» тоже должно быть хорошо. Я собираюсь отредактировать ответ.