Vra

Ek skryf 'n skrip wat foute van 'n ander program aanteken en die program herbegin waar dit opgehou het wanneer dit 'n fout teëkom.Om watter redes ook al, die ontwikkelaars van hierdie program het dit nie nodig gevoel om hierdie funksionaliteit by verstek in hul program te plaas nie.

In elk geval, die program neem 'n invoerlêer, ontleed dit en skep 'n uitvoerlêer.Die invoerlêer is in 'n spesifieke formaat:

UI - 26474845
TI - the title (can be any number of lines)
AB - the abstract (can also be any number of lines)

Wanneer die program 'n fout gooi, gee dit jou die verwysingsinligting wat jy nodig het om die fout op te spoor - naamlik die UI, watter afdeling (titel of opsomming), en die reëlnommer relatief tot die begin van die titel of opsomming.Ek wil die gewraakte sinne van die invoerlêer aanteken met 'n funksie wat die verwysingsnommer en die lêer neem, die sin vind en dit aanteken.Die beste manier waarop ek kan dink om dit te doen, behels om 'n spesifieke aantal kere deur die lêer te beweeg (naamlik n keer, waar n die reëlnommer relatief tot die begin van die afdeling is).Die manier wat skynbaar sin maak om dit te doen, is:

i = 1
while i <= lineNumber:
    print original.readline()
    i += 1

Ek sien nie hoe dit my data sou laat verloor nie, maar Python dink dit sou, en sê ValueError: Mixing iteration and read methods would lose data.Weet iemand hoe om dit reg te doen?

Was dit nuttig?

Oplossing

Jy kry die ValueError omdat jou kode waarskynlik het for line in original: bykomend tot original.readline(). 'N maklike oplossing wat die probleem opgelos sonder om jou program stadiger of verbruik meer geheue is aan die verander

for line in original:
    ...

na

while True:
    line = original.readline()
    if not line: break
    ...

Ander wenke

Gebruik for en opsom.

Voorbeeld:

for line_num, line in enumerate(file):
    if line_num < cut_off:
        print line

LET WEL:Dit neem aan dat u reeds u lêerhandvatsels skoonmaak, ens.

Ook die neem tyd funksie kan nuttig wees as jy 'n meer funksionele geur verkies.

Wanneer jy net een lyn nodig, kan dit van hulp wees

import itertools

def getline(fobj, line_no):
    "Return a (1-based) line from a file object"
    return itertools.islice(fobj, line_no-1, line_no).next() # 1-based!

>>> print getline(open("/etc/passwd", "r"), 4)
'adm:x:3:4:adm:/var/adm:/bin/false\n'

Jy mag dalk wil om te StopIteration foute te vang (of die lêer het minder lyne).

Hier is 'n weergawe sonder die lelike while True patroon en sonder ander modules:

for line in iter(original.readline, ''):
    if …:   # to the beginning of the title or abstract
        for i in range(lineNumber):
            print original.readline(),
        break
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top