2017-09-15 103 views
0

尝试解压缩文件时,出现错误,删除我不感兴趣的行,最后将其余行写入文件。这里是我的代码:解压缩文件时,在将它们写入文件之前删除不需要的行

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; 

这里是我的错误:

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

然后我试图将其更改为下面的代码:

...... 
.......    
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) 

这一次得到这个错误:

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

我也改变了它与以下,但它也没有工作。这就像它一遍又一遍地迭代:

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) 

我错过了什么吗? 谢谢,

+0

你能指定哪一行实际触发错误吗? – Saustin

+0

@Saustin for each_gzip_file中的行: if line.startwith!=('#','!','^'): continue; – NinaDev

+0

你尝试过'str(line).startwith!= ...'? – VBB

回答

1

我看到有两个错误。首先,你拼错方法名称。它是bytes.startswith(),而不是bytes.startwith()。注意“开始”和“与”之间的“s”。

其次,代码line.startswith != ('#', '!', '^')没有做你的想法。 startswith()bytes对象的一种方法,而您想要的是以'#'等作为参数调用该方法。现在,你问“这种方法等于三个字符串的这个元组?”。在这种情况下这没什么意义,但Python会高兴地返回False。您想要的是line.startswith((b'#', b'!', b'^'))。 (b对于区分字符串是必要的,因为它们在Python 3中是不同的。)如果行以这三个字符中的任何一个字符开始,这将返回True

+0

谢谢@bnaecher,但这是错误: 我仍然得到一个错误:如果line.startswith(b'#',b'!',b'^'): TypeError:切片索引必须是整数或无或有__index__方法 – NinaDev

+1

'bytes.startswith'需要一个字节对象或字节对象的元组作为第一个参数,但是因为您遗留了括号,所以将它们作为第1,第2和第3个参数传入。预计第二个和第三个参数是整数,这会导致您看到的错误消息。再次阅读bnaecker的代码,在那里是正确的。 – Jeronimo

+0

@bnaecker谢谢!你是对的,我被一对括号忽略了! – NinaDev

相关问题