python-2.7csvutf-8export-to-csvcp1252

Cannot convert csv from utf-8 to ansi with csv writer python 2.6


I'm trying to do load a .csv file with utf-8 text format and write it in a cp1252(ansi) format with pipe delimiters. The following code works in Python 3.6 but I need it to work in Python 2.6. However, the 'open' function does not allow an encoding keyword in Python 2.6.

import datetime
import csv

# Define what filenames to read
filenames = ["FILE1","FILE2"]
infilenames = [filename+".csv" for filename in filenames]
outfilenames = [filename+"_out_.csv" for filename in filenames]

# Read filenames in utf-8 and write them in cp1252
for infilename,outfilename in zip(infilenames,outfilenames):
    infile  = open(infilename, "rt",encoding="utf8")
    reader = csv.reader(infile,delimiter=',',quotechar='"',quoting=csv.QUOTE_MINIMAL)

    outfile  = open(outfilename, "wt",encoding="cp1252")
    writer = csv.writer(outfile, delimiter='|', quotechar='"', quoting=csv.QUOTE_NONE,escapechar='\\')  
    for row in reader:
        writer.writerow(row)    

infile.close()
outfile.close()

I tried several solutions:

Does anyone know the correct solution for this in Python 2.X?


Solution

  • There may be some redundant code here but I got this to work by doing the following:

    ...

    import datetime
    import csv
    
    # Define what filenames to read
    filenames = ["FILE1","FILE2"]
    
    
    infilenames = [filename+".csv" for filename in filenames]
    outfilenames = [filename+"_out_.csv" for filename in filenames]
    midfilenames = [filename+"_mid_.csv" for filename in filenames]
    
    # Iterate over each file
    for infilename,outfilename,midfilename in zip(infilenames,outfilenames,midfilenames):
    
        # Open file and read utf-8 text, then encode in cp1252
        infile  = open(infilename, "r") 
        infilet = infile.read()
        infilet = infilet.decode("utf-8")
        infilet = infilet.encode("cp1252","ignore")
    
        #write cp1252 encoded file
        midfile = open(midfilename,"w")
        midfile.write(infilet)
        midfile.close()
    
        # read csv with new cp1252 encoding
        midfile = open(midfilename,"r")
        reader = csv.reader(midfile,delimiter=',', quotechar='"',quoting=csv.QUOTE_MINIMAL)
    
        # define output
        outfile  = open(outfilename, "w")
        writer = csv.writer(outfile, delimiter='|', quotechar='"',quoting=csv.QUOTE_NONE,escapechar='\\')
    
        #write output to new csv file
        for row in reader:
            writer.writerow(row)
    
        print("written file",outfilename)
        infile.close()
        midfile.close()
        outfile.close()