2017-02-07 4 views
-2

Я новичок в Python и у меня есть следующий файл CSV (назовем его out.csv):Усекать столбец csv-файла?

DATE,TIME,PRICE1,PRICE2 
2017-01-15,05:44:27.363000+00:00,0.9987,1.0113 
2017-01-15,13:03:46.660000+00:00,0.9987,1.0113 
2017-01-15,21:25:07.320000+00:00,0.9987,1.0113 
2017-01-15,21:26:46.164000+00:00,0.9987,1.0113 
2017-01-16,12:40:11.593000+00:00,,1.0154 
2017-01-16,12:40:11.593000+00:00,1.0004, 
2017-01-16,12:43:34.696000+00:00,,1.0095 

и я хочу, чтобы укоротить второй столбец так CSV выглядит следующим образом:

DATE,TIME,PRICE1,PRICE2 
2017-01-15,05:44:27,0.9987,1.0113 
2017-01-15,13:03:46,0.9987,1.0113 
2017-01-15,21:25:07,0.9987,1.0113 
2017-01-15,21:26:46,0.9987,1.0113 
2017-01-16,12:40:11,,1.0154 
2017-01-16,12:40:11,1.0004, 
2017-01-16,12:43:34,,1.0095 

Это то, что я до сих пор ..

with open('out.csv','r+b') as nL, open('outy_3.csv','w+b') as nL3: 
    new_csv = [] 
    reader = csv.reader(nL) 
    for row in reader: 
     time = row[1].split('.') 
     new_row = [] 
     new_row.append(row[0]) 
     new_row.append(time[0]) 
     new_row.append(row[2]) 
     new_row.append(row[3]) 
     print new_row 
     nL3.writelines(new_row) 
  1. Я не могу показаться, чтобы получить новую строку в после записи каждой строки в новый файл csv.
  2. Это, безусловно, не смотрит или чувствовать себя вещий

Благодаря

+1

Кажется, вы уже пробовали некоторые из них. Не могли бы вы показать мне, что вы сделали? – sangheestyle

+0

Значит, вы хотите, чтобы кто-то написал вам _two_ фрагменты кода, чтобы показать как пифонические, так и непифонные способы сделать это? Проблема в том, что может быть более одного из первых и, вероятно, это бесконечное число последних ... Наверное, лучший способ научиться чему-то - попробовать самому кодировать его, и если вы не сможете заставить его работать или подумайте, что может быть гораздо лучший подход, а затем задавайте вопросы здесь. – martineau

+0

@martineau - это лучше? – nrs90

ответ

0

Проблема отсутствует новой строки, потому что метод file.writelines() не автоматически добавлять разделители строк в элементах аргумента она передается, что он рассчитывает быть последовательностью строк. Если эти элементы представляют собой отдельные строки, то ваша ответственность за то, чтобы каждая из них заканчивалась в новой строке.

Однако ваш код пытается использовать его для вывода только одной строки вывода. Чтобы исправить это, вы должны использовать file.write() вместо этого, потому что он ожидает, что его аргумент будет одной строкой, и если вы хотите, чтобы эта строка была отдельной строкой в ​​файле, она должна заканчиваться новой строкой или добавлять к ней одну ручную.

Ниже приведен код, который делает то, что вы хотите. Он работает, изменяя один из элементов списка строк, который csv.reader возвращает на месте, а затем записывает измененный список в выходной файл как . строка join() объединяя их все вместе, а затем вручную добавляет новая строка - конец результата (хранится в new_row).

import csv 

with open('out.csv','rb') as nL, open('outy_3.csv','wt') as nL3: 
    for row in csv.reader(nL): 
     time_col = row[1] 
     try: 
      period_location = time_col.index('.') 
      row[1] = time_col[:period_location] # only keep characters in front of period 
     except ValueError: # no period character found 
      pass # leave row unchanged 
     new_row = ','.join(row) 
     print(new_row) 
     nL3.write(new_row + '\n') 

Printed (и файл) Выход:

DATE,TIME,PRICE1,PRICE2 
2017-01-15,05:44:27,0.9987,1.0113 
2017-01-15,13:03:46,0.9987,1.0113 
2017-01-15,21:25:07,0.9987,1.0113 
2017-01-15,21:26:46,0.9987,1.0113 
2017-01-16,12:40:11,,1.0154 
2017-01-16,12:40:11,1.0004, 
2017-01-16,12:43:34,,1.0095 
Смежные вопросы