2017-01-27 9 views
1

Ich habe ein Python-Programm, das eine SOAP-Anfrage an einen Server, und es funktioniert gut:
Ich bekomme die Antwort vom Server, parse es, sauber es, und wenn ich fertig bin, habe ich am Ende mit einer Schnur wie das oben:Python - Split eine Zeichenfolge in Liste nach einer bestimmten Anzahl von Sonderzeichen

name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|...

Im Grunde ist es ein String mit den Werten von begrenzt ist „|“. Ich kenne auch die Struktur der Datenbank, die ich anfordere, also weiß ich, dass es 6 Spalten und verschiedene Reihen hat. Ich muss im Grunde die Saite nach jedem 6. teilen "|" Charakter zu erhalten, so etwas wie:

name|value|value_name|default|seq|last_modify| 

record_type|1|Detail|0|0|20150807115904| 

zero_out|0|No|0|0|20150807115911| 

out_ind|1|Partially ZeroOut|0|0|20150807115911|... 

Können Sie mir sagen, wie das in Python zu tun? Vielen Dank!

+1

Können Sie nicht einfach jedes Zeichen in den s durchlaufen tring und zähle das "|" und teilen Sie es, wenn die Zählung durch 6 teilbar ist? – Ryan

+0

@Ryan Sie können das tun, aber anstatt eine Python-Schleife zu schreiben, die die Zeichen eins nach dem anderen scannt, ist es schneller, eine Funktion zu verwenden, die mit C-Geschwindigkeit läuft und die Trennzeichen effizienter finden kann. Eine Alternative zur Verwendung der "str.split" -Methode (oder vielleicht "str.partition") besteht darin, entweder "str.index" oder "str.find" mit einem geeigneten "start" -Arg zu verwenden. –

+0

@Ryan: Ich dachte darüber nach, aber PM 2Ring sagte, ich fürchte, das würde zeitaufwendig sein: einige der Antworten vom Server können Tabellen mit Millionen von Feldern enthalten, so dass der Text Zeichen für Zeichen durchläuft No Go. Trotzdem danke! – giga

Antwort

2

Hier ist eine funktionelle Stil Lösung.

s = 'name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|' 

for row in map('|'.join, zip(*[iter(s.split('|'))] * 6)): 
    print(row + '|') 

Ausgang

name|value|value_name|default|seq|last_modify| 
record_type|1|Detail|0|0|20150807115904| 
zero_out|0|No|0|0|20150807115911| 
out_ind|1|Partially ZeroOut|0|0|20150807115911| 

Für Informationen darüber, wie zip(*[iter(seq)] * rowsize) Arbeiten, bei Splitting a list into even chunks die Links finden Sie unter.

1

Wie wäre es damit:

a = 'name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|' 
b = a.split('|') 
c = [b[6*i:6*(i+1)] for i in range(len(b)//6)] # this is a very workable form of data storage 
print('\n'.join('|'.join(i) for i in c)) # produces your desired output 

# prints: 
# name|value|value_name|default|seq|last_modify 
# record_type|1|Detail|0|0|20150807115904 
# zero_out|0|No|0|0|20150807115911 
# out_ind|1|Partially ZeroOut|0|0|20150807115911 
1
data = "name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|" 
splits = data.split('|') 
splits = list(filter(None, splits)) # Filter empty strings 
row_len = 6 
rows = ['|'.join(splits[i:i + row_len]) + '|' for i in range(0, len(splits), row_len)] 
print(rows) 
>>> ['name|value|value_name|default|seq|last_modify|', 'record_type|1|Detail|0|0|20150807115904|', 'zero_out|0|No|0|0|20150807115911|', 'out_ind|1|Partially ZeroOut|0|0|20150807115911|'] 
0

Es gibt wirklich viele Möglichkeiten, es zu tun. Selbst mit einer Schleife:

a = 'name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904' \ 
    '|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|' 

new_a = [] 
ind_start, ind_end = 0, 0 
for i in range(a.count('|')// 6): 
    for i in range(6): 
     ind_end = a.index('|', ind_end+1) 
    print(a[ind_start:ind_end + 1]) 
    new_a.append(a[ind_start:ind_end+1]) 
    ind_start = ind_end+1 

Der Druck wird nur die Ergebnisse sägen, entfernen Sie es:

name|value|value_name|default|seq|last_modify| 
record_type|1|Detail|0|0|20150807115904| 
zero_out|0|No|0|0|20150807115911| 
out_ind|1|Partially ZeroOut|0|0|20150807115911| 
+0

Vielen Dank für das Schreiben eines Beispiels, das '.index' verwendet. Aber Sie müssen mit der Möglichkeit von 'ValueError: Teilstring nicht gefunden' umgehen. Es könnte einfacher sein, '.find' zu verwenden, das -1 zurückgibt, wenn der Teilstring nicht gefunden wird. –

+0

Sie haben Recht. .find ist besser und hat die gleiche Ausgabe – gms

1

Hier ist ein flexiblerer Generator Ansatz:

def splitOnNth(s,d,n, keep = False): 
    i = s.find(d) 
    j = 1 
    while True: 
     while i > 0 and j%n != 0: 
      i = s.find(d,i+1) 
      j += 1 
     if i < 0: 
      yield s 
      return #end generator 
     else: 
      yield s[:i+1] if keep else s[:i] 
      s = s[i+1:] 
      i = s.find(d) 
      j = 1 

#test runs, showing `keep` in action: 

test = 'name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|' 
for s in splitOnNth(test,'|',6,True): print(s) 
print('') 
for s in splitOnNth(test,'|',6): print(s) 

Ausgang:

name|value|value_name|default|seq|last_modify| 
record_type|1|Detail|0|0|20150807115904| 
zero_out|0|No|0|0|20150807115911| 
out_ind|1|Partially ZeroOut|0|0|20150807115911| 

name|value|value_name|default|seq|last_modify 
record_type|1|Detail|0|0|20150807115904 
zero_out|0|No|0|0|20150807115911 
out_ind|1|Partially ZeroOut|0|0|20150807115911 
Verwandte Themen