polusok
(Mykhailo Poliarush)
#1
Мне надо было создать скрпит, чтобы вытягивал емейлы из вордовских файлов. Задача решена следующим образом:
{syntaxhighlighter brush: bash;fontsize: 100; first-line: 1; }import os, re, win32com.client
msword = win32com.client.Dispatch(‘Word.Application’)
msword.Visible = 0
try:
path = “C:\temp\”
files = os.listdir(path)
files.reverse()
emailfile = open(path+‘emaillist.txt’, ‘w’)
i=0
for file in files:
file = “%s%s” % (path, file)
doc = msword.Documents.Open(file)
r=re.search(’([\w-.]+@(\w[\w-]+.)+[\w-]+)’, doc.Content.Text)
if r is not None:
email = r.group(0)
emailfile.write(email+",\n")
i = i + 1
print ("["+str(i)+"] “+file+” DONE")
doc = msword.Documents.Close()
msword.Quit()
except RuntimeError as error:
msword.Quit()
print ("error = "+error){/syntaxhighlighter}
Интересует, можно ли было сделать проще?
polusok
(Mykhailo Poliarush)
#2
Мой коллега предложил некоторые улучшения к текущему подходу. Так как он более знает Питон, то его решение получилось немного лучше.
{syntaxhighlighter brush: python;fontsize: 100; first-line: 1; }import os, re, win32com.client
msword = win32com.client.Dispatch('Word.Application')
msword.Visible = 0
path = "C:\\temp\\"
try:
files = os.listdir(path)
emailfile = open(os.path.join(path, 'emaillist.txt'), 'w')
compreg = re.compile('([\w\-\.]+@(\w[\w\-]+\.)+[\w\-]+)', re.IGNORECASE)
for i in range(0, len(files)):
filename = os.path.join(path, files[i])
doc = msword.Documents.Open(filename)
emails = re.findall(p, doc.Content.Text)
if emails:
for email in emails:
emailfile.write(email)
emailfile.write()
print ("[%d] %s DONE" % (i, filename))
doc = msword.Documents.Close()
except ...
# process all exceptions here
finally:
msword.Quit(){/syntaxhighlighter}</p>