Извлеките все электронные письма из папки с несколькими файлами Excel и несколькими вкладками в pandas фрейм данных в python - PullRequest
0 голосов
/ 25 апреля 2020

Я хотел бы извлечь все идентификаторы электронной почты из определенной папки, содержащей несколько файлов Excel, причем каждый файл содержит несколько вкладок. в каждой вкладке может быть несколько столбцов, которые могут иметь действительный идентификатор электронной почты. мне не хватает куска кода для l oop через все столбцы в пределах данного df и извлечь действительные идентификаторы электронной почты. Ценю помощь

import os
import pandas as pd

path = 'C:\\'
files = os.listdir(path)
files_xls = [f for f in files if f[-4:] == 'xlsx']
files_xls.sort(key=lambda x: os.path.getmtime(x), reverse=True)
os.chdir(path)
df_email = pd.DataFrame()
for i in range(1): #Read the excel file with the most recent modified timestamp
    print(files_xls[i])

    xls = pd.ExcelFile(files_xls[i])
    for sheet in xls.sheet_names:
        df = pd.read_excel(files_xls[i], sheet_name=sheet)

    #emails = <Need code snippet that will loop through all columns within this sheet and extract valid email ids>

    df_email = df_email.append(emails,ignore_index=True)

1 Ответ

1 голос
/ 26 апреля 2020

Регулярные выражения для захвата адресов электронной почты могут быть довольно запутанными, это используемое здесь - на полпути между сложностью и точностью.

^(([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,18}(?:\.[a-z]{2})?))$

Данные, используемые внутри файла XLS:

Excel вкладка файла Plan1 (данные хорошего поведения)

id, first_name, last_name,   email,                       gender,   ip_address
1,  Bernarr,    Readman,     breadman0@phoca.cz,          Male,    1.201.143.69
2,  Nyssa,      Rawet,       nrawet1@biblegateway.com,    Female,  240.226.205.57
3,  Catherin,   Bruins,      cbruins2@webeden.co.uk,      Female,  55.5.216.180
4,  Doloritas,  Arendt,      darendt3@census.gov,         Female,  120.253.124.157
5,  Mackenzie,  Kirsz,       mkirsz4@nps.gov,             Male,    5.237.249.9

вкладка файла Excel Plan2 (отдельные письма)

id,    first_name,       last_name,           email,                 gender,                   ip_address
1,     Benny,            Philpots,            bphilpots0@joomla.org, Female,                   147.151.61.216
2,     Karie,            pcopo5@columbia.edu, no-email.here,         Female,                   219.167.139.86
3,     Hedwig,           Huckster,            no-email.here,         hhuckster2@e-recht24.de,  211.20.77.203
4,     cseary3@uiuc.edu, Seary,               no-email.here,         Female,                   0.217.162.126
5,     Amara,            Itchingham,          no-email.here,         Female,                   avlasin8@comsenz.com


Выполните итерацию над фреймом данных в виде списка df.values.tolist() и попробуйте сопоставить каждый элемент с ожидаемым регулярным выражением.

import os
import pandas as pd

import re
regex = r"^(([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,18}(?:\.[a-z]{2})?))$"

path = "."
files = os.listdir(path)
print(files)
files_xls = [f for f in files if f[-4:] == 'xlsx']
files_xls.sort(key=lambda x: os.path.getmtime(x), reverse=True)
os.chdir(path)
df_email = pd.DataFrame()
for i in range(1): #Read the excel file with the most recent modified timestamp
    print(files_xls[i])

    xls = pd.ExcelFile(files_xls[i])
    for sheet in xls.sheet_names:
        df = pd.read_excel(files_xls[i], sheet_name=sheet)

        for row in df.values.tolist():
            for col in row:
                matches = re.findall(regex, str(col))
                if matches:
                    df_email = df_email.append([matches[0]], ignore_index=True)
print(df_email)

Вывод из df_email :

                          0           1             2    3
 0        breadman0@phoca.cz   breadman0         phoca   cz
 1  nrawet1@biblegateway.com     nrawet1  biblegateway  com
 2    cbruins2@webeden.co.uk    cbruins2    webeden.co   uk
 3       darendt3@census.gov    darendt3        census  gov
 4           mkirsz4@nps.gov     mkirsz4           nps  gov
 5     bphilpots0@joomla.org  bphilpots0        joomla  org
 6       pcopo5@columbia.edu      pcopo5      columbia  edu
 7   hhuckster2@e-recht24.de  hhuckster2     e-recht24   de
 8          cseary3@uiuc.edu     cseary3          uiuc  edu
 9      avlasin8@comsenz.com    avlasin8       comsenz  com

Примечания:

  • Вам по-прежнему нужно перебирать папку, чтобы прочитать каждый файл XLS.
  • При создании этого примера реальным электронным письмам не было причинено вреда =)
  • Сгенерированные данные с помощью Realisti c Генератор данных
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...