2015-06-12 45 views
0

我有一個文件,我正在通過FTP下載。這是一個非常大的文件,所以我只想得到第一個說法,現在可以使用20行。我想將這20行寫入本地機器上的新文件。在這個過程中,我想匹配行中的一個值。從文件中獲取前x行,並在子串上匹配

該文件是管道分隔每行的開頭是這樣的:

9999-12-31 | XX | ...

我只想寫入到輸出文件時第二個字段的值是XX,否則忽略它。

這裏是我的代碼的基礎:

def writeline(line): 
    file.write(line + "\n") 

file = open(localDir + fileName, "w+") 
ftp.retrlines("RETR '" + remotePath + "'", writeline) 

所有這些代碼工作正常,下載的文件,如果我要輸出的整個文件。我試圖在我的 writeline函數中放入一個while循環,但它只是將我在循環中指定的次數寫入每行,這在事後看來是有道理的。似乎while循環需要以某種方式在 retrlines函數中。

我對Python很新,所以我很感謝您提供的任何幫助,以及對我的noob問題的耐心等待。

更新 好吧,它看起來像匹配的子串,我可以這樣做:

line[11:13] 

但仍留給我的努力只得到第一個X線與正常工作的問題。

+0

你可以嘗試在回調函數中使用itertools.islice –

+0

這是否需要成爲更大程序的一部分。我會考慮只使用awk而不是python,這就是它的用途。它可能是這樣的,'''awk -F | {if(NR <21){print $ 2}}> new_file.txt'''您可能會打開一個管道到文件以提供awk,因此您不必在本地擁有它,因爲您提到了大小。 – dave

回答

-1

嘗試以其他方式打開文件,是這樣的:

def writeline(i,line): 
    if line[11:13] == 'XX': 
     file.write(line + "\n") 
     i+=1 
    return i 

file_ = open(localDir + fileName).read.splitlines() 
i = 0 
while i < 20: 
    i = writeline(file_[i]) 
0

我要在你的整個文件的工作,這裏的功能來過濾文件,並寫入其他根據過濾模式:

def get(f, pattern="XX", index=1, sep="|", max=100): 
    c = 0 
    with open(f) as in_: 
     for line in in_: 
      if line.split(sep)[index] == pattern: 
       c += 1 
       yield line 
       if c == max: 
        return 

def set(outf, inf): 
    with open(outf, "w") as out: 
     for l in get(inf): 
      out.write(l) 

set("out.txt", f) 
-1

從來沒有嘗試過,但使用ftp.abort()應該能夠終止數據傳輸。

快速樣機,沒有測試過,我會怎麼做:

counter = 0 

def writeline(line): 
    if 'XX' in line.split('|') and counter < 20: 
     with open(filename, 'a') as f: 
      f.write(line += "\n") 
      counter += 1 
    if counter == 20: 
     ftp.abort() 

ftp.retrlines("RETR '" + remotePath + "'", writeline) 

雖然那種似乎總是醜重新打開的WriteLine函數中的文件。另一方面,它確保文件被正確關閉,這可能會在一段時間後被遺忘,並在未正確處理時導致問題。