2016-05-05 1 views
0

Je suis en train d'utiliser shutil.move mais obtenir erreur comme ci-dessous:shutil.move() renvoie TypeError: Unicode à contraindre: Chaîne de besoin ou d'un tampon, par exemple trouvé

Traceback (most recent call last): 
    File "packageTest.py", line 202, in <module> 
    writeResult() 
    File "packageTest.py", line 92, in writeResult 
    shutil.move(tempfile,'report.csv') 
    File "/usr/local/lib/python2.7/shutil.py", line 294, in move 
    os.rename(src, real_dst) 
TypeError: coercing to Unicode: need string or buffer, instance found 

Je suis nouveau à python et non sûr de ce qui ne va pas. Quelqu'un peut-il m'aider dans ce domaine? J'ai vérifié même si j'essaie d'ouvrir le fichier deux fois mais ce n'est pas le cas.

def writeResult(): 

    tempfile=NamedTemporaryFile(delete=False) 
    result='FAIL' 
    with open('report.csv','rb') as infile,tempfile: 
      csvreader=csv.DictReader(infile) 
      fieldnames=csvreader.fieldnames 
      csvwriter=csv.DictWriter(tempfile,fieldnames) 
      csvwriter.writeheader() 
      for node,row in enumerate(csvreader,1): 
        if(row['EXIST_IN_BOM']=='Yes'): 
          if(row['EXIST_IN_TAR']=='No'): 
            csvwriter.writerow(dict(row,RESULT='FAIL')) 
            csvwriter.writerow(dict(row,COMMENT='File is missing in package')) 
          else: 
            result='PASS' 

        else: 
          if(row['EXIST_IN_TAR']=='Yes'): 
            csvwriter.writerow(dict(row,RESULT='FAIL')) 
            csvwriter.writerow(dict(row,COMMENT='File is missing in BOM')) 


        if(row['SIZE_IN_TAR']==row['SIZE_IN_ALPHA']): 
          result='PASS' 
        else: 
          csvwriter.writerow(dict(row,RESULT='FAIL')) 
          csvwriter.writerow(dict(row,COMMENT='File size not same')) 
        if(result=='PASS'): 
          csvwriter.writerow(dict(row,RESULT='PASS')) 


    shutil.move(tempfile,'report.csv') 
    return 

Edit: Le code ci-dessous fonctionne bien:

tempfile=NamedTemporaryFile(delete=False) 
with open('dict.csv','rb') as infile,tempfile: 
     csvreader=csv.DictReader(infile) 
     fieldnames=csvreader.fieldnames 
     csvwriter=csv.DictWriter(tempfile,fieldnames) 
     csvwriter.writeheader() 
     for node,row in enumerate(csvreader,1): 
       if(row['EmpId']=='119093'): 
         csvwriter.writerow(dict(row,Rank='1')) 
       if(row['EmpId']=='119094'): 
         csvwriter.writerow(dict(row,Rank='2')) 

shutil.move(tempfile.name,'dict.csv') 

Répondre

1

shutil.move() prend deux noms de fichiers, et non pas semblable à un fichier et un nom de fichier. Si vous souhaitez copier le contenu d'un fichier comme un nom de fichier, ouvrez le nom de fichier en mode écriture et utilisez shutil.copyfileobj() à la place.

+0

s'il vous plaît voir la partie Edit. shutil.move fonctionne également si nous voulons ... le même type de fichier que j'ai là aussi. Mais je ne suis pas sûr pourquoi il ne fonctionne pas cette fois –

+0

Lisez la première phrase que j'ai écrite. –

+0

Désolé c'est mon erreur que je n'ai pas vu chose si mineure ... je viens de changer le code comme shutil.move (tempfile.name, "report.csv"). Merci beaucoup d'avoir signalé ça ... Je suppose que trop de travail me fait perdre du temps –