Fichier CSV vu comme ‘data’ plutôt que ‘ASCII’ par OS après écriture via Python

J’utilise Python 2.7.5 pour lire un fichier CSV (input.csv), ignorer certaines lignes et écrire le résultat dans un nouveau fichier CSV (output.csv). J’ai fait de nombreuses tentatives différentes, mais le système d’exploitation (Red Hat et Mac OS X) considère les fichiers de sortie comme des «données» plutôt que des «textes ASCII».

input.csv:

cat -v input.csv (truncated) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\Spooler,yes,1^M HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs,no,A^M HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager,seed,0x714b3c99^M file input.csv input.csv: data 

script.py (dernière tentative):

 import io input_file = '/Users/spork_user/Desktop/input.csv' output_file = '/Users/spork_user/Desktop/output.csv' with io.open(input_file, 'r', newline='\r\n') as infile, io.open(output_file, 'w', newline='\n') as outfile: for line in infile: #filters for lines I don't want, for example: if "Does not exist" in line: continue #to verify how the line appears to python when it reads it in print repr(line) #without the rssortingp, i get a blank line between each line in my output, and it's still seen as 'data' outfile.write(unicode(line.rssortingp('\r\n')+'\n')) 

Courir:

 python script.py (truncated) u'HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\Spooler,yes,1\r\n' u'HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\AppInit_DLLs,no,A\r\n' u'HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager,seed,0x714b3c99\r\n' 

output.csv:

 cat -v output.csv (truncated) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\Spooler,yes,1 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs,no,A HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager,seed,0x714b3c99 file output.csv output.csv: data 

Quelle que soit la combinaison des indicateurs ouverts de lecture / écriture ou de suppression des caractères de nouvelle ligne que j’essaie, le fichier output.csv finit toujours par être considéré par le système d’exploitation comme «données».


Cependant , si je crée un script simplifié avec une sortie codée en dur, il me fournit le type de fichier ASCII que je recherche:

simplifié.py:

 import io output_file = '/Users/spork_user/Desktop/simple_output.csv' with io.open(output_file, 'w', newline='\n') as outfile: outfile.write(unicode('hello\n')) outfile.write(unicode('this\n')) outfile.write(unicode('works\n')) 

Courir:

 python simplified.py  

simple_output.csv:

 cat -v simple_output.csv hello this works file simple_output.csv simple_output.csv: ASCII text 

Comment est-ce que le système d’exploitation peut voir output.csv comme du texte ASCII comme simple_output.csv?

Merci

Votre fichier input.csv est correct. Afin de faciliter le portage de fichiers CSV dans différentes architectures, la convention est la suivante: la fin de ligne devrait être une convention locale même si le fichier texte est \ n (Unix-like) ou \r (Mac)

Le problème est que l’utilitaire de fichier n’est pas au courant de cela et pointe à tort le fichier comme binary, où il pourrait dire texte / fichier csv ou au moins fichier texte MS / DOS

Référence: valeurs séparées par des virgules sur Wikipedia dit:

Standardisation

RFC 4180 formalisé CSV. Il définit le type MIME “text / csv”, et les fichiers CSV qui suivent ses règles devraient être très largement portables. Parmi ses exigences:

  • Lignes de style MS-DOS se terminant par des caractères (CR / LF) (facultatif pour la dernière ligne)

Que faire ensuite: ignorez simplement le problème de file disant que le fichier est une donnée, c’est un fichier texte / csv parfaitement correct (et de toute façon, les bons éditeurs comme vim peuvent gérer différentes conventions de fin de ligne)