Je souhaite donc convertir un fichier texte simple délimité par des tabulations en un fichier csv. Si je convertis le fichier txt en une chaîne à l'aide de string.split ('\ n'), je reçois une liste avec chaque élément de la liste sous la forme d'une chaîne avec '\ t' entre chaque colonne. Je pensais que je pourrais simplement remplacer le "\ t" par une virgule, mais cela ne traitera pas la chaîne dans la liste comme une chaîne et me permettra d'utiliser string.replace. Voici le début de mon code qui nécessite toujours un moyen d’analyser l’onglet "\ t".
import csv
import sys
txt_file = r"mytxt.txt"
csv_file = r"mycsv.csv"
in_txt = open(txt_file, "r")
out_csv = csv.writer(open(csv_file, 'wb'))
file_string = in_txt.read()
file_list = file_string.split('\n')
for row in ec_file_list:
out_csv.writerow(row)
csv
prend en charge les fichiers délimités par des tabulations. Fournissez l'argument delimiter
À reader
:
import csv
txt_file = r"mytxt.txt"
csv_file = r"mycsv.csv"
# use 'with' if the program isn't going to immediately terminate
# so you don't leave files open
# the 'b' is necessary on Windows
# it prevents \x1a, Ctrl-z, from ending the stream prematurely
# and also stops Python converting to / from different line terminators
# On other platforms, it has no effect
in_txt = csv.reader(open(txt_file, "rb"), delimiter = '\t')
out_csv = csv.writer(open(csv_file, 'wb'))
out_csv.writerows(in_txt)
Pourquoi devriez-vous toujours utiliser le mode 'rb' lors de la lecture de fichiers avec le module csv
:
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Que contient le fichier d'exemple? N'importe quel vieux déchet, y compris les caractères de contrôle obtenus en extrayant des blobs ou une base quelconque dans une base de données, ou l'utilisation peu judicieuse de la fonction CHAR
dans des formules Excel, ou ...
>>> open('demo.txt', 'rb').read()
'h1\t"h2a\nh2b"\th3\r\nx1\t"x2a\r\nx2b"\tx3\r\ny1\ty2a\x1ay2b\ty3\r\n'
Python suit CP/M, MS-DOS et Windows lorsqu'il lit des fichiers en mode texte: \r\n
est reconnu comme séparateur de ligne et est servi comme \n
, et \x1a
, également appelé Ctrl-Z, est reconnu comme marqueur de fin de fichier .
>>> open('demo.txt', 'r').read()
'h1\t"h2a\nh2b"\th3\nx1\t"x2a\nx2b"\tx3\ny1\ty2a' # WHOOPS
cSV avec un fichier ouvert avec 'rb' fonctionne comme prévu:
>>> import csv
>>> list(csv.reader(open('demo.txt', 'rb'), delimiter='\t'))
[['h1', 'h2a\nh2b', 'h3'], ['x1', 'x2a\r\nx2b', 'x3'], ['y1', 'y2a\x1ay2b', 'y3']]
mais le mode texte ne le fait pas:
>>> list(csv.reader(open('demo.txt', 'r'), delimiter='\t'))
[['h1', 'h2a\nh2b', 'h3'], ['x1', 'x2a\nx2b', 'x3'], ['y1', 'y2a']]
>>>
Voici comment je le fais
import csv
with open(txtfile, 'r') as infile, open(csvfile, 'w') as outfile:
stripped = (line.strip() for line in infile)
lines = (line.split(",") for line in stripped if line)
writer = csv.writer(outfile)
writer.writerows(lines)