2012-10-23 179 views
0

我正在嘗試將某個.txt文件導入一些專有軟件,但似乎不斷收到錯誤。 .txt文件大小几乎爲2GB,大約有5600萬行。字符串的長度(Python)

在與製造商溝通後,他們表示可能在其中一行中存在錯誤。每行應包含一個MD5散列值(32個字符),因此,使用Python v2.7,我期望掃描處理.txt文件以檢查每行的長度並打印出'違規'行的值。

這是我已經試過: -

f = open("x.txt") 
contents = f.readlines() 
f.close() 
for line in contents: 
    if line(len) == 32: 
     continue 
    else: 
     print line 

不幸的是,當我嘗試這個代碼,我收到一個錯誤: -

File "<pyshell#30>", line 2, in <module> 
    if line(len) == 32: 
TypeError: 'str' object is not callable 

所以,我想下面的相信我不得不轉換「線」爲整數: -

for line in contents: 
    if int(line)(len) == 32: 
     continue 
    else: 
     print line 

但只是帶回了一個錯誤: -

ValueError: invalid literal for int() with base 10: '000000000000000012452154365298BD" 

至於說,我在尋找什麼做的是閱讀的.txt文件的每一行,如果它不是一個有效的MD5哈希值,打印到屏幕甚至刪除該值的價值。

非常感謝

[編輯]原來這是一個小學生的錯誤。感謝所有

回答

8

由於您的文件是2 GB的大小,我不建議這樣做你正在做的方式,即使你糾正line(len)len(line)。您正在將整個文件讀入內存中,這是不必要的,如果內存不足,可能會導致內存不足錯誤。以下是我想做到這一點:

with open("x.txt") as f: 
    for line_no, line in enumerate(f): 
     # Remember not to count the newline character 
     if len(line.strip()) != 32: 
      print line_no, line 

如果你想刪除了錯誤的字符數都行,最簡單的方法是寫一個新的,正確的文件:

with open("outfile.txt", "w") as out: 
    with open("x.txt") as f: 
     for line_no, line in enumerate(f): 
      if len(line.strip()) == 32: 
       out.write(line) 
      else: 
       print "Removing line {0}".format(line_no) 

腳本後檢查新文件是否正常,然後將舊文件移到備份目錄並重新命名新文件x.txt

+0

謝謝。而不是「打印line_no」,我怎麼能改變這個刪除行?謝謝 – thefragileomen

+0

@ thefragileomen查看更新的答案。 –

7

line(len)是錯誤的,使用len(line)代替

0

恐怕你倒退了:使用len(line)而不是line(len)

+0

一個屬性,它會讀'line.len()' – Ber

+1

oops ...不幸的是我不是很精通python,但我正在學習:)謝謝。 – Destrictor