Search code examples
pythoncsvplist

Convert Entire CSV, Not Just One Column


I have a small python script (based on an open source script I downloaded) that takes an input csv file and what I would like is for the script to spit out a plist in the form of an array of arrays, one array per row of the file. This is the script:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import os
import csv

args = sys.argv[1:]

if args:
    if(len(args) == 1):
        infile = args[0]
        outfile = infile.replace(".csv", ".plist")
        plisttype = 'array'

    if(open(os.path.abspath(outfile),'w')):
        if(os.path.isfile(infile)):
            data = csv.reader(open(infile))
            output = open(os.path.abspath(outfile),'w')

            output.write('<?xml version="1.0" encoding="UTF-8"?>\n')
            output.write('<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n')
            output.write('<plist version="1.0">\n')

            output.write('<array>\n')
            for row in data:
                rowList = [elem.strip().split(',') for elem in row]
                for i in rowList:
                    output.write('\t<string>' + i.strip() + '</string>\n')

            output.write('</array>\n')

            output.write('</plist>')
            output.close()
            print os.path.basename(os.path.abspath(outfile)) + ' created successfully'
        else:
            print infile + ' could not be opened'
            exit()
    else:
        print outfile + ' is not writable'
        exit()


else:
    print '\ncsv2array usage:\npython csv2array.py <CSVFile>\n';

This is the input CSV:

a,a,a
b,b,b
c,c,c

This is the output as it is now (undesired):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <string>a</string>
    <string>b</string>
    <string>c</string>
</array>
</plist>

This is the output that I would like:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <string>a</string>
    <string>a</string>
    <string>a</string>
</array>
<array>
    <string>b</string>
    <string>b</string>
    <string>b</string>
</array>
<array>
    <string>c</string>
    <string>c</string>
    <string>c</string>
</array>
</plist>

What am I doing wrong in this script?


Solution

  • I think I have it worked out. The following script seems to produce what I need:

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    import sys
    import os
    import csv
    
    args = sys.argv[1:]
    
    if args:
        if(len(args) == 1):
            infile = args[0]
            outfile = infile.replace(".csv", ".plist")
            plisttype = 'array'
    
        if(open(os.path.abspath(outfile),'w')):
            if(os.path.isfile(infile)):
                data = csv.reader(open(infile))
                output = open(os.path.abspath(outfile),'w')
    
                output.write('<?xml version="1.0" encoding="UTF-8"?>\n')
                output.write('<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n')
                output.write('<plist version="1.0">\n')
                output.write('<array>\n')
    
                for row in data:
                    output.write('<array>\n')
                    rowList = [elem.strip().split(',') for elem in row]
                    for i in rowList:
                        output.write('\t<string>' + ''.join(i) + '</string>\n')
                    output.write('</array>\n')
    
                output.write('</array>\n')
                output.write('</plist>')
                output.close()
                print os.path.basename(os.path.abspath(outfile)) + ' created successfully'
            else:
                print infile + ' could not be opened'
                exit()
        else:
            print outfile + ' is not writable'
            exit()
    
    
    else:
        print '\ncsv2array usage:\npython csv2array.py <CSVFile>\n';