2017-04-12 23 views
0

我正在嘗試創建一個通用電子郵件提取器。我走過一個程序,它是就沒了下文:如何讓程序訪問任何類型的文件?

from optparse import OptionParser 
import os.path 
import re 

regex = re.compile(("([a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`" 
        "{|}~-]+)*(@|\sat\s)(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(\.|" 
        "\sdot\s))+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)")) 

def file_to_str(filename): 
    """Returns the contents of filename as a string.""" 
    with open(filename) as f: 
     return f.read().lower() # Case is lowered to prevent regex mismatches. 

def get_emails(s): 
    """Returns an iterator of matched emails found in string s.""" 
    # Removing lines that start with '//' because the regular expression 
    # mistakenly matches patterns like 'http://[email protected]' as '//[email protected]'. 
    return (email[0] for email in re.findall(regex, s) if not email[0].startswith('//')) 

if __name__ == '__main__': 
    parser = OptionParser(usage="Usage: python %prog [FILE]...") 
    # No options added yet. Add them here if you ever need them. 
    options, args = parser.parse_args() 

    if not args: 
     parser.print_usage() 
     exit(1) 

    for arg in args: 
     if os.path.isfile(arg): 
      for email in get_emails(file_to_str(arg)): 
       print (email) 
     else: 
      print ('"{}" is not a file.'.format(arg)) 
      parser.print_usage() 

我跑這個程序,它工作得很好用.txt.csv擴展文件。

但問題是,通過它我給輸入到該程序的文件夾也有.xsls.doc.docx.mdb.pdf等擴展名的文件,也有在他們的電子郵件。我不明白我如何修改我的程序來訪問這些或任何類型的擴展文件並從中提取電子郵件。

請讓我知道我如何解決我的問題的建議。

+0

許多文件(如'xlsx'和'docx')被壓縮。其他(如'doc'和'mdb')是專有格式。你不能只在原始內容上運行正則表達式,並期望能夠找到一個電子郵件地址。 – Phylogenesis

+1

你提到的格式是二進制的,它們不是被設計爲被閱讀爲文本,並且不能被視爲這樣。你可以天真地掃描他們的可識別的字符串,假設他們在原地顯示爲純文本,但這不會可靠地工作,.docx例如被壓縮。執行此操作的正確方法是使用適合所討論文件類型的解析器。 –

+0

所以沒有解決方法來閱讀文件沒有辦法解決。即使是二進制文件,如果我讀取文件,那麼是否可以從文件中提取電子郵件? –

回答

0

你應該打開文件與「RB」標誌

with open(filename, 'rb') as f: 

注意,DOC,PDF,......既不是文本文件,以便爲每種類型需要特殊的解析器的內容解析

+0

使用'rb'我將能夠從任何文件中提取電子郵件? –

+0

不,但在python3打開沒有'b'標誌的二進制文件時,你會得到'UnicodeDecodeError' – aliva

+0

你認爲你的回答可以回答我的問題嗎?請你能詳細說明在我的情況下對我有何幫助。正如我所說我正試圖從任何類型的文件創建一個電子郵件提取器。 –

相關問題