2014-11-08 215 views
3

我有一個非常大的包含900000行的文本文件。我必須計算沒有'year1995'和'1996年'的線。我做了如下:計算不包含某些字符串的列表元素的數量

fname = r"data.txt" 
with open(fname,'r') as fi: 
    lines = fi.read().splitlines() 
    print len(lines) 
    test = [l for l in lines if 'year1995' or 'year1996' not in l] 
    print len(test) 

但是我的代碼沒有產生預期的結果。

任何想法?

+0

爲什麼不只是做「egrep -v」year1995 | year1996「data.txt」?而且要計算,只需在末尾添加「| wc -l」 – 2014-11-08 18:37:28

回答

1

你在那裏的代碼會把每一行放在test。這是因爲第一個if語句總是會計算爲True,因爲非空字符串是真實的。

[l for l in lines if not ('year1995' in l or 'year1996' in l)] 
0

你需要改變你的if條件:

if not 'year1995' in l or not 'year1996' in l 

if not ('year1995' in l or 'year1996' in l) 

注:你需要把一個條件not操作後!

1

這是毫無意義的創建列表把它扔掉,只需要使用金額:修真之內更改測試也沒有必要

with open(fname,'r') as fi: 
     print sum(not any(x in line for x in ('year1995','year1996')) for line in fi) 

lines = fi.read().splitlines(),只是遍歷文件對象,它將成爲每一行。

+0

確實更好!一個可能更有效的內存 – 2014-11-08 18:57:14

+0

@Apero,除非OP需要它們似乎沒有的列表,否則創建兩個列表毫無意義 – 2014-11-08 18:58:22

+0

@Apero更高效,但我仍然不會使用python,正如我的評論中提到的這個問題本身。除非OP想要在本節之後處理代碼中過濾出的行。 – 2014-11-08 19:00:12

相關問題