2017-08-09 4 views
0

J'essaye de charger un fichier .csv avec le format de texte utf-8 et de l'écrire dans un format cp1252 (ansi) avec des délimiteurs de tuyaux. Le code suivant fonctionne dans Python 3.6 mais j'en ai besoin pour travailler dans Python 2.6. Cependant, la fonction 'open' n'autorise pas un mot-clé d'encodage dans Python 2.6.Impossible de convertir csv de utf-8 en ansi avec csv writer 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() 

J'ai essayé plusieurs solutions:

  • ne définit pas l'encodage. Résultats erronés sur certains caractères Unicode
  • Utilisez la bibliothèque io (io.open au lieu d'ouvrir). Résultats dans "Erreur de type: impossible d'écrire str en texte dans le flux de texte".

Est-ce que quelqu'un connaît la bonne solution pour cela dans Python 2.X?

+0

Python 'la csv' de 2 n'aime pas' chaînes unicode', donc il n'y a pas de solution facile dans la bibliothèque standard. Cependant, il existe des solutions tierces. Consultez les réponses à [cette question] (https://stackoverflow.com/questions/904041/reading-a-utf8-csv-file-with-python), par exemple. – lenz

Répondre

0

Il un code redondant peut-être ici, mais je suis arrivé que cela fonctionne en procédant comme suit:

  • D'abord, je ne l'enconding en utilisant la .decode et .encode funtion pour le rendre « CP1252 ».
    • Puis je lis le csv à partir du fichier codé CP1252 et écrit à une nouvelle csv

...

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()