Я использую приведенный ниже код для редактирования CSV с использованием Python. Функции, вызываемые в коде, образуют верхнюю часть кода.
Проблема: я хочу, чтобы приведенный ниже код начал редактировать CSV со 2-й строки, я хочу, чтобы он исключил 1-ую строку, которая содержит заголовки. Прямо сейчас это применяет функции только к 1-й строке, и моя строка заголовка изменяется.
in_file = open("tmob_notcleaned.csv", "rb")
reader = csv.reader(in_file)
out_file = open("tmob_cleaned.csv", "wb")
writer = csv.writer(out_file)
row = 1
for row in reader:
row[13] = handle_color(row[10])[1].replace(" - ","").strip()
row[10] = handle_color(row[10])[0].replace("-","").replace("(","").replace(")","").strip()
row[14] = handle_gb(row[10])[1].replace("-","").replace(" ","").replace("GB","").strip()
row[10] = handle_gb(row[10])[0].strip()
row[9] = handle_oem(row[10])[1].replace("Blackberry","RIM").replace("TMobile","T-Mobile").strip()
row[15] = handle_addon(row[10])[1].strip()
row[10] = handle_addon(row[10])[0].replace(" by","").replace("FREE","").strip()
writer.writerow(row)
in_file.close()
out_file.close()
Я пытался решить эту проблему, инициализируя row
переменную, 1
но это не сработало.
Пожалуйста, помогите мне в решении этой проблемы.
python
python-2.7
csv
Мартейн Питерс
источник
источник
Ответы:
Ваша
reader
переменная является итеративной, зацикливая ее, вы получаете строки.Чтобы пропустить один элемент перед циклом, просто вызовите
next(reader, None)
и проигнорируйте возвращаемое значение.Вы также можете немного упростить свой код; используйте открытые файлы в качестве контекстных менеджеров, чтобы они автоматически закрывались:
Если вы хотите , чтобы написать заголовок в выходной файл необработанного, который легко тоже передавать вывод
next()
наwriter.writerow()
:источник
for row in islice(reader, 1, None)
- хотя и менее явно , чемnext
для большинства простых «пропустить одну строку» рабочих мест, для пропуска нескольких строк заголовка (или получать только определенные куски и т.д. ...) , это очень удобноtry: writer.write(next(reader))... except StopIteration: # handle empty reader
try:
/except:
.next
итерации в том, что она «бесплатная»;islice
обернул быreader
навсегда добавляя (по общему признанию очень небольшое количество) накладные расходы к каждой итерации.consume
Рецепт отitertools
может быть использован , чтобы пропустить много значений быстро, без добавления упаковки для последующего использования, в том случае , еслиislice
не будет иметь ,start
но неend
, так что накладные расходы не получает ничего вам.Другим способом решения этой проблемы является использование класса DictReader, который «пропускает» строку заголовка и использует ее для разрешения именованной индексации.
Дано "foo.csv" следующим образом:
Используйте DictReader следующим образом:
источник
If the fieldnames parameter is omitted, the values in the first row of the file f will be used as the fieldnames.
см. Docs.python.org/2/library/csv.htmlВыполнение
row=1
ничего не изменит, потому что вы просто перезапишете это результатами цикла.Вы хотите сделать,
next(reader)
чтобы пропустить один ряд.источник
for row in next(reader):
но это дает мнеIndexError: string index out of range
ошибкуnext(reader); for row in reader:
....