2016-01-06 54 views
0

我有一堆包含製表符分隔的文本文件。第二列包含一個ID號,每個文件已經按該ID號排序。我想通過第2列中的id號將每個文件分隔成多個文件。這就是我所擁有的。如何在python中通過id拆分文本文件

readpath = 'path-to-read-file' 
writepath = 'path-to-write-file' 
for filename in os.listdir(readpath): 
    with open(readpath+filename, 'r') as fh: 
      lines = fh.readlines() 
    lastid = 0 
    f = open(writepath+'checkme.txt', 'w') 
    f.write(filename) 
    for line in lines: 
      thisid = line.split("\t")[1] 
      if int(thisid) <> lastid: 
       f.close() 
       f = open(writepath+thisid+'-'+filename,'w') 
       lastid = int(thisid) 
      f.write(line) 
    f.close() 

我得到的是簡單地全部用在新的文件名前面的每個文件的第一個ID號讀取文件的副本。這就好像

thisid = line.split("\t")[1] 

只在循環中完成一次。對發生了什麼的任何線索?

編輯

使用的問題我的文件\ r而非\ r \ n至終止線。更正後的代碼(只需添加'儒的打開讀取文件和交換時爲= <>!):

readpath = 'path-to-read-file' 
writepath = 'path-to-write-file' 
for filename in os.listdir(readpath): 
    with open(readpath+filename, 'rU') as fh: 
      lines = fh.readlines() 
    lastid = 0 
    f = open(writepath+'checkme.txt', 'w') 
    f.write(filename) 
    for line in lines: 
      thisid = line.split("\t")[1] 
      if int(thisid) != lastid: 
       f.close() 
       f = open(writepath+thisid+'-'+filename,'w') 
       lastid = int(thisid) 
      f.write(line) 
    f.close() 
+0

你檢查什麼'INT(thisid)'實際上是由之前'如果將一個'打印(INT(thisid))'評估在每個經過一輪循環,例如'塊? – nekomatic

+0

我剛把'f.write(line +'\ r')'改成'f.write(thisid + line +'\ r')''thisid'只出現在第一行。 – Joseph

+0

只需注意:'<>'在Python 3.x中已被刪除,即使使用2.x也不推薦使用'!=' –

回答

3

如果你處理的製表符分隔的文件,那麼你可以使用csv模塊,並利用itertools.groupby將爲您執行之前/當前跟蹤的ID。還利用os.path.join來確保您的文件名最終正確連接。

未經測試:

import os 
import csv 
from itertools import groupby 

readpath = 'path-to-read-file' 
writepath = 'path-to-write-file' 

for filename in os.listdir(readpath): 
    with open(os.path.join(readpath, filename)) as fin: 
     tabin = csv.reader(fin, delimiter='\t') 
     for file_id, rows in groupby(tabin, lambda L: L[1]): 
      with open(os.path.join(writepath, file_id + '-' + filename), 'w') as fout: 
       tabout = csv.writer(fout, delimiter='\t') 
       tabout.writerows(rows) 
+0

看起來就像這樣做。似乎是某處的問題。 – Joseph

+1

@Joseph如果在某個時候你想分享它 - 它可能會很有用:p –

+1

發現我的原始代碼的問題...我試圖轉換的文件使用'\ r'來標記行而不是' Python的readlines()期望的\ r \ n'。我只是在打開文件時指定了''rU'',readlines()用[通用換行符支持]來識別它們(https://docs.python.org/2/glossary.html#term-universal-newlines) – Joseph