2016-10-22 7 views
0

Ниже приведен код python, который работает в файле, подобном этому (old_file.csv).Заменить значение определенного столбца во всех строках без заголовка

A,B,C,D 
1,2,XX,3 
11,22,XX,33 
111,222,XX,333 

Как я могу перебрать все строки в old_file.csv (если я не знаю длину файла) и заменить все значения в столбце C или индекс 2 или клеток [ряд] [2] (на основе ячеек [строка] [col]). Но я бы хотел проигнорировать строку заголовка. В new_file.csv все значения, содержащие «XX», станут, например, «YY».

import csv 
r = csv.reader(open('old_file.csv')) 
cells = [l for l in r] 
cells[1][2] = 'YY' 
cells[2][2] = 'YY' 
cells[3][2] = 'YY' 
w = csv.writer(open('new_file.csv', 'wb')) 
w.writerows(cells) 
+0

Где 'lines' приходит? – Soviut

+0

должно быть «ячейками» – MacGyver

ответ

1

Просто небольшое изменение в @Soviut анс, попробуйте это, я думаю, что это поможет вам

import csv 

rows = csv.reader(open('old_file.csv')) 
newRows=[] 
for i, row in enumerate(rows): 
    # ignore the first row, modify all the rest 
    if i > 0: 
     row[2] = 'YY'  
    newRows.append(row) 
# write rows to new CSV file, no header is written unless explicitly told to 
w = csv.writer(open('new_file.csv', 'wb')) 
w.writerows(newRows) 
0

читатель CSV делает массивы, так что вы можете просто запустить его на r[1:]

+0

Не могли бы вы быть конкретными? Я никогда не писал сценарий Python. – MacGyver

+0

Вы спросили, как игнорировать строку заголовка. В вашем цикле 'for' вместо запуска на' r', запустите на 'r [1:]' –

0

len(cells) это количество строк. Итерирование с 1 заставляет пропустить строку заголовка. Также lines должен быть cells.

import csv 
    r = csv.reader(open('old_file.csv')) 
    cells = [l for l in r] 
    for i in range(1, len(cells)): 
     cells[i][2] = 'YY' 
    w = csv.writer(open('new_file.csv', 'wb')) 
    w.writerows(cells) 
1

Вы можете очень легко перебрать массив строк и заменить значения в целевой ячейке.

# get rows from old CSV file 
rows = csv.reader(open('old_file.csv')) 

# iterate over each row and replace target cell 
for i, row in enumerate(rows): 
    # ignore the first row, modify all the rest 
    if i > 0: 
     row[2] = 'YY' 

# write rows to new CSV file, no header is written unless explicitly told to 
w = csv.writer(open('new_file.csv', 'wb')) 
w.writerows(rows) 
+0

Обратите внимание, что это также заменит элемент в строке заголовка, чего вы не хотели. На самом деле простое исправление, как в 'для строки в строках [1:]', сделает трюк. Но вы должны обрабатывать пустой файл, иначе «IndexError» возможен. – table

0
read_handle = open('old_file.csv', 'r') 
data = read_handle.read().split('\n') 
read_handle.close() 
new_data = [] 
new_data.append(data[0]) 
for line in data[1:]: 
    if not line: 
     new_data.append(line) 
     continue 
    line = line.split(',') 
    line[2] = 'YY' 
    new_data.append(','.join(line)) 
write_handle = open('new_file.csv', 'w') 
write_handle.writelines('\n'.join(new_data)) 
write_handle.close() 
+0

Во-первых, это приведет к сбою с IndexError в пустом файле. Во-вторых, 'csv' является встроенным пакетом python, поэтому, когда вы работаете с CSV-файлами, гораздо предпочтительнее использовать его. – table

+0

Согласен. Благодарю. Тем не менее, ответ специфичен для вопроса и не обязательно обрабатывает все возможные сценарии ошибок - например, строка, содержащая только 2 элемента (так что строка [2] также вызывает IndexError). Что касается модуля csv, если использование так же просто, как описано в que, я не вижу никаких дополнительных преимуществ использования модуля csv. – Sharad

+0

Вот один оболочка оболочки (он обрезает пустые строки): head -1 old_file.csv && cat old_file.csv | awk -F, -v OFS =, 'NF && NR> 1 {$ 3 = "YY"; print} '| tee new_file.csv – Sharad

Смежные вопросы