2016-12-20 4 views
-3

Ich habe eine Liste von 200 Namen in einer Textdatei. Alle Zeichen in den Namen sind Kleinbuchstaben und variieren von 6 Zeichen oder 7 Zeichen und sind in mehrere Überschriften unterteilt. Einige haben Untertitel. Ich versuche, basierend auf dem Raum zu teilen, aber es endet, die Textdatei aufzuteilen durch den Raum zwischen jedem Abschnitt von Namen. Einige \n wird auch gedruckt. Ich habe 2 verschiedene Ideen und stecke auf beiden fest.Parsing durch eine Textdatei

Header 
subheading 
namenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamename 


Heading 


Header 
subheading 
namenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamename 

Am Ende versuche ich, den Header und subheader (die zwischen allen Kappen, alle lowercaps, und eine Mischung aus beidem variieren) und drucken nur die Namen zu ignorieren. Ich begann damit, alles als Liste anzuhängen, aber da ich den Text nicht richtig analysieren konnte, bekam ich Fehler oder druckte jeden Buchstaben jedes Strings einzeln aus.

path_to_file = 'pathgoeshere' 

check_list = [] 

for word in open(path_to_file).read() 
    username = str(word) 
    check_list.append(username) 
    print username 

List = open(path_to_file).readlines() 
print List 


for x in List: 
    user_name = str(x) 
    if user_name.lower(): 
     print user_name 

In meinem eigentlichen Code ist es für richtig, aber dies ist der jist von dem, was ich gesucht habe formatiert.

Am Ende möchte ich die Namen analysieren und zählen, ohne den überflüssigen Text zu zählen, den ich nicht brauche.

Ich bin mir nicht sicher, wohin ich von hier aus gehen soll.

+0

http://stackoverflow.com/help/someone-answers –

Antwort

0

Ich verstehe nicht ganz genau, was Sie wollen. Aber das sollten Sie (ignorieren Sie die Überschrift und Untertitel und nur alle Namen in Druckbuchstaben) erhalten begonnen:

with open('pathgoeshere') as infile: 
    for line in infile: 
     line = line.strip() 
     if any(char.isupper() for char in line): continue 
     print line 

Da Ihre Namen (das Zeug, die Sie interessieren) ist in Kleinbuchstaben, sollten Sie in der Lage sein, um wegzukommen mit wenn eine Linie Großbuchstaben einfach testen hat

+0

Sorry, wenn meine Frage klang verwirrend. Grundsätzlich habe ich viel Text (Header, Subheader, Benutzernamen). Die Charaktere sind eine Mischung aus Großbuchstaben, Großbuchstaben oder einer Mischung aus beiden. Die Benutzernamen sind Kleinbuchstaben und haben entweder 6 oder 7 Zeichen. Ich versuche, die Benutzernamen aus dem Rest des Textes zu analysieren, ohne irgendwelche Subheader- oder Kopfzeileninformationen gemischt zu bekommen. – Smithw1

+0

@ Smithw1: haben Sie versucht, meinen Code laufen zu lassen? Es sollte tun, was Sie fragen – inspectorG4dget

+0

Vielen Dank für die Hilfe. Anfangs, als ich den Code ausführte, gab es einige Nullwerte zurück, aber nach einigen Optimierungen haben wir es geschafft, es zum Laufen zu bringen. Ihr Code war ein guter Ausgangspunkt. Es enthielt irrelevante Werte, die ich beachten musste, damit die any (char.isupper()) geändert werden musste. Danke nochmal für die Hilfe. – Smithw1

0

Hier ist mein Denken:

  • Namen scheinen nur zu kommen, nachdem Header und subheading
  • split von \n und die letzte Zeile in jeder Gruppe von Linien als 3. größer finden

txt = """Header 
subheading 
namenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamename 


Heading 


Header 
subheading 
namenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamenamename 
""" 

# split text 
s = pd.Series(txt.split('\n')) 

# regex to find lines with nothing but whitespace 
blanks = s.str.match(r'^\s*$') 

# assign groups of lines starting with the first non blank 
# filter groups with `~blanks` to focus on just non blank lines 
non_blank_groups = (~blanks & blanks.shift().fillna(True)).cumsum().loc[~blanks] 

# get value counts of the groups to get rid of groups of lines 
# with only one line like `Heading` 
value_counts = non_blank_groups.value_counts() 

# filter `non_blank_groups` with only the groups with more than 2 lines 
groups = non_blank_groups[non_blank_groups.isin(value_counts.index[value_counts.ge(3)])] 

# finally, groupby and grab last one 
s.groupby(groups).last() 

1.0 namenamenamenamenamenamenamenamenamenamenamena... 
3.0 namenamenamenamenamenamenamenamenamenamenamena... 
dtype: object