He intentado

num_columns = 982

def transform_row(row):
    #row = row.split('\n')  # split on new line
    row = row.split(',')  # split on commas
    row = [i.split() for i in row if i!='5']  # remove 5s
    row += ['0']*(num_columns - len(row))  # add 0s to end
    return ','.join(row) 
#and then apply this over the csv.

out = open('outfile.csv', 'w')
for row in open('dataset_TR1.csv'):
    out.write(transform_row(row))

En esencia, quiero eliminar los 5s de cada fila en un archivo csv y reemplazar la longitud faltante con ceros finales entre las columnas 982 y 983. Sin embargo, usando el archivo de datos de http://www.filedropper.com/datasettr1, esto solo parece escribir todo en una fila y el resultado no es el esperado.

0
xion 22 feb. 2018 a las 19:02

3 respuestas

La mejor respuesta
import csv

with open('dataset_TR1.csv', 'r') as f:
    reader = csv.reader(f)
    result = []
    for line in reader:
        print(len(line))
        remove_5s = [elem for elem in line if elem != '5']
        trailing_zeros = ['0'] * (len(line) - len(remove_5s))

        # if you want the zeros added to the end of the line
        # result.append(remove_5s + trailing_zeros)

        # or if you want the zeros added before the last element of the line
        result.append(remove_5s[:-1] + trailing_zeros + [remove_5s[-1]])

with open('output.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerows(result)
1
G_M 22 feb. 2018 a las 17:01

Una mejor manera de hacerlo es utilizando el módulo integrado csv

import csv
num_columns = 982

def transform_row(row):
    row = [column for column in row if column != '5']
    row += ['0'] * (num_columns - len(row))
    return row

fout = open('outfile.csv', 'w', newline='')
writer = csv.writer(fout)
fin = open('dataset_TR1.csv', 'r')
reader = csv.reader(fin)
for row in reader:
    writer.writerow(transform_row(row))
1
Fred 22 feb. 2018 a las 16:52

Tendrás que manejar comas y nuevas líneas por separado para mantenerlas correctas.

rows = "1,5,5,5,3\n2,5,5,5,9"
rows = rows.split('\n')
lines = []

for idx, row in enumerate(rows):
  row = row.split(',')  # split on commas
  row = [i for i in row if i!='5']  # remove 5s
  row += ['0']*(5 - len(row))  # add 0s to end
  row = ','.join(row)
  lines.append(row)


print(rows)
lines = '\n'.join(lines)
print(lines)

Escanee y divida en \ n. Luego escanee cada línea individualmente, realice su reemplazo y luego vuelva a colocar todo.

1
Pam 22 feb. 2018 a las 16:45