2012-06-10 15 views
1

我是一個試圖製作腳本的Python初學者,它使用製表符分隔的文本文件作爲輸入將指定的行轉換爲列。這裏是文件中的行的一個示例:個體(列0)的Python:將行轉換爲文件中的列

1 chr1 1008376 1258657 250281 4628 666 2832 565 16.6323226376 83.3676773624 
1 chr1 1258657 1516806 258149 2544 601 1481 231 13.4929906542 86.5070093458 
1 chr1 1516806 1766886 250080 1652 590 936 63 6.30630630631 93.6936936937 
1 chr1 1766886 2017159 250273 5030 1608 2698 362 11.8300653595 88.1699346405 

本質文件經過在染色體區域(柱2-3)的列表(第1列),並給出了統計爲該地區計算(第9欄)。該文件首先列出了個人1,然後2,直到最後的個人的所有地區。文件中有20個人。 像一個不包含0或4-8列的新文件,並且具有新列,這些列是該行中該地區(現在爲1-2列)的分數。因此,對於個人1列3現在將是先前列9列4將是該地區在個人2中的得分,依此類推。因此,每行的第2列(chr1)作爲第0列,而區域得分(第1-2列)之後的20列是20個人中每一個的得分。 目前得分是在行中,所以文件有很多行。 1-3列中的每個個體值都是相同的,所以不存在不重疊的區域問題。也是所有人都有相同數量的行。換句話說,列2 + 3在文件中被重複20次。

如果這太複雜/密集下面的解釋是一個簡明的例子來說明問題。

這裏是我想什麼是簡單的虛擬例如:

原始文件:

1 chr1 10 20 30423 
1 chr1 20 30 40556 
2 chr1 10 20 73476 
2 chr1 20 30 43657 
3 chr1 10 20 34656.5 
3 chr1 20 30 90848 

改爲:

chr1 10 20 30423 73476 34656.5 
chr1 20 30 40556 43657 90848 

因此,如果任何Python用戶對轉換的一些技巧行到列,即使你沒有時間去專門解決這個問題,也會非常有幫助我發現行到列轉換是一個特別棘手的問題,尤其是當它的條件是列的值(這裏是列0)時。

請讓我知道,如果我能澄清問題。任何幫助或意見表示讚賞。

所以更新:感謝您的所有意見,這裏是我想出迄今:

ListofData = [] # make list 
individual=1 # only interested in first individual to get list of windows for the chromosome 
for line in file('/mnt/genotyping/Alex/wholegenome/LROH/LROHSplitbyChrom/Filtered_by_MappingQuality20/SimpleHomozygosityScore/HomozygosityStatisticsTameratsalllanesMinMQ20chr20'): 
    line = line.rstrip() 
    fields = line.split("\t") 
    if "chr" in line: #avoids header 
     if int(fields[0]) == individual: 
      ListofData.extend(fields[2:5]) # add start, end and size of window to list 

     else: # once iterated through windows, split the list into sets of three, making it one list per line 
      lol = [ListofData[i:i+3] for i in range(0, len(ListofData), 3)] #list of lists divided into 3's 

smallcounter = 0 
for i in lol: #for set of 3 in list 
    for line in file('/mnt/genotyping/Alex/wholegenome/LROH/LROHSplitbyChrom/Filtered_by_MappingQuality20/SimpleHomozygosityScore/HomozygosityStatisticsTameratsalllanesMinMQ20chr20'): 
     if "chr" in line: # avoids header 
      line = line.rstrip() 
      fields = line.split("\t") 
      if str(fields[2]) == lol.pop(0): #if start position in line matches start position in i 
       i.extend(fields[9]) #add homozygosity score to list 
       counter = counter + 1 
      if smallcounter == 20: #if gone through all individuals in file 
       smallcounter = 0 #reset counter for next try 
       print i 

我通過文件想拿我在2-4列想要的信息,並把它放在一個列表。然後,我將這個列表分成與每行對應的3個組。 然後在第二個循環中,我試圖說明列表中的每個3(對於列表中的每個列表都是這樣)遍歷文件,並且如果列表中的第一個位置與文件中的開始位置相同(字段[2]),然後將字段[9]中的分數添加到該列表中。 然後,我需要做的就是一個接一個地打印列表以獲得我所追求的內容。 但是我有對線路難度:

