2016-06-15 9 views
2

Ich Iterieren Verzeichnisse und Dateien in ihnen, während ich vor Ort jede Datei ändern. Ich suche nach der neuen modifizierten Datei, die gleich danach gelesen wird. Hier ist mein Code mit beschreibenden Kommentaren:Ändern einer Datei innerhalb von verschachtelten für Schleifen

# go through each directory based on their ids 
for id in id_list: 
    id_dir = os.path.join(ouput_dir, id) 
    os.chdir(id_dir) 

    # go through all files (with a specific extension) 
    for filename in glob('*' + ext): 

     # modify the file by replacing all new-line characters with an empty space 
     with fileinput.FileInput(filename, inplace=True) as f: 
      for line in f: 
       print(line.replace('\n', ' '), end='') 

     # here I would like to read the NEW modified file 
     with open(filename) as newf: 
      content = newf.read() 

Wie es aussieht, die newf ist nicht das neue modifizierte ein, sondern die ursprüngliche f. Ich denke, ich verstehe, warum das so ist, aber ich fand es schwierig, dieses Problem zu überwinden.

Ich kann immer 2 separate Iterationen (gehen Sie durch jedes Verzeichnis auf der Grundlage ihrer IDs, gehen Sie durch alle Dateien (mit einer spezifischen Erweiterung) und ändern Sie die Datei, und wiederholen Sie die Iteration, um jedes von ihnen zu lesen), aber ich war Ich hoffe, dass es einen effizienteren Weg gibt. Vielleicht, wenn es möglich wäre, die zweite for Schleife neu zu starten, nachdem die Änderung stattgefunden hat und dann die read stattfinden lassen (so zu vermeiden, mindestens die äußere for Schleife zu wiederholen).

Irgendwelche Ideen/Designs, um die oben genannten auf eine saubere und effiziente Weise zu erreichen?

+0

drucken Sie immer nur den ersetzten Wert, Sie ändern ihn nie. 'line.replace()' gibt eine neue Instanz einer Zeile zurück und würde das Original nicht überschreiben? – TheLazyScripter

+0

@TheLazyScripter Ich korrigiere gerade einen kleinen Tippfehler. Außerdem funktioniert das Codebeispiel, das die Ersetzung durchführt, OK; Wenn ich es separat versuche, ändert es die Datei und speichert sie an Ort und Stelle. – Yannis

+0

Haben Sie versucht, 'print (line.replace ('\ n', ''), end = '')' durch 'line = line.replace ('\ n', '') zu ersetzen? Drucken (Zeile); '? –

Antwort

1

Bei mir funktioniert es mit diesem Code:

#!/usr/bin/env python3 
import os 
from glob import glob 
import fileinput 

id_list=['1'] 
ouput_dir='.' 
ext = '.txt' 
# go through each directory based on their ids 
for id in id_list: 
    id_dir = os.path.join(ouput_dir, id) 
    os.chdir(id_dir) 

    # go through all files (with a specific extension) 
    for filename in glob('*' + ext): 

     # modify the file by replacing all new-line characters with an empty space 
     for line in fileinput.FileInput(filename, inplace=True): 
      print(line.replace('\n', ' ') , end="") 

     # here I would like to read the NEW modified file 
     with open(filename) as newf: 
      content = newf.read() 
     print(content) 

merken, wie ich über die Zeilen iterieren!

1

Ich sage nicht, dass die Art, wie Sie das tun, falsch ist, aber ich fühle, dass Sie es zu kompliziert machen. Hier ist meine super einfache Lösung.

import glob, fileinput 
for filename in glob('*' + ext): 

    f_in = (x.rstrip() for x in open(filename, 'rb').readlines()) #instead of trying to modify in place we instead read in data and replace raw_values. 
    with open(filename, 'wb') as f_out: # we then write the data stream back out  
    #extra modification to the data can go here, i just remove the /r and /n and write back out 
     for i in f_in: 
      f_out.write(i) 

    #now there is no need to read the data back in because we already have a static referance to it. 
Verwandte Themen