Запись строк в файл csv в цикле for в python

У меня есть большой CSV-файл, содержащий около 5000 строк. Первый столбец содержит идентификационные имена для каждой строки, например, LHGZZ01. Первые 9 строк имеют имя LHGZZ01, следующие 10 имеют что-то еще и так далее. Шаблона как такового нет, поэтому я использовал np.unique, чтобы найти индекс, в котором меняется имя.

Я хочу написать цикл, который будет записывать каждую строку исходного CSV в новые файлы CSV, содержащие только те же имена в цикле.

datafile = open('source.csv','rb')
reader = csv.reader(datafile)
data = []
idx = []
dataidx = []
next(reader, None)#skip headers
for row in reader:
    d = row[0]
    idx.append(d)
    data.append(row)
    dataidx.append(row[0])

index =np.sort(np.unique(idx,return_index=True)[1])

nme = []#list of unique names
for row in index:
    nm = data[row][0]
    nme.append(nm) 

for i in np.arange(0,9):
    with open(str(out_dir)+str(nme[0])+'.csv','w') as f1:
        row = data[i]
        writer=csv.writer(f1, delimiter=',')#lineterminator='\n',
        writer.writerow(row)

Приведенный выше код записывает первую строку нового csv и останавливается.

Мой вопрос заключается в том, как прокручивать файл source.csv, разделяя данные после каждого нового изменения имени, а затем записывать строки с одинаковым именем строки в уникальный csv?

Извиняюсь за многословный вопрос, но эта проблема, к сожалению, выходит за рамки моих навыков работы с Python и сводит меня с ума.

Любая помощь или предложения с благодарностью

Образец CSV:

Sample csv<br/>
ID  NORTH_DMS   EAST_DMS    DIST    <br/>
LHGZZ01 403921  374459  12500m  <br/>
LHGZZ01 403610  353000  12500m  <br/>
LHGZZ01 404640  360400  12500m  <br/>
LHGZZ01 404515  361900  12500m  <br/>
LHGZZ01 411240  381900  12500m  <br/>
LHGZZ01 415629  400600  12500m  <br/>
LHGZZ01 401503  384400  12500m  <br/>
LHGZZ01 400319  382200  12500m  <br/>
LHGZZ01 403921  372800  12500m  <br/>
LHGZZ02 412000  353200  12500m  <br/>
LHGZZ02 412749  343200  12500m  <br/>
LHGZZ02 403111  353000  12500m  <br/>
LHGZZ02 400600  374459  12500m  <br/>
LHGZZ02 401818  400600  12500m  <br/>
LHGZZ02 401525  393100  12500m  <br/>
LHGZZ02 401605  392400  12500m  <br/>
LHGZZ02 412000  384400  12500m  <br/>
LHGZZ02 372912  382157  8400m   <br/>
GPPHA01 381500  382200  8400m   <br/>
GPPHA01 393000  375252  8400m   <br/>
GPPHA01 395400  370602  8400m   <br/>
GPPHA01 401503  372912  8400m   <br/>
GPPHA01 400831  382157  8400m   <br/>
GPPHA01 390651  365700  8400m   <br/>
GPPHA01 372912  382954  8400m   <br/>
GPPHA02 392130  370602  12500m  <br/>
GPPHA02 400319  364000  12500m  <br/>
GPPHA02 400831  361900  12500m  <br/>
GPPHA02 390651  365700  12500m  <br/>
GPPHA02 382157  400600  12500m  <br/>
GPPHA02 382200  401818  12500m  <br/>
GPPHA02 375252  401525  12500m  <br/>
GPPHA02 385112  401605  12500m  <br/>
GPPHA02 392020  400319  12500m  <br/>
GPPHA02 392130  392130  12500m  <br/>
GPPHA03 392020  392020  9800m   <br/>
GPPHA03 385112  383000  9800m   <br/>
GPPHA03 382954  400600  9800m   <br/>
GPPHA03 365700  364000  9800m   <br/>
GPPHA03 381900  372912  9800m   <br/>
GPPHA03 383000  380700  9800m   <br/>
GPPHA03 392020  373724  9800m   <br/>
GPPHA03 385112  363842  7500m   <br/>
VVDFB01 374459  361210  12500m  <br/>
VVDFB01 353000  360002  12500m  <br/>
VVDFB01 360400  360002  12500m  <br/>
VVDFB01 361900  364000  12500m  <br/>
VVDFB01 381900  360002  12500m  <br/>
VVDFB01 400600  360002  12500m  <br/>
VVDFB01 384400  361210  12500m  <br/>
VVDFB01 382200  350530  12500m  <br/>
VVDFB02 372800  344400  12500m  <br/>
VVDFB02 353200  343100  12500m  <br/>
VVDFB02 343200  351448  12500m  <br/>
VVDFB02 353000  360002  12500m  <br/>
VVDFB02 374459  364000  12500m  <br/>
VVDFB02 400600  351448  12500m  <br/>
VVDFB02 393100  345353  12500m  <br/>
VVDFB02 392400  341731  12500m  <br/>

person user8083    schedule 29.05.2015    source источник
comment
Я думаю, что вы вставили свой код дважды... (при беглом взгляде выглядит дублированным)   -  person Jon Clements♦    schedule 29.05.2015


Ответы (2)


Каждый раз, когда вы открываете файл в режиме w, он перезаписывает все, что там было. Вы должны открыть файл один раз, а затем перебрать вызовы writerow, например:

with open(str(out_dir)+str(nme[0])+'.csv','w') as f1:
    writer=csv.writer(f1, delimiter=',')#lineterminator='\n',
    for i in np.arange(0,9):
        row = data[i]
        writer.writerow(row)

вместо повторного открытия файла на каждой итерации через цикл for

person Eric Renouf    schedule 29.05.2015
comment
Спасибо за ответы ценю это. Я открывал файл в цикле, чтобы попытаться включить его в более крупный цикл, чтобы я мог открыть новый файл после некоторого количества итераций цикла для каждого файла csv с новым именем. У меня так не получается. Спасибо - person user8083; 29.05.2015

Просто чтобы закончить вопрос выше.

Я решил свою проблему (не очень элегантно), открыв/записав все нужные мне файлы csv с атрибутом w. Затем использовал атрибут a для добавления каждого CSV-файла в течение второго цикла for.

Спасибо за ответы

Ваше здоровье

person user8083    schedule 03.06.2015