Замена пустых значений столбца CSV на ноль - PullRequest
1 голос
/ 19 мая 2010

Итак, я имею дело с CSV-файлом, в котором отсутствуют значения. То, что я хочу, чтобы мой сценарий:

#!/usr/bin/python

import csv
import sys

#1. Place each record of a file in a list.
#2. Iterate thru each element of the list and get its length.
#3. If the length is less than one replace with value x.


reader = csv.reader(open(sys.argv[1], "rb"))
for row in reader:
    for x in row[:]:
                if len(x)< 1:
                         x = 0
                print x
print row

Вот пример данных, я их примеряю, в идеале он должен работать на любой длине столбца

Before:
actnum,col2,col4
xxxxx ,    ,
xxxxx , 845   ,
xxxxx ,    ,545

After
actnum,col2,col4
xxxxx , 0  , 0
xxxxx , 845, 0
xxxxx , 0  ,545

Любое руководство будет оценено.

Обновление Вот что у меня сейчас (спасибо):

reader = csv.reader(open(sys.argv[1], "rb"))
for row in reader:
    for i, x in enumerate(row):
                if len(x)< 1:
                         x = row[i] = 0
print row

Тем не менее, кажется, что только одна запись выходит, я буду выводить вывод в новый файл в командной строке.

Обновление 3: Хорошо, теперь у меня возникла противоположная проблема, я вывожу дубликаты каждой записи. Почему это происходит?

After
actnum,col2,col4
actnum,col2,col4
xxxxx , 0  , 0
xxxxx , 0  , 0
xxxxx , 845, 0
xxxxx , 845, 0
xxxxx , 0  ,545
xxxxx , 0  ,545

Хорошо, я исправил это (ниже), спасибо вам, ребята, за вашу помощь.

#!/usr/bin/python

import csv
import sys

#1. Place each record of a file in a list.
#2. Iterate thru each element of the list and get its length.
#3. If the length is less than one replace with value x.


reader = csv.reader(open(sys.argv[1], "rb"))
for row in reader:
    for i, x in enumerate(row):
                if len(x)< 1:
                         x = row[i] = 0
    print ','.join(str(x) for x in row)

Ответы [ 2 ]

4 голосов
/ 19 мая 2010

Измените свой код:

for row in reader:
    for x in row[:]:
                if len(x)< 1:
                         x = 0
                print x

в

for row in reader:
    for i, x in enumerate(row):
                if len(x)< 1:
                         x = row[i] = 0
                print x

Не уверен, что вы делаете с помощью print, но ключевой вопрос заключается в том, что вам нужно изменить row, и для этого вам нужен индекс, который дает вам enumerate.

Обратите внимание, что все остальные значения, кроме пустых значений, которые вы меняете на число 0, останутся строками. Если вы хотите превратить их в int s, вы должны сделать это явно.

1 голос
/ 19 мая 2010

Ты очень почти там!

Есть только пара небольших ошибок.

  • len(x)< 1 не будет работать для второго столбца во второй строке ваших данных, поскольку x будет содержать ' ' (и иметь длину> 1). Вам нужно будет strip ваши строки.

  • print row, вероятно, выведет пустой список, потому что вы завершили итерацию. Вы, вероятно, можете просто удалить эту строку.

Кроме того: Вы пытаетесь изменить файл или просто вывести исправления для передачи в другой файл или процесс?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...