2010-12-03 3 views
0

Im stecken auf ein Problem für eine Aufgabe, ich muss ein Programm schreiben, das eine Datei auf meinem Computer öffnet, und scannt diese Datei für die erste Instanz einer Nummer. Sobald es gefunden wirdDatei öffnen und lesen, um die erste Instanz der Nummer zu finden. Python

Die erste Zahl in zurückkehren, filenm ist x

sonst wird es sagen, es gibt keine Nummer in filenm.

bisher Mein Code ist unten: Wenn ich es laufen, egal was es Theres keine Nummer immer sagt :(

filenm = raw_input("Enter a file name: ") 
datain=open(filenm,"r") 

try: 
    c=datain.read(1) 
    result = [] 

    for line in datain: 
     c=datain.read(1) 

     while int(c) >= 0: 
      c = datain.read(1) 
      result.append(c) 


except: 
    pass 

    if len(result) > 0: 
      print "The first number is",(" ".join(result))+" . " 
    else: 
      print "There is no number in" , filenm + "." 
+0

Ist Ihr Einzug korrekt? (Ich bezweifle, dass Sie es richtig eingefügt haben.) –

+1

Ihr Catch-All außer maskiert den echten Fehler. –

+0

Sie verbrauchen mehr Input als Sie vielleicht wissen. für Zeile in Daten verbraucht eine Zeile. – kevpie

Antwort

1
  1. die Datei öffnen;
  2. es in einer Schleife Char- gelesen by-char;
  3. prüft, ob die char Ziffer ist, zu drucken, was Sie wollen,
  4. es bedeutet, dass es keine Zahlen in der Datei sind, wenn am Ende der Datei erreicht ist, print „keine Zahlen“

Verwenden Sie <string>.isdigit() Methode, um zu überprüfen, ob die angegebene Zeichenfolge (ein einzelnes Zeichen in Ihrem Fall) eine Ziffer ist.

+0

wo stelle ich das hin? –

+0

@justin Sie sollten jedes Zeichen überprüfen, das Sie aus der Datei gelesen haben. 'c.isdigit()'. – khachik

0

ich nicht empfehlen Iterieren durch eine

for line in datain: 

unter Verwendung des Leseverfahrens (oder einen ähnlichen) Datei Mixstab

c=datain.read(1) 

Nur mit dem einen oder anderen. Persönlich würde ich hier mit Iteration gehen.

+0

ok ich nahm die für Linie in datain. –

+0

noch sagt es theres keine Zahl :( –

+0

Nun, nur herausnehmen wird Ihr Problem nicht lösen. Sie müssen schauen, was Ihr Code tatsächlich tut. Versuchen Sie, es durch die Zeile im interaktiven Modus durchlaufen oder verwenden Sie die pdb Debugger. Wir versuchen, Ihnen zu helfen, die Antwort selbst zu finden. –

0

Die Methode readlines() gibt eine Liste aller Zeilen in der Datei zurück. Sie können in jeder Zeile dann iterieren die Liste der Zeichen Trog:

filenm = raw_input("Enter a file name: ") 
datain=open(filenm,"r") 

try: 

    result = [] 

    for line in datain.readlines(): 
     print 'line: ' + line 
     for each in line: 
      try: 
       # attempt casting a number to int 
       int(each) 
       # if it worked it add it to the result list 
       result.append(each) 
      except: 
       pass 
except: 
    pass 

print result 
if len(result) > 0: 
    print "The first number is",(" ".join(result[0]))+". " 
else: 
    print "There is no number in" , filenm + "." 

Dies wird nur mit der ersten Nummer Charakter arbeiten sie findet, nicht sicher, ob Sie tatsächlich mehrstellige Zahlen zu extrahieren.

+0

sagen die erste Zahl ist 20. Es zeigt nur 2. Wie mache ich es 20 zeigen? –

+0

@justin, hängt es ab, wie Ihre Datei formatiert ist. Wenn Sie Wenn Sie einfach nur nach '20' suchen möchten, können Sie einfach die Suchmethode für Zeichenfolgen verwenden.Sie können auch reguläre Ausdrücke verwenden, um die 20 zu finden.Wenn die Zahlen durch Leerzeichen (oder ein gemeinsames Trennzeichen) getrennt sind, können Sie die Teilung verwenden() Methode für jede Zeile und iteriere durch dieses Array Es liegt an Ihnen zu entscheiden, was am besten ist, wenn Sie die bekannte Eingabe verwenden –

+0

@justin Sie könnten eine temporäre "Puffer" -Variable haben, zu der Sie d hinzufügen können zit chars, bis Sie eine Nicht-Ziffer drücken. Sobald Sie das nicht-stellige Zeichen result.append() erreicht haben und fortfahren. Stellen Sie sicher, dass Sie dies auch tun, wenn Sie auch das Ende der Datei ankreuzen (falls die Nummer das letzte in der Datei war). Eine andere Möglichkeit wäre die Verwendung der Gruppierung regulärer Ausdrücke, die jedoch außerhalb des Bereichs Ihrer Übung liegen könnte. – SirMo

0

Meine Gedanken:

1) Wie andere erwähnt, Maske nicht die Ausnahme. Es wäre besser, es werfen zu lassen - zumindest auf diese Weise finden Sie heraus, was schiefgelaufen ist, wenn etwas schief gelaufen ist.

2) Sie do, dass die Datei eine Zeile zu einem Zeitpunkt zu lesen, for line in file: verwenden. Der Grund dafür ist, dass die Zahlen, die Sie lesen möchten, grundsätzlich "Wörter" sind (Dinge, die durch Leerzeichen getrennt sind), und es gibt keine eingebaute Möglichkeit, die Datei zu einem bestimmten Zeitpunkt zu lesen. file.read(1) liest ein einzelnes Byte (d. H. Ein Zeichen für eine ASCII-Datei), und dann müssen Sie sie selbst in Worte fassen, was mühsam ist. Es ist viel einfacher, Python zu sagen, eine Zeile in Wörter zu teilen. Zumindest gehe ich hier davon aus, dass Sie nicht die "20" aus "Spam ham20eggs 10 Hummer Thermidor" herausgreifen sollen.

