Eroare ciudată cu editarea fișierului text în Python

Folosesc un fișier text pentru a stoca greutatea unei rețele neuronale pe care o fac, dar am probleme grave în editarea greutăților stocate în acest câmp de text. În esență, fac un fișier cu un format foarte obișnuit: Word + \ t + Weight + \ n, apoi folosesc următorul cod pentru a rula prin acest fișier text și apuc piesele:

with open(Neuron_File, 'r+') as Original_Neurons:
            for Neuron in Original_Neurons:
                Word_Stem = re.sub(r'^([a-z-]*)([\t]?)([0-9.]*)(\n)$', r'\1', Neuron)
                Weight = float(re.sub(r'^([a-z-]*)([\t]?)([0-9.]*)(\n)$', r'\3', Neuron))

Care lucrează, cu toate acestea, aș dori să pot schimba valoarea Greutății și să o scriu în același fișier text în același loc. Am reușit să creez cu succes un fișier nou modificat în felul în care mi-ar plăcea, cu toate acestea, am o problemă ciudată de ao scrie înapoi la fișierul original. Folosesc codul de mai jos pentru el:

def Replace(New_File, Old_File):
    for line in open(New_File):
        open(Old_File, 'w').write(str(line))

Dar, din anumite motive, această funcție se rupe doar la un anumit punct al fișierului. Primele 80% transferă amendă, dar apoi taie fișierul la un punct aparent aleator în mijlocul unei linii. Vreo idee? Știu că există și alte întrebări care se referă la subiecte similare, dar nici unul dintre ele nu pare să se aplice situației mele și nu găsesc nicio altă eroare ca cea pe care o primesc.

Problem is navigable, but my primary interest is in what the origin of this error was. I've never seen anything like it and it intrigued me, as I had no idea what was going on, hoping someone on here would have more of an idea.

0
Există un motiv pentru care nu utilizați doar shutil.copyfile ? ( docs.python.org/library/shutil.html#shutil.copyfile) Sau nu înțeleg complet ce încercați să faceți ...
adăugat autor mgilson, sursa
Editat post original pentru a fi mai clar cu privire la intenția mea.
adăugat autor Slater Victoroff, sursa

4 răspunsuri

Trebuie să închideți mânerul fișierului pentru fișierul pe care îl scrieți.

def Replace(New_File, Old_File):
    Old_File_Handle = open(Old_File, 'w')
    for line in open(New_File):
        Old_File_Handle.write(str(line))
    Old_File_Handle.close()

Alternativ, utilizați cu instrucțiuni .

0
adăugat
Dacă se încheie un program python și nu ați dezactivat ieșirea într-un fișier, ieșirea poate fi întreruptă.
adăugat autor Nick ODell, sursa
Există un motiv pentru care te poți gândi că ar duce la o eroare ca asta? De fapt, folosesc cu o iterație anterioară de cod, dar m-am gândit că această eroare a fost destul de ciudată încât am vrut să o înțeleg.
adăugat autor Slater Victoroff, sursa
Eroarea persistă în timpul utilizării și închiderea alternativă a fișierului. Se va executa de mai multe ori, taie mai mult din fișier de fiecare dată.
adăugat autor Slater Victoroff, sursa
with open('input.txt') as in_file:
    with open('output.txt', 'w') as out_file:
        for line in in_file.readlines():
            word, weight = line.split()[:2]
            out_file.write('%s\t%s' % (word, float(weight) * 2))

cu-bloc închide automat fișierele deschise

0
adăugat
Nu există niciun motiv pentru strip șirul înainte de split . split fără argumente va avea grijă de eliminarea spațiilor libere la început și sfârșit pentru tine.
adăugat autor mgilson, sursa
Mulțumesc, @mgilson. strip() nu este necesar.
adăugat autor astynax, sursa
def Replace(New_File, Old_File):
    for line in open(New_File):
        # next line REWRITES outfile EVERY TIME!!!
        open(Old_File, 'w').write(str(line))

Result: Old_File will contain ONLY LAST line

Implementarea corectă:

def Replace(New_File, Old_File):
    # open files
    inp = open(New_File)
    out = open(Old_File, 'w')
    for line in inp:
        out.write(line)
    # close files
    out.close()
    inp.close()
0
adăugat
Nu este adevărat. Python știe implicit ce vrei să spui când deschizi un fișier și îl păstrează deschis, în loc să îl rescrii de fiecare dată. De asemenea, acest lucru nu ar explica nimic despre eroare.
adăugat autor Slater Victoroff, sursa
incearca-l. Doar incearca. Python șterge contextul fișierului atunci când se deschide pentru scriere și deci dacă ceea ce spuneai este adevărat și Python nu avea manevrabilă pentru asta, ar scrie doar ultima linie, ceea ce pur și simplu nu este cazul. Exemplele anterioare sunt, de fapt, colectate de colectorul de gunoi, dar aceste instanțe nu sunt fișierul în sine, ci doar indicii pe care Python le poate identifica ca fiind echivalenți și astfel scriptul rulează corect.
adăugat autor Slater Victoroff, sursa
@Slater Tyranus, open (fn, 'w') scrie (x) în interiorul for-loop redeschide fișierul pentru scriere la EVERY iteration! O instanță anterioară a unui fișier-obiect va fi colectată de GC.
adăugat autor astynax, sursa
@SlaterTyranus, pentru l în deschis ('in.txt'): deschis ('out.txt', 'w') scrie (l) , in.txt = '1 \ n2 \ n3 '(3 linii) -> out.txt =' 3 '- numai pe ultima linie!
adăugat autor astynax, sursa

În mod alternativ, puteți folosi doar ceva de genul rafinați pentru a vă ocupa de acest lucru.

0
adăugat
Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.