Пропустить заголовки при редактировании файла csv с помощью Python
Я использую приведенный ниже код для редактирования csv с использованием Python. Функции, вызываемые в форме кода, составляют верхнюю часть кода.
Проблема: я хочу, чтобы приведенный ниже код начал редактирование csv из второй строки, я хочу, чтобы он исключил первую строку, содержащую заголовки. Сейчас он применяет функции только в 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
, но она не сработала.
Пожалуйста, помогите мне в решении этой проблемы.
Ответы
Ответ 1
Ваша переменная reader
является итерируемой, перебирая ее, вы извлекаете строки.
Чтобы пропустить один элемент перед вашим циклом, просто вызовите next(reader, None)
и проигнорируйте возвращаемое значение.
Вы также можете немного упростить свой код; используйте открытые файлы в качестве контекстных менеджеров, чтобы они автоматически закрывались:
with open("tmob_notcleaned.csv", "rb") as infile, open("tmob_cleaned.csv", "wb") as outfile:
reader = csv.reader(infile)
next(reader, None) # skip the headers
writer = csv.writer(outfile)
for row in reader:
# process each row
writer.writerow(row)
# no need to close, the files are closed automatically when you get to this point.
Если вы хотите записать заголовок в выходной файл необработанным, это тоже легко, передайте вывод next()
в writer.writerow()
:
headers = next(reader, None) # returns the headers or `None` if the input is empty
if headers:
writer.writerow(headers)
Ответ 2
Другим способом решения этого является использование класса DictReader, который "пропускает" строку заголовка и использует его для разрешенной именованной индексации.
Учитывая "foo.csv" следующим образом:
FirstColumn,SecondColumn
asdf,1234
qwer,5678
Используйте DictReader следующим образом:
import csv
with open('foo.csv') as f:
reader = csv.DictReader(f, delimiter=',')
for row in reader:
print(row['FirstColumn']) # Access by column header instead of column number
print(row['SecondColumn'])
Ответ 3
Выполнение row=1
ничего не изменит, потому что вы просто перезапишите это с помощью результатов цикла.
Вы хотите сделать next(reader)
, чтобы пропустить одну строку.