首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文本格式的电子邮件合并到一个csv文件中,以进行机器学习

将文本格式的电子邮件合并到一个csv文件中,以进行机器学习
EN

Stack Overflow用户
提问于 2020-04-27 13:39:33
回答 3查看 573关注 0票数 0

我正在使用Enron数据集来解决机器学习问题。我想将所有垃圾邮件文件合并到一个csv文件中,并将所有ham文件合并到另一个csv文件中,以便进一步分析。我正在使用这里列出的数据集:https://github.com/crossedbanana/Enron-Email-Classification

我使用下面的代码来合并电子邮件,并且我能够合并它们。但是,当我尝试读取csv文件并将其加载到pandas中时,由于ParserError: Error tokenizing data. C error: Expected 1 fields in line 8, saw 2而出现错误

将txt中的电子邮件文件合并到csv中的代码

代码语言:javascript
复制
import os
for f in glob.glob("./dataset_temp/spam/*.txt"):
    os.system("cat "+f+" >> OutFile1.csv")

Code to load into pandas:

```# reading the csv into pandas

电子邮件= pd.read_csv('OutFile1.csv')

打印(emails.shape)`

我怎样才能摆脱解析器错误?发生这种情况是由于电子邮件中存在逗号I think.How我可以只将每封电子邮件和电子邮件正文加载到pandas中吗?

这是电子邮件格式的外观(垃圾邮件文件夹中的文本文件示例)

第3行中的逗号在加载到pandas时出现问题

*主题:你的处方已经准备好了。。0xwq%s f e

低成本处方药

soma,ultram,adipex,vicodin等等

网上开具并发货的处方

连夜送到你的门口!!

我们的一位有执照的医生会写一份

fda批准了您的处方,并将您的

通过美国许可的药房直接连夜订购

送到你家门口。。。。又快又安全!

点击这里!

不用了,谢谢,请把我从你的名单上去掉。

ogrg z

lqlokeolnq

lnu*

谢谢你的帮助。

代码语言:javascript
复制
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-01 01:46:37

我用这种方式解决了我的问题。先读完所有txt文件

代码语言:javascript
复制

BASE_DIR = './‘

SPAM_DIR =‘./垃圾邮件’

def load_text_file(文件名):

代码语言:javascript
复制
    text_list = []
代码语言:javascript
复制
    for filename in filenames:
代码语言:javascript
复制
         with codecs.open(filename, "r", "utf-8", errors = 'ignore') as f:
代码语言:javascript
复制
             text = f.read().replace('\r\n', ' ')
代码语言:javascript
复制
             text_list.append(text)
代码语言:javascript
复制
return text_list

将其添加到带有文件名的列表中

ham_filenames = glob.glob( BASE_DIR + HAM_DIR + '*.txt')

ham_list = load_text_file(ham_filenames)

将列表加载到数据帧中

df = DataFrame (train_list,columns='emails')

代码语言:javascript
复制

一旦我有了数据帧,我就把电子邮件解析成主题和正文。感谢大家的帮助。

票数 0
EN

Stack Overflow用户

发布于 2020-04-27 13:47:17

您可以使用excel文件,而不是在CSV文件中读取和写入数据。因此,您不会因为',‘(逗号)而得到任何错误。只需用excel替换csv即可。

下面是一个示例:

代码语言:javascript
复制
    import os
    import pandas as pd
    import codecs

    # Function to create list of emails.
    def create_email_list(folder_path):
        email_list = []
        folder = os.listdir(folder_path)#provide folder path, if the folder is in same directory provide only the folder name
        for txt in folder:
            file_name = fr'{folder_path}/{txt}'
            #read emails
            with codecs.open(file_name, 'r', encoding='utf-8',errors='ignore') as f:
                email = f.read()
                email_list.append(email)
        return email_list

    spam_list = create_email_list('spam')#calling the function for reading spam 
    spam_df = pd.DataFrame(spam_list)#creating a dataframe of spam
    spam_df.to_excel('spam.xlsx')#creating excel file of spam

    ham_list = create_email_list('ham')#calling the function for reading ham
    ham_df = pd.DataFrame(ham_list)#creating a dataframe of spam
    ham_df.to_excel('ham.xlsx')#creating excel file of ham

只需在函数中传入文件夹路径即可(文件夹名称为文件夹在同一目录下)。这段代码将创建excel文件。

票数 0
EN

Stack Overflow用户

发布于 2020-04-27 16:01:45

为了避免,出现问题,您可以使用不同的分隔符(例如|)或用引号将字段括起来:

代码语言:javascript
复制
"soma , ultram , adipex , vicodin many more"

如果字段中有引号,则必须使用另一个引号对其进行转义:

代码语言:javascript
复制
"soma , ultram , ""adipex"" , vicodin many more"

但是,对于每个邮件中的每一行,您的示例都将有一条csv记录。每封电子邮件有一条记录可能更符合逻辑:

代码语言:javascript
复制
subject,body
your prescription is ready . . oxwq s f e,"low cost prescription medications
soma , ultram , adipex , vicodin many more
prescribed online and shipped
overnight to your door ! !
one of our us licensed physicians will write an
fda approved prescription for you and ship your
order overnight via a us licensed pharmacy direct
to your doorstep . . . . fast and secure ! !
click here !
no thanks , please take me off your list
ogrg z
lqlokeolnq
lnu"
test subject2,"test
body 2"

上面的示例给出了一个包含两列的表:subjectbody,其中body是用双引号括起来的多行字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61452365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档