2017-05-27 3 views
0

Ich bin neu in Python, versuchen, unter Textdatei in CSV-Datei zu konvertieren. Die eingegebene Textdatei hat 2 Spalte Eins ist id und andere ist Name, diese zweite Spalte kann Komma, Zahlen und Leerzeichen enthalten.Problem beim Konvertieren der Textdatei in CSV, wo eine Spalte Leerzeichen und Komma in Textdatei enthält

Eingabedatei:

1134999 06Crazy Life 
6821360 Pang Nakarin 
10113088  Terfel, Bartoli- Mozart: Don 
10151459  The Flaming Sidebur 
6826647 Bodenstandig 3000 
10186265  Jota Quest e Ivete Sangalo 
6828986 Toto_XX (1977 
10236364  U.S Bombs - 
1135000 artist formaly know as Mat 

Ich dachte, das gelöst werden könnte:

  1. Durch doppelte Anführungszeichen setzen die zwei Trennsäule

    Erwartetes Ergebnis sein kann:

    "1134999","04Crazy Life" 
    "6821360","Pang Nakarin" 
    "10113088","Terfel,Bartoli-Mozart: Don" 
    
  2. von Datei nach dem ersten Raum trennt dann doppelte Anführungszeichen in der zweiten Spalte Anwendung (als ID-Spalte enthält keinen Raum/Komma)

    Erwartetes Ergebnis sein könnte.

    1134999,"04Crazy Life" 
    6821360,"Pang Nakarin" 
    10113088,"Terfel,Bartoli-Mozart: Don" 
    

Ich habe versucht, um die zwei Spalten zu zitieren, indem Sie den folgenden Code verwenden. Aber es doppelt jedes Wort durch Leerzeichen getrennt zitiert, die ich nicht will:

import csv 
import itertools 
from StringIO import StringIO 

quotedData = StringIO() 
with open('demo.txt', 'r') as in_file: 
    lines = in_file.read().splitlines() 
    stripped = [line.replace(","," ").split() for line in lines] 
    grouped = itertools.izip(*[stripped]*1) 
    with open('try.csv', 'w') as out_file: 
     writer = csv.writer(out_file, quotedData, quoting=csv.QUOTE_ALL) 
     writer.writerow(('artist_id', 'artist_name')) 
     for group in grouped: 
      writer.writerows(group) 

Ergebnis:

"artist_id","artist_name" 
"1134999","06Crazy","Life" 
"6821360","Pang","Nakarin" 
"10113088","Terfel","Bartoli-","Mozart:","Don" 
"10151459","The","Flaming","Sidebur" 
"6826647","Bodenstandig","3000" 
"10186265","Jota","Quest","e","Ivete","Sangalo" 
"6828986","Toto_XX","(1977" 
"10236364","U.S","Bombs","-" 
"1135000","artist","formaly","know","as","Mat" 
"10299728","Kassierer","-","Musik","für","beide","Ohren" 

Antwort

0

Da die IDs streng numerisch zu sein scheinen, wäre die Verwendung eines regulären Ausdrucks ein guter Ansatz. (Beachten Sie die folgenden vorausgesetzt, dass Sie von den Inhalten der zweiten Spalte führenden Leerzeichen entfernt werden sollen.)

import re 

with open('demo.txt', mode='r') as inp, open('try.csv', 'w') as outp: 
    for line in inp: 
     m = re.match(r'(\d+)\s+(.*)', line) 
     outp.write('"{}","{}"\n'.format(m.group(1), m.group(2))) 

Inhalt try.csv Datei nach der Ausführung:

"1134999","06Crazy Life" 
"6821360","Pang Nakarin" 
"10113088","Terfel, Bartoli- Mozart: Don" 
"10151459","The Flaming Sidebur" 
"6826647","Bodenstandig 3000" 
"10186265","Jota Quest e Ivete Sangalo" 
"6828986","Toto_XX (1977" 
"10236364","U.S Bombs -" 
"1135000","artist formaly know as Mat" 
0

CSV bedeutet ‚Komma getrennte Werte‘, so Per Definition ist ',' verwendet, um zwischen Spalte zu unterscheiden Werte. Es macht also Sinn, dass Sie (einfach und unkompliziert) keine Werte einfügen können, die Kommas enthalten.

Alternativ, abhängig davon, wie Ihre Ausgabedatei später geöffnet wird, können Sie außer ',' ein anderes Trennzeichen/Trennzeichen verwenden, z. B. '\t'. (Und vielleicht speichern Sie die Datei als .tsv).

In Python können Sie pandas verwenden, um leicht eine solche Datei zu erstellen:

import pandas as pd 

outputDataFrame = pd.DataFrame(grouped, columns=['artist_id', 'artist_name']) 
outputDataFrame.to_csv('try.csv', sep='\t', index=False) 

Hinweis: Sie müssen nicht manuell auf diese Weise jede ',' vom Eingang entfernen.

Verwandte Themen