2013-07-14 46 views
1

我一直在研究一個程序,它將一行代碼中的字符(hhhhhhhhhhhhhhhhghhhhhfhhhhhfffffeee [X] b [d [ed [[Y [^ Y,十進制ascii等效並替換結果行。這是我迄今爲止...遍歷一行中的字符並替換它們

f2 = path to file 
if re.match('[AGNTC]{5}', line): 
    next_line = next(f2) 
    unilist.append(next(f2)) 

    for j in unilist: 
     j=[x for x in unilist if x] 
     g=[word.strip() for word in j] 
     g= ''.join(g) 

     for ch in g: 
      char= ord(ch) 
      char= int(char) 
      ch= str(char-33) 

一切正常,到了這一點。不久前我開始學習python,我只需要指針。我想根據它們對應的字符所在的位置將所有ch放在一個字符串中。文件f2看起來有點像:

@SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50 
TTGCCTGCCTATCATTTTAGTGCCTGTGAGGTGGAGATGTGAGGATCAGT 
+SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50 
hhhhhhhhhhghhghhhhhfhhhhhfffffeee[X]b[d[ed`[Y[^Y 

我想也許使用itertools的配對起來。我還需要用T,G,C和A來修改行,這樣如果ASCII碼小於20,相應的字符就會被N替換。正如我之前提到的,我只需要知道哪些工具會做最適合的工作,所有的建議和提示都會受到讚賞。

我曾嘗試:

for cha in g: 
    g.replace(str(cha), ch) 
    print(g) 

但是,它打印回到初始行。

編輯: 我已經解決了我的問題,其序列,但我需要知道如何配對值...

for cha in g: 
     char= ord(cha) 
     char= int(char) 
     ch= str(char-33) 
     mylist.append(ch) 
mylist=','.join(mylist) 
f1.write('%s\n' %mylist) 

編輯: 我試圖寫的有點:

def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return zip(a, b) 
burp = random.randrange(0, 100000000000) 

f1 = open(path to file) 
f3=open(path to file3, 'w+') 

for line, next_line in pairwise(f1): 

     if re.match ('[AGTCN]{5}', line): 
      for ch in next_line: 
       if ch<str('20'): 
        for ch in line: 
         line.replace(ch,'N') 
      f3.write('%s' %line) 

     else: 
      if re.match(r'\d{1,1}', line): 
       line='' 
       f3.write('%s' %line) 

      else: 
       f3.write('%s' %line) 

但是,我想知道如何考慮兩條線上的分數和位置之間的','。眼下輸出有二號線,不修改或什麼...

編輯: 現在,我只需要找到N個實際上是在第二行基於ASCII碼「代替」的方式得分由我最近的編輯。

+1

你的輸入/輸出是如何相關的? –

+0

@Jon Clements我的輸入是給定的文本,我的程序採用TTGCC ...行,如果匹配,跳過2行,它給出hhhh ...行並將其附加到列表中(unilist),其中每個元素被採用並且ascii代碼返回每個字符。在這一點上,我只是想知道我能以哪種方式將第二和第四條線組合在一起......只是可能有幫助的模塊......謝謝,我希望我很清楚。 – Fabien

+2

目前還不清楚你在問什麼或想做什麼。 – msnider

回答

1

我相信你要做的是遍歷文件中的第二行和第四行,並根據第四行中字符的ASCII值改變第二行中的字符。

輸入:

@SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50 
TTGCCTGCCTATCATTTTAGTGCCTGTGAGGTGGAGATGTGAGGATCAGT 
+SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50 
hhhhhhhhhhghhghhhhhfhhhhhfffffeee[X]b[d[ed`[Y[^Y 

輸出:

@SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50 
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN 
+SRR566546.970 HWUSI-EAS1673_11067_FC7070M:4:1:2299:1109 length=50 
hhhhhhhhhhghhghhhhhfhhhhhfffffeee[X]b[d[ed`[Y[^Y 

Python的字符串是不可變(它們不能被修改)。讀入整個文件,將相關行轉換爲列表,檢查第四行中哪些字符的ASCII值大於53,然後用N的第二行覆蓋相應的字符。

# Read file, convert strings to lists 
fin = open("path/to/file") 
lines = fin.readlines() 
line2, line4 = list(lines[1]), list(lines[3]) 

# Make the changes to our lists 
for i, c in enumerate(line4): 
    if(ord(c) > 53): 
     line2[i] = 'N' 

# Overwrite line 2 
lines[1] = ''.join(line2) 

# Save back to the file 
fin.seek(0) 
for line in lines: 
    fin.write(line) 

fin.close() 
+0

謝謝,實際上,我所需要的只是一種方法來引用該行中的索引,以便正確的字符將被改變......並且我還有','在數字之間...所以我正在考慮使用列表...這把它賣給了我。我會相應地修改我的代碼。 – Fabien

+1

@Fabien沒問題。重要的是要記住Python中字符串的不變性。列表很適合這樣的問題。另外,使用'enumerate()'來跟蹤循環中的索引是一種有用的策略。 – msnider

+0

是的,但我想這樣做懶惰的方式,並在操作完成後複製字符串,而不必加入列表...是的,我是懶惰的(加上它永遠不會傷害嘗試找到圍繞問題)。 – Fabien

相關問題