2009-10-29 5 views
0

Je travaille sur un problème et est resté coincé dans un murchaîne d'insertion au milieu d'un fichier donné un objet fichier

J'ai un (potentiellement important) ensemble de fichiers texte, et je dois appliquer une séquence des filtres et des transformations et l'exporter vers d'autres endroits.

donc j'ai à peu près

def apply_filter_transformer(basepath = None, newpath = None, fts= None): 
    #because all the raw studies in basepath should not be modified, so I first cp all to newpath 
    for i in listdir(basepath): 
     file(path.join(newpath, i), "wb").writelines(file(path.join(basepath, i)).readlines()) 
    for i in listdir(newpath): 
     fileobj = open(path.join(newpath, i), "r+") 
     for fcn in fts: 
      fileobj = fcn(fileobj) 
     if fileobj is not None: 
      fileobj.writelines(fileobj.readlines()) 
     try: 
      fileobj.close() 
     except: 
      print i, "at", fcn 
      pass 
def main(): 
    apply_filter_transformer(path.join(pardir, pardir, "studies"), 
         path.abspath(path.join(pardir, pardir, "filtered_studies")), 
         [ 
         #transformer_addMemo, 
          filter_executable, 
          transformer_identity, 
          filter_identity, 
          ]) 

et FTS dans apply_filter_transformer est une liste de fonction qui prend un objet fichier python et retourner un objet fichier python. Le problème que j'ai rencontré est que lorsque je veux insérer des chaînes dans un objet texte, j'obtiens une erreur non informative et je suis bloqué pour toute la matinée.

def transformer_addMemo(fileobj): 
    STYLUSMEMO =r"""hellow world""" 
    study = fileobj.read() 
    location = re.search(r"</BasicOptions>", study) 
    print fileobj.name 
    print fileobj.mode 
    fileobj.seek(0) 
    fileobj.write(study[:location.end()] + STYLUSMEMO + study[location.end():]) 
    return fileobj 

et cela me donne

Traceback (most recent call last): 
File "E:\mypy\reg_test\src\preprocessor\preprocessor.py", line 292, in <module> 
    main() 
File "E:\mypy\reg_test\src\preprocessor\preprocessor.py", line 288, in main 
filter_identity, 
File "E:\mypy\reg_test\src\preprocessor\preprocessor.py", line 276, in  apply_filter_transformer 
    fileobj.writelines(fileobj.readlines()) 
    IOError: [Errno 0] Error 

Si quelqu'un peut me donner plus d'informations sur l'erreur, je vous serais reconnaissant très bien.

+0

Veuillez corriger le formatage. –

Répondre

1

Il est pas vraiment possible de dire ce qui cause l'erreur du code affiché. Le problème peut être dans le protocole que vous avez adopté pour vos fonctions de transformation.

Je vais simplifier un peu le code:

fileobj = file.open(path, mode) 
fileobj = fcn(fileobj) 
fileobj.writelines(fileobj.readlines()) 

Quelle assurance dois-je que fcn retourne un fichier qui est ouvert dans le mode que mon fichier original? Que cela retourne un fichier qui est ouvert du tout? Qu'il renvoie un fichier ? Eh bien, je ne le fais pas.

Il ne semble pas que vous ayez à utiliser des objets fichier dans votre processus. Puisque vous lisez le fichier entier en mémoire, pourquoi ne pas simplement prendre vos fonctions de transformation et retourner des chaînes? Donc, votre code ressemblera à ceci:

with open(filename, "r") as f: 
    s = f.read() 
for transform_function in transforms: 
    s = transform_function(s) 
with open(filename, "w") as f: 
    f.write(s) 

, entre autres, ce découple totalement le fichier partiel E/S de votre programme de la partie des données de transformation, de sorte que les problèmes en un ne touchent pas l'autre.

1

Il y a module python pratique pour modifing ou la lecture d'un groupe de fichiers: fileinput

Je ne sais pas ce qui est à l'origine de cette erreur. Mais vous lisez tout le fichier en mémoire, ce qui est une mauvaise idée dans votre cas, car les fichiers sont potentiellement volumineux. En utilisant fileinput, vous pouvez facilement remplacer les fichiers. Par exemple:

import fileinput 
import sys 

for line in fileinput.input(list_of_files, inplace=True): 
    sys.stdout.write(line) 
    if keyword in line: 
     sys.stdout.write(my_text) 
Questions connexes