2016-09-07 57 views
0

我想給你舉個例子。如果我試圖從文件中打印包含整數-9999的行。如何在Python中讀取文本文件時使用正則表達式?

19940325  78  -28 -9999 
19940326  50  17  102 
19940327  100  -11 -9999 
19940328  56  -33  0 
19940329  61  -39 -9999 
19940330  61  -56  0 
19940331  139  -61 -9999 
19940401  211  6  0 

這裏是我的代碼,使用正則表達式來閱讀文本文件和掃描以查找整數-9999並打印線/包含整數行。

import re 

file= open("USC00110072.txt", "r") 


for line in file.readlines(): 
    if re.search('^-9999$', line, re.I): 
     print line 

我的代碼運行出錯,但沒有在輸出中顯示任何內容。請讓我知道我犯了什麼錯誤。

+1

您只需直接迭代在你的文件上(即''in line in file') - 'readlines'會將整個文件讀入* first *。當你的文件是50GB時這很糟糕。 –

回答

3

正則表達式是這個有可能矯枉過正,使用in操作簡單的串支票似乎足以

with open("USC00110072.txt") as f: 
    for line in f: 
     if '-9999' in line: 
      print(line) 

或者,如果你關心的是匹配,作爲一個「全字」你可以做多一點瓜分值

with open("USC00110072.txt") as f: 
    for line in f: 
     if '-9999' in line.strip().split('\t'): 
      print(line) 
+0

如果只需要打印第三列中值爲-9999的行,該怎麼辦? –

1

您可以使用filter

with open(fn) as f: 
    print filter(lambda line: '-9999' in line.split()[-1], f) 

這將檢查'-9999'是否在行的最後一列。

如果你想使用正則表達式:

with open(fn) as f: 
    for line in f: 
     if re.search(r'-9999$', line): # remove $ if the -9999 can be anywhere in the line 
      print line.strip() 

^你永遠不會匹配不同的是隻包含-9999,並沒有別的線路。 ^表示該行的開始。

或者,只是使用in測試字符串的存在:

with open(fn) as f: 
    for line in f: 
     if '-9999' in line: 
      print line.strip() 
+0

謝謝Dawg。真的很感謝 –

1

或者,因爲你有一個csv文件,你可以使用csv模塊:

import csv 
import io 

file = io.StringIO(u''' 
19940325\t78\t-28\t-9999 
19940326\t50\t17\t102 
19940327\t100\t-11\t-9999 
19940328\t56\t-33\t0 
19940329\t61\t-39\t-9999 
19940330\t61\t-56\t0 
19940331\t139\t-61\t-9999 
19940401\t211\t6\t0 
'''.strip()) 

reader = csv.reader(file, delimiter='\t') 
for row in reader: 
    if row[-1] == '-9999': # or, for regex, `re.match(r'^-9999$', row[-1])` 
     print('\t'.join(row)) 
+1

對於製表符分隔的數據使用'csv'是一個好主意,假設個別領域是重要的。我也會用它來輸出,以防萬一;你可以把'sys.stdout'包裝在'csv.writer'中來匹配。 – ShadowRanger

相關問題