Convertissez le fichier txt délimité par des tabulations en fichier csv en utilisant Python

alors je veux convertir un fichier texte délimité par un simple onglet en un fichier csv. Si je convertis le fichier txt en une chaîne de caractères en utilisant la chaîne de caractères.split('n'), je reçois une liste avec chaque élément de la liste comme une chaîne de caractères avec des 't' entre chaque colonne. Je me disais que je pourrais juste remplacer le 't' par une virgule Mais ça ne traitera pas la chaîne dans la liste comme de la chaîne et me permettra d'utiliser de la chaîne.remplacer. Ici est le début de mon code qui a encore besoin d'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)
19
demandé sur wilbev 2012-04-19 05:24:34

3 réponses

csv supporte les fichiers délimités par tabulation. D'approvisionnement delimiter argument 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)
38
répondu agf 2012-04-19 03:41:23

pourquoi vous devriez toujours utiliser le mode ' rb ' lors de la lecture de fichiers avec le csv module:

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.

Qu'est-ce qu'il y a dans le fichier échantillon: n'importe quel vieux Camelote, y compris les caractères de contrôle obtenus en extrayant des blobs ou n'importe quoi d'une base de données, ou l'utilisation imprudente de CHAR fonction dans les formules Excel, or ...

>>> 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 quand il lit des fichiers en mode texte:\r\n est reconnu comme le séparateur de ligne et est servi comme \n et \x1a alias 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 en mode texte n'est pas:

>>> list(csv.reader(open('demo.txt', 'r'), delimiter='\t'))
[['h1', 'h2a\nh2b', 'h3'], ['x1', 'x2a\nx2b', 'x3'], ['y1', 'y2a']]
>>>
1
répondu John Machin 2012-04-19 03:16:43

C'est 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)
0
répondu iun1x 2018-10-12 12:55:14