if str(fields[2]) == lol.pop(0): 

我想Python來看看列表中的第一位置,這是最初領域[2],並詢問是否是一樣的領域[2]在循環中的位置。如果是的話,它應該將字段[9]附加到列表中。

讓我知道是否需要更好地解釋。

非常感謝您提前,您的幫助真的很感謝!

+0

作爲一個建議,你可能要編輯這篇文章,顯示在Python的命令行一些工作。在計算器中,展示你所做的一些工作總是有幫助的。 – octopusgrabbus

+0

謝謝我嘗試做這件事,當我有一些腳本一直在努力,但不幸的是,在這裏我不知道從哪裏開始。我之前一直在bash中使用'join'進行類似的任務,但是這是合併來自單獨文件的數據。在這裏閱讀一個文件,我不知道從哪裏開始。但是當我工作時,我會發布我能想到的東西。謝謝 – user964689

+0

第10列怎麼樣? –

回答

4

很難開始使用新的語言,你必須從某個地方開始。幸運的是,您已經選擇了Python,並且您有一個Python命令行。使用它,你可以測試你將如何創建列,等等。

首先,您需要讀入輸入文件並處理每行中的信息。 Python CSV module非常好。我在水利工程項目中使用了它,隨後在許多其他需要.csv處理的項目中使用它。

但是你有一個製表符分隔的文件。我從未嘗試將分隔符設置爲製表符,並驗證它是否使用製表符分隔的文件。如果嘗試這種方式無效 - 並且可以在Python命令行中進行測試 - 作爲解決方法,您可以將製表符分隔的文件轉換爲sed並將製表符轉換爲逗號。

至於列,行代表,在Python中,你將不得不有一個列表的列表。那就是你需要有[[1,2] [3,4] ...]。

Python中的列表是可變的,所以你可以追加到它們。你會初始化列表的列表空列表

lol = [] 

那麼你就需要根據你想跨越的列數列表添加到笑。說你是兩列排,只是數字放在一起,作爲一個練習,你可以這樣做:

lol.append([1,2]) 
lol.append([3,4]) 
lol.append([5,6]) 

>>> lol 
[[1, 2], [3, 4], [5, 6]] 
+0

python'csv'模塊可以使用製表符分隔的文件就好了。請查看[文檔的方言部分](http://docs.python.org/library/csv.html#dialects-and-formatting-parameters)瞭解更多信息。這可能是[excel-tab](http://docs.python.org/library/csv.html#csv.excel_tab)預定義的方言適用於開箱即用的OP。 –

+0

@MartijnPieters感謝您跟進此事。我不喜歡推薦我還沒試過的東西。我所處理的全部是.csv格式,從財產評估到水讀。 – octopusgrabbus

+0

感謝球員,我會玩弄這個,並讓你知道它是怎麼回事 – user964689

1

下面是一些代碼來給你可以做些什麼的想法。我會省略花裏胡哨的(例如,三個第一個if's可以在一個循環中更優雅地完成;等等),並呈現出純粹的代碼。我是從文件「chr.txt」和寫作閱讀stdout

def readTabbedFile(filename): 
    out = {} 
    file = open(filename, 'r') 
    for line in file.readlines(): 
     line = line.rstrip('\n\r') 
     parsedLine = line.split('\t') 
     if not parsedLine[1] in out: 
      out[parsedLine[1]] = {} 
     if not parsedLine[2] in out[parsedLine[1]]: 
      out[parsedLine[1]][parsedLine[2]] = {} 
     if not parsedLine[3] in out[parsedLine[1]][parsedLine[2]]: 
      out[parsedLine[1]][parsedLine[2]][parsedLine[3]] = [] 

     out[parsedLine[1]][parsedLine[2]][parsedLine[3]].append(parsedLine[9]) 

    for key0 in out.keys(): 
     for key1 in out[key0].keys(): 
      for key2 in out[key0][key1].keys(): 
       outStr = key0 + "\t" + key1 + "\t" + key2 + "\t" 
      for val in out[key0][key1][key2]: 
       outStr += "\t" + val 
       print(outStr) 

    file.close() 

if __name__ == '__main__': 
    readTabbedFile("chr.txt") 
1

您可以用列表解析行轉換成列的矩陣涉及您的問題。

enter image description here