2017-01-20 3 views
1

Ich habe nach einigen Tutorials gesucht und kann immer noch keine Möglichkeit finden, diese Datei zu sortieren, weil es wirklich seltsam sortiert ist!So sortieren Sie diese CSV-Datei mit Python (3)

Die Datei geht wie: (wobei x eine Zahl ist, y ein Datum ist, z Zeit und b eine Zahl)

x x x x x 
y y y y y 
z z z z z 
b b b b b 

Es gibt tatsächlich 50 Einträge in jeder Zeile, aber das ist eine sehr vereinfachte Version der Datei.

Was ich bin zu kämpfen ist zu tun, um jeden Eintrag zu sortieren, so dass es [x, y, z, b]

Alle bisher mit Ich bin gekommen ist los ist jede Zeile in eine Liste zu spalten, aber das ist eindeutig nicht das, was ich tun muss, und damit stecke ich fest.

import csv 

with open('sample.txt') as csvfile: 
    readCSV = csv.reader(csvfile, delimiter=' ') 
    for row in readCSV: 
     print(row) 
+4

Ich denke, ich bin verwirrt durch Ihre Verwendung des Wortes "sort". Es klingt wie das, was Sie eigentlich tun möchten ist es zu schwenken, so dass Zeilen Spalten werden und umgekehrt, ist das richtig? –

+0

@DanielRoseman Ja! Genau. Entschuldigung, dass Sie verwirrt sind, wie genau würden Sie diese Datei drehen? –

Antwort

0

Art Datei:

x1 x2 x3 x4 x5 
y y y y y 
z z z z z 
b b b b b 

Programm:

import csv 

with open("C:\\Users\\sortfile.csv", 'r') as fopen: 
    rows = csv.reader(fopen) 
    csvf = list(rows) 

x = 0 
array = [] 

while True: 
    lines = [] 
    try: 
     for i in csvf: 
      lines.append(i[x]) 
     array.append(lines) 
     x +=1 
    except IndexError: 
     break 

Ergebnisse:

[['x1', 'y', 'z', 'b'], ['x2', 'y', 'z', 'b'], ['x3', 'y', 'z', 'b'], ['x4', 'y', 'z', 'b'], ['x5', 'y', 'z', 'b']] 

Ich hoffe, ich habe deine Frage richtig verstanden.

2

Numpy die Transponierung ist, was Sie suchen, das heißt

from csv import reader 
from numpy import transpose 
file = open("file.dat") 
results = reader(file, delimiter=' ') 

print(transpose(list(results))) 
+0

Dies führt zu genau dem gleichen Ergebnis wie der Code oben, was ich tun möchte, ist es zu trennen. –

+0

Jede Spalte trennen? Do 'res = transponiere (list (results))' und rufe 'res [i]' für i + 1. Spalte deiner Ausgangsdatei auf. – 098799

0

Dies eröffnet, was test.txt Datei, die Sie mit den ursprünglichen Werten haben, durch zeilen geht und baut eine transponierte Array von Arrays. Dann iteriert es durch diese und druckt sie in newText.txt in der Reihenfolge, in der Sie gefragt haben, sowie ein csv. Nicht sicher, was Sie mehr wollen :).

import csv 

newLine = [] 
newArr = [] 

x = 0 

with open ('text.txt', 'r') as f: 
    end = len(f.readline().replace(' ','')) 
    f.seek(0) 
    while x <= end: 
     for line in f: 
     newLine.append(line.split(" ")[x]) 
     newArr.append(newLine) 
    x += 1 

# outputs a text file 
with open ('newText.txt', 'wb') as newf: 
    for line in newArr: 
     newf.write(' '.join(line) + '\n') 

# outputs a csv file 
with open('text.csv', 'wb') as csvfile: 
    writeCSV = csv.writer(csvfile) 
    for line in newArr: 
     writeCSV.writerow(''.join(line)) 
0

Gegeben:

$ cat so.csv 
x1,x2,x3,x4,x5 
y1,y2,y3,y4,y5 
z1,z2,z3,z4,z5 
b1,b2,b3,b4,b5 

Normalerweise würden Sie die Datei Zeile für Zeile wie so lesen:

import csv 

LoL=[] 
with open(fn) as f: 
    for row in csv.reader(f): 
     LoL.append(row) 

Oder kompakter:

LoT=[row for row in csv.reader(f)] 

>>> LoL 
[['x1', 'x2', 'x3', 'x4', 'x5'], ['y1', 'y2', 'y3', 'y4', 'y5'], ['z1', 'z2', 'z3', 'z4', 'z5'], ['b1', 'b2', 'b3', 'b4', 'b5']] 

Sie, dass mit zip transponieren :

with open(fn) as f: 
    LoT=[row for row in zip(*csv.reader(f))] 

>>> LoT 
[('x1', 'y1', 'z1', 'b1'), ('x2', 'y2', 'z2', 'b2'), ('x3', 'y3', 'z3', 'b3'), ('x4', 'y4', 'z4', 'b4'), ('x5', 'y5', 'z5', 'b5')] 

Dann können Sie transponierte Liste von Tupeln in einen neuen CSV oder Prozess wie gewünscht schreiben.