2016-05-19 13 views
0

Ich finde Teilzeichenfolge in komprimierter Datei mit folgenden Python-Skript. Ich bekomme "TypeError: ein Byte-ähnliches Objekt wird benötigt, nicht 'str'". Bitte helfen Sie mir, dies zu beheben.ein Byte-ähnliches Objekt ist erforderlich, nicht 'str': typeerror in komprimierter Datei

from re import * 
import re 
import gzip 
import sys 
import io 
import os 

seq={} 
with open(sys.argv[1],'r') as fh: 
    for line1 in fh: 
      a=line1.split("\t") 
      seq[a[0]]=a[1] 
      abcd="AGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG" 
      print(a[0],"\t",seq[a[0]]) 

count={} 
with gzip.open(sys.argv[2]) as gz_file: 
    with io.BufferedReader(gz_file) as f: 
      for line in f: 
        for b in seq: 
          if abcd in line: 
            count[b] +=1 

for c in count: 
    print(c,"\t",count[c]) 

fh.close() 
gz_file.close() 
f.close() 

und Eingabedateien sind

TruSeq2_SE AGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG

die zweite Datei Textdatei komprimiert wird. Die Zeile "if abcd in line:" zeigt den Fehler an.

+1

Codeformatierungstipp: Halten Sie eine einheitliche Identitätsgröße für Ihren Code ein. Obwohl verschiedene Identifizierungsgrößen unterschiedliche Syntax verwenden, ist es für den Compiler kein Syntaxfehler. Denken Sie auch daran, immer 4 Leerzeichen für den Einzug zu verwenden - es gibt einen klaren Überblick darüber, was wo ist, ohne zu viel Platz zu verbrauchen. – jsbueno

+1

Auch die Angabe, in welcher Zeile der Fehler ausgelöst wird, sollte Ihnen helfen, Antworten zu erhalten. – jsbueno

Antwort

1

Die „BufferedReader“ Klasse, die Sie bytestrings gibt, nicht Textstrings - direkt beide Objekte in Python3 vergleichen -

Da diese Strings nur wenige ASCII-Zeichen und sind nicht wirklich Text, können Sie alle arbeiten die zusammen mit Byte-Strings für Ihren Code.

Also, wenn Sie „öffnen“, um eine Datei (nicht gzip.open), öffnen Sie es in Binär-Modus (dh open(sys.argv[1],'rb') statt 'r' öffnen Sie die Datei)

Und auch das Präfix Ihre fest einprogrammiert String mit einem b so dass Python eine binäre Zeichenfolge inernally verwendet: abcd=b"AGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG" - dies wird einen ähnlichen Fehler auf Ihrem if abcd in line vermeiden - obwohl die Fehlermeldung anders als die Sie angezeigt werden sollte.

Alternativ verwenden Sie alles als Text - das kann Ihnen mehr Möglichkeiten geben, mit den Strings (Python3 Bytes Strigns sind etwas verkrüppelt) Präsentation von Daten beim Drucken, und sollte nicht viel langsamer sein - in diesem Fall, anstatt der Änderungen oben vorgeschlagen, umfassen eine zusätzliche Zeile die Zeilen aus Ihrer Daten-Datei geholt zu entschlüsseln:

Logik
with io.BufferedReader(gz_file) as f: 
    for line in f: 
     line = line.decode("latin1") 
     for b in seq: 

(Neben dem Fehler, Ihre Progamm seens ein bisschen fehlerhaft sein, da man eigentlich nicht eine Variable verwenden String in Ihrem innersten Vergleich - nur die feste 10 Wert - aber ich nehme an, Sie können beheben, sobald Sie die Fehler loswerden)