2016-05-02 8 views
0

Ich habe viele Möglichkeiten gesehen, Zeilen einer Textdatei in Spalten zu teilen, aber ich habe den Weg nicht gefunden, um Zeilen mit Leerzeichen zu machen.python split alle Zeilen in Spalten, keine Leerzeichen in Zeilen

Meine Textdatei wie folgt aussieht:
CABDCBADBCADBC
CBDACBABCABCDA
BCDABCDABABABC
CBADCBACBADBCA

Und ich möchte diese in Spalten aufgeteilt und dann mit jeder Spalte arbeiten. Also sollte ich so etwas wie:

a = [C,C,B,C] 
b = [A,B,C,B] 
c = [B,D,D,A] 
[...] 

Dann würde ich gerne wissen, wie oft jeder Buchstabe in jeder Spalte ist.

Es sieht einfach aus, aber ich habe es nicht geschafft und habe nichts ähnliches gefunden ... Hast du irgendwelche Ideen?

+1

Ist die Breite Ihrer Spalten festgelegt? – Markus

+0

Ja, es ist die Breite meiner Linien festgelegt – LocuraruaL

Antwort

0

Unter der Annahme, dass alle Linien gleich lang sind und Sie verwenden 2 Python Sie izip und Counter verwenden:

from collections import Counter 
from itertools import izip 

with open('test.txt') as f: 
    print [(x, Counter(x)) for x in izip(*(line.strip() for line in f))] 

Ausgang (teilweise):

[ 
    (('C', 'C', 'B', 'C'), Counter({'C': 3, 'B': 1})), 
    (('A', 'B', 'C', 'B'), Counter({'B': 2, 'A': 1, 'C': 1})), 
    (('B', 'D', 'D', 'A'), Counter({'D': 2, 'A': 1, 'B': 1})), 
    ... 
]  
0

Dies ist ein Generatorobjekt, das jede Spalte beim Aufruf der nächsten Methode zurückgibt. Es wird davon ausgegangen, dass alle Zeilen gleich lang sind. aber wenn sie nicht so sind, können Sie die das Anfügen in einem einfachen Versuch wickeln und außer Block

def generateCol(f): 
    lines = f.readlines() 
    col_count = len(lines[0]) #Assuming all lines are of the same length 
    for col in xrange(col_count): 
     curr_col = [] 
     for line in lines: 
      curr_col.append(line[col]) 
     yield curr_col 

Verbrauch:

gen = generateCol(open('fileName', 'r')) 
print gen.next() 
0

, wenn Sie alle Zeichen zu sein, in separaten Spalte wollen dann die Lösung würde gegeben werden, dass alle Linien in der Länge gleich sind

st = \ 
"""CABDCBADBCADBC 
CBDACBABCABCDA 
BCDABCDABABABC 
CBADCBACBADBCA""" 

print zip(*st.split("\n")) 

Ergebnis:

[('C', 'C', 'B', 'C'), ('A', 'B', 'C', 'B'), ('B', 'D', 'D', 'A'), ('D', 'A', 'A', 'D'), ('C', 'C', 'B', 'C'), ('B', 'B', 'C', 'B'), ('A', 'A', 'D', 'A'), ('D', 'B', 'A', 'C'), ('B', 'C', 'B', 'B'), ('C', 'A', 'A', 'A'), ('A', 'B', 'B', 'D'), ('D', 'C', 'A', 'B'), ('B', 'D', 'B', 'C'), ('C', 'A', 'C', 'A')] 
0

Vorausgesetzt, dass alle Linien der gleichen Länge:

with open(path_to_file) as f: 
    lines = [line.strip() for line in f.readlines()] # getting rid of '\n' 
    columns = [[line[i] for line in lines] for i in range(len(lines[0]))] 

print(columns) # columns is a list of lists, each list is a column 
>> [['C', 'C', 'B', 'C'], ['A', 'B', 'C', 'B'], ... , ['C', 'A', 'C', 'A']] 

Jetzt zählt jeder Buchstabe in jeder Spalte nur eine Frage der Verwendung von count():

from collections import Counter 

print([Counter(col) for col in columns]) 
>> [Counter({'C': 3, 'B': 1}), Counter({'B': 2, 'C': 1, 'A': 1}), ..., 
    Counter({'C': 2, 'A': 2})]