背景:
Python 2.6.6在Linux上。 DNA序列分析流水線的第一部分。
我想從已安裝的遠程存儲器(LAN)讀取可能的gzip文件,如果它是gzip的;將它壓縮到一個流(即使用gunzip FILENAME -c
),如果流(文件)的第一個字符是「@」,則將整個流路由到一個過濾程序,該過程程序在標準輸入上接受輸入,否則只需將其直接輸入到文件本地磁盤。我想盡量減少從遠程存儲中讀取/查找文件的次數(只需通過文件一次就不可能?)。在Python中窺視Popen流水線
內容的一個例子的輸入文件的,對應於一個記錄在FASTQ格式前四行:
@I328_1_FC30MD2AAXX:8:1:1719:1113/1
GTTATTATTATAATTTTTTACCGCATTTATCATTTCTTCTTTATTTTCATATTGATAATAAATATATGCAATTCG
+I328_1_FC30MD2AAXX:8:1:1719:1113/1
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhahhhhhhfShhhYhhQhh]hhhhffhU\UhYWc
文件不應被管道輸送到過濾程序包含像對應此(前兩行的記錄在FASTA格式的一條記錄):
>I328_1_FC30MD2AAXX:8:1:1719:1113/1
GTTATTATTATAATTTTTTACCGCATTTATCATTTCTTCTTTATTTTCATATTGATAATAAATATATGCAATTCG
部分由半僞代碼努力想象什麼,我想做的事情(我知道這是不可能的,我寫它的方式)。我希望這是有道理的:
if gzipped:
gunzip = Popen(["gunzip", "-c", "remotestorage/file.gz"], stdout=PIPE)
if gunzip.stdout.peek(1) == "@": # This isn't possible
fastq = True
else:
fastq = False
if fastq:
filter = Popen(["filter", "localstorage/outputfile.fastq"], stdin=gunzip.stdout).communicate()
else:
# Send the gunzipped stream to another file
否認的事實,代碼將不會運行像我在這裏和我沒有任何錯誤處理等寫好了,一切已在我的其他代碼。我只想幫助他們窺探流或尋找解決方法。我會很好,如果你能gunzip.stdout.peek(1)
但我意識到這是不可能的。
我試過到目前爲止:
我想通subprocess.Popen可能會幫助我實現這一點,我已經嘗試了很多不同的想法,除其他試圖使用某種io.BufferedRandom的( )對象寫入流,但我無法弄清楚如何工作。我知道流是不可搜索的,但也許一種解決方法可能是讀取gunzip流的第一個字符,然後創建一個新的流,首先根據文件內容輸入「@」或「>」,然後填入剩餘的gunzip.stdout-stream轉換爲新的流。然後這個新的流將被送入過濾器的Popen stdin。
請注意,文件大小可能比可用內存大幾倍。我不希望從遠程存儲器執行多個源文件的單次讀取,也不需要進行不必要的文件訪問。
歡迎任何想法!請問我問題,以便我澄清一下,如果我沒有說清楚。
使用[gzip的(http://docs.python.org/library /gzip.html#module-gzip)模塊而不是外部'gzip'應該給你更多的靈活性。 –
@PedroRomano是的,它可能。我擔心我通過文件訪問的次數。這將成爲在超級計算機系統上執行的管道的數據採集步驟的一部分,並且可能會同時在多個節點上運行,並且太多的文件系統調用可能導致遠程文件服務器無法訪問。 – user1727089