2017-09-15 5 views
0

je reçois une erreur en essayant de décompresser un fichier, supprimez les lignes que je ne suis pas intéressé, et enfin écrire les lignes restantes dans un fichier. Voici mon code:lors du décompactage un fichier, supprimer les lignes indésirables avant de les écrire dans un fichier

import gzip, os, sys 
dataset_names=[] 
dir_path=('local drive path') 
dataset_names= os.listdir(dir_path) 
count=0 
read_zip = []; 
for dataset in dataset_names: 
     each_dataset=os.path.join(dir_path+'\\'+dataset+'\\'+'soft'+'\\'+dataset+'_full'+'.soft') 
     with gzip.open(each_dataset+'.gz', 'rb') as each_gzip_file: 
      if count == 2: # I wanted to check with 2 datasets first 
       continue; 
      for line in each_gzip_file:  
       if line.startwith !=('#', '!', '^'): 
        continue; 
       read_zip.append('\t' + line); 
      with open('name of a file', 'wb') as f:     

        f.writelines(read_zip) 
     print(dataset); 
     count+=1; 

Voici l'erreur que je reçois:

AttributeError: 'bytes' object has no attribute 'startwith' 

alors j'ai essayé de le changer à ce code:

...... 
.......    
for line in each_gzip_file: 
       if not PY3K: 
        if lines.startwith != ('#', '!', '^'): 
         continue; 
        lines.append(line) 

       else: 
        lines.append(line.decode('cp437'))     
        makeitastring = ''.join(map(str, lines)) 
       with open('fine name', 'wb') as f: 

        my_str_as_bytes = str.encode(str(,lines)) 
        f.writelines(makeitastring) 

Cette fois obtenu cette erreur:

TypeError: a bytes-like object is required, not 'str' 

Je l'ai également changé avec le suivant, mais cela n'a pas fonctionné non plus. C'était comme si c'était itérer encore et encore:

for line in each_gzip_file: 
       read_zip.append(line); 
       for x in read_zip: 
        if str(x).startswith != ('#', '!', '^'): 
        continue;       
       else: 
        final.append(x);       

       with open('file name', 'ab') as f: 

       f.writelines(final) 

Ai-je rien manqué? Merci,

+0

Pouvez-vous spécifier quelle ligne déclenche réellement l'erreur? – Saustin

+0

@Saustin pour la ligne dans chaque fichier_gzip: si line.startwith! = ('#', '!', '^'): continuer; – NinaDev

+0

avez-vous essayé 'str (line) .startwith! = ...'? – VBB

Répondre

1

Il y a deux erreurs que je vois. D'abord, vous avez mal orthographié le nom de la méthode. C'est bytes.startswith(), pas bytes.startwith(). Notez le "s" entre "start" et "with".

En second lieu, le code line.startswith != ('#', '!', '^') ne fait pas ce que vous pensez. startswith() est une méthode de bytes objets, et ce que vous voulez est d'appeler cette méthode avec '#', etc comme arguments. En ce moment, vous demandez "est cette méthode égale à ce tuple de trois chaînes?". Cela n'a pas de sens dans ce cas, mais Python retournera volontiers False.

Qu'est-ce que vous voulez est line.startswith((b'#', b'!', b'^')). (Le b est nécessaire pour distinguer les chaînes des octets, car ils sont différents dans Python 3.) Cela retournera True si la ligne commence par l'un de ces trois caractères.

+0

Merci @bnaecher Je reçois encore une erreur: si line.startswith (b '#', b, b '^' '!): TypeError: indices de tranches doivent être des entiers ou Aucun ou avoir une méthode __index__ – NinaDev

+1

'bytes.startswith' prend octets objet ou tuple d'objets octets comme premier argument, mais vous les avez passés en 1er, 2ème et 3ème argument parce que vous avez laissé les parenthèses. Les 2ème et 3ème arguments devraient être des entiers, ce qui entraîne le message d'erreur que vous voyez. Lisez le code de bnaecker à nouveau, c'est correct là. – Jeronimo

+0

@bnaecker Merci! tu avais raison et j'étais parti par une paire de parenthèses! – NinaDev