2017-05-23 1 views
1

Ich bin ziemlich neu in Python. Ich kenne das Konzept, Daten über Funktionen hinweg zu übertragen.Kann Daten in Variablen zwischen Funktionen nicht übergeben

Theoretisch

def c(): 
    r = raw_input("Ask Something? ") 
    .. 
    return r 

def p(x): 
    ... 
    do something 

r = c() 
p(r) 

Der Code unten ganz gut über Terminal (Python filename.py datei.txt) funktioniert, aber ich möchte in die Datei-Workflow, wo eine Variable speichert den Pfad und übergibt sie hinzufügen zur Funktion (Prozessdatei). Ich kann einfach nicht die Daten/Werte an die Funktion übergeben.

Dies ist der Code, den ich zu bearbeiten versuche:

def registerException(exc): 
    exceptions[exc] += 1 

def processFile(x): 
    with open(x, "r") as fh: 
    currentMatch = None 
    lastLine = None 
    addNextLine = False 
    for line in fh.readlines(): 
     if addNextLine and currentMatch != None: 
     addNextLine = False 
     currentMatch += line 
     continue 
     match = REGEX.search(line) != None 
     if match and currentMatch != None: 
     currentMatch += line 
     elif match: 
     currentMatch = lastLine + line 
     else: 
     if currentMatch != None: 
      registerException(currentMatch) 
     currentMatch = None 
     lastLine = line 
     addNextLine = CONT.search(line) != None 
    # If last line in file was a stack trace 
    if currentMatch != None: 
     registerException(currentMatch) 

for f in sys.argv[1:]: 
    processFile(f) 

for item in sorted(exceptions.items(), key=lambda e: e[1], reverse=True): 
    print item[1], ":", item[0] 

Es Sache tut, wenn ich die Variable als globale oder lokale erklären. Könnte mir bitte jemand helfen, dieses Problem zu lösen?

Edit 1:

ich die Änderungen angewendet haben Daniel Vorgeschlagen und jetzt bin ich immer: Typeerror: 'NoneType' Objekt nicht iterable ist.

Unten ist der Code:

def c(): 
    path = raw_input("Path to file? ") 
    r = os.path.abspath(path) 

def process_file(filename): 
    current = None 
    last_line = None 
    continue_line = False 
    with open(filename, "r") as fh: 
     for line in fh: 
      if continue_line and current is not None: 
       continue_line = False 
       current += line 
       continue 
      if REGEX.search(line): 
       if current is None: 
        current = last_line 
       current += line 
      else: 
       if current is not None: 
        yield current 
       current = None 
      last_line = line 
      continue_line = CONT.search(line) 
     # If last line in file was a stack trace 
     if current is not None: 
      yield current 

def process_files(filenames): 
    exceptions = defaultdict(int) 
    for filename in filenames: 
     for exc in process_file(filename): 
      exceptions[exc] += 1 

for item in sorted(exceptions.items(), key=lambda e: e[1], reverse=True): 
    print item[1], ":", item[0] 

r = c() 
process_files(r) 

ich einige Änderungen vorgenommen haben und entfernt sys.argv [1], da es ein Argument in der Befehlszeile erfordert, wenn das Skript ausgeführt wird.

Ich denke, der neue Fehler, den ich bekomme, ist auf den OS-Pfad zurückzuführen. Wie kann ich das beheben?

+0

Welche Variable redest du? –

+0

Hallo Mark, wenn ich eine Variable hinzufügen x = pathtofile, vor Prozessdatei-Funktion, aus irgendeinem Grund wird der Wert nicht weitergegeben. Ich habe versucht, es sowohl global als auch lokal zu schaffen. Ich habe auch versucht, eine Funktion zu erstellen, die diese Variable erfasst und an die Prozessdateifunktion weitergibt, aber immer noch die gleichen Ergebnisse. Der Code wird über Terminal (python file.py log.txt) einwandfrei funktionieren, aber wir möchten, dass der Pfad im Code codiert ist. –

Antwort

0

exceptions ist auch ein Parameter, der auf alle Funktionen übertragen werden muss. Alternativ können Sie processFile als Generator schreiben, eine Inline-registerException:

def process_file(filename): 
    current = None 
    last_line = None 
    continue_line = False 
    with open(filename, "r") as fh: 
     for line in fh: 
      if continue_line and current is not None: 
       continue_line = False 
       current += line 
       continue 
      if REGEX.search(line): 
       if current is None: 
        current = last_line 
       current += line 
      else: 
       if current is not None: 
        yield current 
       current = None 
      last_line = line 
      continue_line = CONT.search(line) 
     # If last line in file was a stack trace 
     if current is not None: 
      yield current 

def process_files(filenames) 
    exceptions = defaultdict(int) 
    for filename in filenames: 
     for exc in process_file(filename): 
      exceptions[exc] += 1 

    for item in sorted(exceptions.items(), key=lambda e: e[1], reverse=True): 
     print item[1], ":", item[0] 

process_files(sys.argv[1:]) 
+0

Danke für Ihre Eingabe Daniel. Aber immer noch existiert das ursprüngliche Problem. Ich weiß, dass es über Terminal (python file.py log.txt) gut läuft, aber wie würde ich den Pfad im Code hart codieren? Ich habe versucht, zuerst eine globale Variable, dann eine lokale Variable zu deklarieren, aber die Funktion process_file sieht diese Variable nicht. –

+0

Sie können 'process_files' mit jeder Liste von Dateinamen aufrufen, sogar mit fest codierten. – Daniel

+0

Danke Daniel !! Ich habe es endlich funktioniert dank Ihrer Vorschläge !!! Mir fehlte process_files ([r]) !!! –

Verwandte Themen