我正在嘗試創建一個通用電子郵件提取器。我走過一個程序,它是就沒了下文:如何讓程序訪問任何類型的文件?
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
等擴展名的文件,也有在他們的電子郵件。我不明白我如何修改我的程序來訪問這些或任何類型的擴展文件並從中提取電子郵件。
請讓我知道我如何解決我的問題的建議。
許多文件(如'xlsx'和'docx')被壓縮。其他(如'doc'和'mdb')是專有格式。你不能只在原始內容上運行正則表達式,並期望能夠找到一個電子郵件地址。 – Phylogenesis
你提到的格式是二進制的,它們不是被設計爲被閱讀爲文本,並且不能被視爲這樣。你可以天真地掃描他們的可識別的字符串,假設他們在原地顯示爲純文本,但這不會可靠地工作,.docx例如被壓縮。執行此操作的正確方法是使用適合所討論文件類型的解析器。 –
所以沒有解決方法來閱讀文件沒有辦法解決。即使是二進制文件,如果我讀取文件,那麼是否可以從文件中提取電子郵件? –