我用Biopython來分析基因突變的分子生物學家,我的問題是這樣的:Python的編輯距離
我有包含許多不同的序列(百萬)的文件,其中大部分是重複的。我需要找到重複並丟棄它們,保留每個獨特序列的一個副本。我正在計劃使用模塊editdist來計算它們之間的編輯距離,以確定哪些是重複的,但editdist只能使用2個字符串,而不是文件。
任何人都知道我可以如何使用該模塊與文件而不是字符串?
我用Biopython來分析基因突變的分子生物學家,我的問題是這樣的:Python的編輯距離
我有包含許多不同的序列(百萬)的文件,其中大部分是重複的。我需要找到重複並丟棄它們,保留每個獨特序列的一個副本。我正在計劃使用模塊editdist來計算它們之間的編輯距離,以確定哪些是重複的,但editdist只能使用2個字符串,而不是文件。
任何人都知道我可以如何使用該模塊與文件而不是字符串?
如果要過濾掉重複的確切數據,可以使用set
Python內置類型。作爲一個例子:
a = ["tccggatcc", "actcctgct", "tccggatcc"] # You have a list of sequences
s = set(a) # Put that into a set
s
則等於['tccggatcc', 'actcctgct']
,沒有重複。
這就是如果有數百萬條記錄會變得非常大...... – 2012-07-12 20:27:10
也許,是的。這是一個簡單,不費腦的解決方案,但它可以工作。你有其他想法嗎? – 2012-07-12 20:29:08
如果「其中大部分」都是重複的,那麼在解析類似'for lot_of_sequences:dict.setdefault(sequence)'中的序列的文件時,可能將它們用作字典鍵將消耗更少的內存。 – xbello 2014-08-04 19:10:47
不要怕文件!
filename = 'sequence.txt'
with open(filename, 'r') as sqfile:
sequences = sqfile.readlines() # now we have a list of strings
#discarding the duplicates:
uniques = list(set(sequences))
- 一個文本文件中每行
:;-)
我假設下面張貼的例子就是這樣 - 通過使用pythons set-type,我們可以自動消除所有重複項。
如果你有ID,並在同一行像序列:你可能想消除像IDS
423401 ttacguactg
:
sequences = [s.strip().split()[-1] for s in sequences]
與帶我們從領導剝離字符串拖尾的空格和分割我們將行/字符串分爲兩個部分:id和序列。 與[-1]我們選擇最後一個組件(=序列字符串)並重新打包到我們的序列表中。
假設你的文件只包括序列排列,每行一個序列,我建議如下:
seq_file = open(#your file)
sequences = [seq for seq in seq_file]
uniques = list(set(sequences))
假設你有這方面的記憶。幾百萬?
ETA:
正在讀上面的評論(但沒有評論PRIVS) - 假設序列ID是任何重複相同的,這會工作。如果重複的序列可以有不同的序列ID,那麼會知道哪個先出現,以及它們之間存在什麼。
四件事情浮現在腦海中:
它必須是Python嗎?
如果序列是簡單的文本字符串,每行一個接着一個shell腳本將是非常有效的:
sort input-file-name | uniq > output-file-name
這將做文件工作高達2GB的32位Linux。
如果您在Windows上,則安裝GNU utils http://gnuwin32.sourceforge.net/summary.html。
在文件中讀取並將其拆分爲單詞,然後比較單詞? – 2012-07-12 20:15:41
你能發佈一些關於該文件包含的更多信息嗎?每一行都是一個序列?是否有諸如'BEGIN SEQUENCE'或'END SEQUENCE?'之類的標記? ? – 2012-07-12 20:17:32
您是否確實對近似重複(對於哪些editdist可能有用)或實際重複感興趣? – 2012-07-12 20:20:48