解压缩文件时,请先删除不需要的行,然后再将其写入文件

python python-3.x gzip

52 观看

1回复

47 作者的声誉

尝试解压缩文件,删除我不感兴趣的行并将最后剩余的行写入文件时,出现错误。这是我的代码:

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)

我有什么想念的吗?谢谢,

作者: NinaDev 的来源 发布者: 2017 年 9 月 15 日

回应 1


1

3366 作者的声誉

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

其次,代码line.startswith != ('#', '!', '^')没有按照您的想法做。startswith()bytes对象的方法,而您想要的是使用'#'等作为参数调用该方法。现在,您在问“此方法等于三个字符串的元组吗?”。在这种情况下,这是没有意义的,但是Python会很乐意返回False

你想要的是line.startswith((b'#', b'!', b'^'))。(b必须区分字符串和字节,因为它们在Python 3中是不同的。)True如果该行以这三个字符中的任何一个开头,则将返回此字符串。

作者: bnaecker 发布者: 2017 年 9 月 15 日
32x32