62 votes

TypeError : contrainte vers Unicode : besoin d'une chaîne ou d'un tampon

Ce code renvoie le message d'erreur suivant :

  • avec open (infile, mode='r', buffering=-1) comme in_f, open (outfile, mode='w', buffering=-1) comme out_f : TypeError : contrainte vers Unicode : besoin d'une chaîne ou d'un tampon, fichier trouvé

     # Opens each file to read/modify
    infile=open('110331_HS1A_1_rtTA.result','r')
    outfile=open('2.txt','w')
    
    import re
    
    with open (infile, mode='r', buffering=-1) as in_f, open (outfile, mode='w', buffering=-1) as out_f:
        f = (i for i in in_f if i.rstrip())
        for line in f:
            _, k = line.split('\t',1)
            x = re.findall(r'^1..100\t([+-])chr(\d+):(\d+)\.\.(\d+).+$',k)
            if not x:
                continue
            out_f.write(' '.join(x[0]) + '\n')
    

S'il vous plaît quelqu'un m'aide.

69voto

Gareth Rees Points 31350

Vous essayez d'ouvrir chaque fichier deux fois ! D'abord tu fais :

 infile=open('110331_HS1A_1_rtTA.result','r')

puis vous passez à nouveau infile (qui est un objet fichier) à la fonction open :

 with open (infile, mode='r', buffering=-1)

open s'attend bien sûr à ce que son premier argument soit un nom de fichier, pas un fichier ouvert !

Ouvrez le fichier une seule fois et tout devrait bien se passer.

10voto

Eran Points 218

Pour le cas le moins spécifique (pas seulement le code dans la question - puisqu'il s'agit de l'un des premiers résultats dans Google pour ce message d'erreur générique. Cette erreur se produit également lors de l'exécution de certaines commandes os avec aucun argument.

Par exemple:

 os.path.exists(arg)  
os.stat(arg)

Levera cette exception lorsque arg vaut None.

8voto

JAB Points 11053

Vous essayez de transmettre des objets de fichier en tant que noms de fichiers. Essayez d'utiliser

 infile = '110331_HS1A_1_rtTA.result'
outfile = '2.txt'

en haut de ton code.

(Non seulement l'utilisation doublée de open() cause ce problème d'essayer d'ouvrir à nouveau le fichier, cela signifie également que infile et outfile ne sont jamais fermés pendant le cours d'exécution, bien qu'ils seront probablement fermés une fois le programme terminé.)

1voto

George Chalhoub Points 2494

Voici le meilleur moyen que j'ai trouvé pour Python 2:

 def inplace_change(file,old,new):
        fin = open(file, "rt")
        data = fin.read()
        data = data.replace(old, new)
        fin.close()

        fin = open(file, "wt")
        fin.write(data)
        fin.close()

Un exemple:

 inplace_change('/var/www/html/info.txt','youtub','youtube')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X