.readlines() ist etwas redundant; Es ist eine Annehmlichkeit, um eine Liste der Zeilen in der Datei zu erstellen - aber wir brauchen diese Liste nicht; Wir brauchen nur die Linien nacheinander. Es gibt eine Funktion namens .xreadlines(), die das tut, aber es ist veraltet - weil wir einfach for line in file: verwenden können. Ernsthaft - halt es einfach.

3) int in Python wird keinen negativen Wert zurückgeben, wenn die Eingabe nicht numerisch ist. Es wird eine Ausnahme ausgelöst. Ihr Code behandelt diese Ausnahme nicht ordnungsgemäß, da sie aus der Schleife ausbrechen würde. Es gibt keine Möglichkeit, Python mitzuteilen, "weiterzumachen, wo Sie die Ausnahme ausgelöst haben" - und das sollte nicht sein, denn wie soll der Rest des Codes für das geschehen, was passiert ist?

2

Das ist alles was Sie brauchen:

import re 

with open("filename") as f: 
    for line in f: 
     s=re.search(r'\d+',line) 
     if s: 
      print(s.group()) 
      break 
+0

Hier ist fast identische Lösung http://codepad.org/Y6SUyS1g – jfs

0

Eigentlich Ihr Code aus nicht allzu weit. Es gibt eine Reihe von Problemen. Eine große ist, dass die try/except Fehler von Ihnen versteckt, die Ihnen helfen könnten, Dinge selbst herauszufinden. Ein anderer Grund ist, dass du die Datei mit einer Mischung aus einer Zeile nach der anderen liest (und deren Inhalt komplett ignorierst) sowie einem Charakter nach dem anderen.

Es kann auch ein falsch verstehen zu sein, auf Ihrer Seite scheint zu wissen, was die int() Funktion nicht, wenn gegeben eine nicht-numerische Zeichenkette, was sie tut, ist eine Ausnahme auslösen, anstatt etwas Rückkehr weniger als 0 Während Sie konnte enclose ein Anruf dazu in einer try/except mit der except speziell für ValueError, in diesem Fall jedoch wäre es einfacher, nur rechtzeitig zu überprüfen, um zu sehen, ob das Zeichen eine Ziffer ist, da alles, was Sie tun wollen, weiterhin bis eins zu tun ist das ist nicht gesehen.

hier ist also ein Weg, um Ihren Code überarbeitet werden könnte, die die oben genannten Probleme anzugehen würde:

import string 

filenm = raw_input("Enter a file name: ") 
datain = open(filenm,"r") 

# find first sequence of one or more digits in file 
result = [] 
while True: 
    c = datain.read(1) 

    while c in string.digits: # digit? 
     result.append(c) 
     c = datain.read(1) 

    if c == "" or len(result) > 0: # end-of-file or a number has been found 
     break # get out of loop 

if len(result) > 0: 
    print "The first number is'", "".join(result) + "'." 
else: 
    print "There is no number in'", filenm + "'." 

close(datain) 
Verwandte Themen