2017-05-06 1 views
1

Ich habe eine RAW-Datei als:Möchten Sie die Liste in eine kommagetrennte Datei in Python konvertieren?

RollNo Address1 City State ZipCode Age Branch Subject Marks1 Marks2 
10000  6505 N MGM W ROAD                     MMUMBAI CITY     IN  46360       77   0    0    -1   1 
10002  1721 HAZAREER DR. DR. UNIT 8                   BELAGHIA      FL  33756       86   0    0    -1   2 

Wie kann ich dies in eine kommagetrennte Datei in Python als konvertieren:

RollNo,Address1,City,State,ZipCode,Age,Branch,Subject,Marks1,Marks2 
10000,6505 N MGM W ROAD,MMUMBAI CITY,IN,46360,77,0,0,-1,1 
10002,1721 HAZAREER DR. DR. UNIT 8,BELAGHIA,FL,33756,86,0,0,-1,2 

Ich versuchte, es in eine Liste zu konvertieren, später, so kann ich wandle es in eine kommagetrennte Zeichenfolge um, indem du \ t als Trennzeichen verwendest, aber es scheint, als würde es mir nicht die gewünschte Ausgabe geben.

Mein Code war:

files_list=[[i for i in line.strip().split(' ')] for line in open('C:/Users/Vinny/Desktop/Python/file2cnvrt.txt').readlines()] 

Der Ausgang bekam ich:

[['RollNo', 'Address1', 'City', 'State', 'ZipCode', 'Age', 'Branch', 'Subject', 'Marks1', 'Marks2'], 
['10000  6505 N MGM W ROAD                     MMUMBAI CITY     IN  46360       77   0    0    -1   1'], 
['10002  1721 HAZAREER DR. DR. UNIT 8                   BELAGHIA      FL  33756       86   0    0    -1   2']] 

Kann jemand empfehlen?

+1

Sind alle Linien ähnlich ausgerichtet? Wenn sie nicht tabulatorgetrennt sind, haben Sie vielleicht Glück, gerade Schnitte zu machen – TemporalWolf

+0

Es scheint, dass Sie hier mehrere Antworten haben. Wenn einer von ihnen Ihr Problem gelöst hat, vergessen Sie nicht, [einen zu akzeptieren] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –

Antwort

0

Versuchen Sie folgendes:

def read_file(filename): 
    indices = [13, 113, 145, 153, 184, 196, 211, 225, 237, 0] 
    columns = [] 
    data = [] 
    with open(filename) as f: 
     lines = f.readlines() 
    columns = lines[0].strip().split(' ') 
    for line in lines[1:]: 
     row = [] 
     line = line.strip() 
     for i in range(len(indices) - 1): 
      row.append(line[indices[i-1]:indices[i]].rstrip()) 
     data.append(row) 
    return [columns] + data 

Die Indizes wurden aus den gesammelten Daten Sie uns gegeben haben. Ich nahm an, dass alles perfekt ausgerichtet war.

+0

Ich habe diesen Code getestet . Funktioniert gut. Einzige Sache ist, dass es mir im Header steht. Beispiel: RollNo \ tAddress1 \ tCity \ tState \ tZipCode \ tAge \ tBranch \ tSubject \ tMarks1 \ tMarks2 –

+0

@VinnyKaur Dann heißt es 'columns = lines [0] .strip(). Split ('')' ändern Sie es in 'columns = Zeilen [0] .strip(). split ('\ t')' –

0

Dies ist möglicherweise nicht die am besten optimierte Methode, obwohl es eine kommagetrennte Datei der Werte erzeugt. Wobei FILE_IN und FILE_OUT die Dateinamen von Eingabe- bzw. Ausgabedateien sind.

# Read file lines to list as values 
file_in = open(FILE_IN, 'r') 
lines_of_values = [] 
for line in file_in: 
    # Split line, remove whitespace and remove empty fields 
    line_values = list(filter(None, line.strip().split(' '))) 
    values = [value.strip() for value in line_values] 
    lines_of_values.append(values) 
file_in.close() 

# Open file to save comma separated values 
file_out = open(FILE_OUT, 'w') 
for values in lines_of_values: 
    print("{:s}".format(",".join(values)), file=file_out) 
file_out.close() 
0

Mehrere Dinge. Verwenden Sie zunächst nicht open() direkt in Ihrem Listenverständnis.

Wenn Sie open() verwenden möchten, immer einen Kontext-Manager verwenden, die garantiert, dass die Datei geschlossen wird, wenn Sie mit ihm fertig sind:

with open('filename..txt') as f: 
    lines = f.readlines() 

Zweitens: Sie werden Ihr Leben viel einfacher finden nicht mit open() überhaupt zu stören und beginnen mit der erstaunlichen pathlib module.

import Path from pathlib 
f_path = Path('C:/Users/Vinny/Desktop/Python/file2cnvrt.txt') 
# get text as one big string: 
file_str = f_path.read_text() 
# get text as a tuple of lines (splits along new line characters): 
lines_tuple = f_path.read_text().split('\n') 
# get text as a list of lines (use a list if you intend to edit the lines): 
lines = list(f_path.read_text().split('\n')) 

Drittens: statt Kopieren und Einfügen den gesamten Pfad zu Ihrem Desktop, können Sie automatisch seine Position finden Sie die Windows-USERPROFILE-Umgebungsvariable:

from pathlib import Path 
import os 
# os.getenv just gives you a dictionary with all the Windows environment variables 
# (such as USERPROFILE and APPDATA) 
user_folder_str = os.getenv['%USERPROFILE%'] 
desktop_path = Path(user_folder_str)/'Desktop' 
file_path = Path(user_folder_str)/'Desktop'/'my_file.txt' 
lines = list(file_path.read_text().split('\n')) 

Viertens: es scheint, dass die Probe RAW-Datei Sie eingefügt haben keine Tab-Zeichen ('\t') darin. Es hat 4 Leerzeichen (' ') stattdessen. Wenn dies tatsächlich der Fall ist, sollte dies funktionieren:

[[i for i in line.strip().split(' ') if i] for line in lines] 

Beachten Sie die if i Teil. Das stellt sicher, dass alle aufeinander folgenden Sätze von 4 Leerzeichen keine leeren Zeichenfolgen ('') in Ihrer Liste setzen.

Ihr eingefügter Code - der dem obigen entspricht - führt jedoch zu einem falschen Ergebnis. Ich denke, es kann sein, weil Ihre zweite und dritte Zeile tatsächlich tun haben Tabulatorzeichen ('\t') in ihnen statt 4 Leerzeichen. Sie müssen also split() mit 4 Leerzeichen und einem Tab-Zeichen.

Der einfachste Weg, dies zu tun ist, die Tabs durch 4 Leerzeichen zu ersetzen. Verwenden Sie dieselbe if i erneut, um leere Zeichenfolgen zu vermeiden.

[[i for i in line.strip().replace('\t', ' ').split(' ') if i] for line in lines] 
Verwandte Themen