web-dev-qa-db-fra.com

TypeError: contraindre à Unicode: besoin chaîne ou 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: contraindre à Unicode: chaîne requise ou 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, aidez-moi.

56
madkitty

Vous essayez d'ouvrir chaque fichier deux fois! D'abord vous faites:

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

et ensuite vous passez 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 fois seulement et ça devrait aller.

65
Gareth Rees

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

Par exemple:

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

Lève cette exception lorsque arg est None.

9
Eran

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

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

en haut de votre code.

(Non seulement l'utilisation doublée de open() pose-t-elle le problème de la tentative d'ouverture du fichier, mais cela signifie également que infile et outfile ne sont jamais fermés au cours de l'exécution, bien qu'ils se ferment probablement une fois le programme terminé.)

8
JAB

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')
0
George Chalhoub