Carlos Lopez
Carlos Lopez

Reputation: 13

Convert from space to comma and reorder the values Python

I have a .csv file with many lines and with the structure:

YYY-MM-DD HH first_name quantity_number second_name first_number second_number third_number

I have a script in python to convert the separator from space to comma, and that working fine.

import csv
with open('file.csv') as infile, open('newfile.dat', 'w') as outfile:
    for line in infile:
        outfile.write(" ".join(line.split()).replace(' ', ','))

I need change, in the newfile.dat, the position of each value, for example put the HH value in position 6, the second_name value in position 2, etc.

Thanks in advance for your help.

Upvotes: 0

Views: 78

Answers (2)

Patrick Haugh
Patrick Haugh

Reputation: 60974

If you're import csv might as well use it

import csv
with open('file.csv', newline='') as infile, open('newfile.dat', 'w+', newline='') as outfile:
    read = csv.reader(infile, delimiter=' ')
    write = csv.writer(outfile) #defaults to excel format, ie commas
    for line in read:
        write.writerow(line)

Use newline='' when opening csv files, otherwise you get double spaced files.

This just writes the line as it is in the input. If you want to change it before writing, do it in the for line in read: loop. line is a list of strings, which you can change the order of in any number of ways.

One way to reorder the values is to use operator.itemgetter:

from operator import itemgetter
getter = itemgetter(5,4,3,2,1,0) #This will reverse a six_element list
for line in read:
     write.writerow(getter(line))

Upvotes: 1

Lewis Fogden
Lewis Fogden

Reputation: 524

To reorder the items, a basic way could be as follows:

split_line = line.split(" ")
column_mapping = [9,6,3,7,3,2,1]
reordered = [split_line[c] for c in column_mapping]
joined = ",".join(reordered)
outfile.write(joined)

This splits up the string, reorders it according to column_mapping and then combines it back into one string (comma separated)

(in your code don't include column_mapping in the loop to avoid reinitialising it)

Upvotes: 1

Related Questions