Python - 读取文件并按行

时间:2017-03-21 13:22:02

标签: python email pandas

我可以用Python读取文件,然后直接将每行的数据附加到Pandas数据帧吗?

我要解析的数据包含在电子邮件正文中:

enter image description here

我尝试使用RegEx来捕获以下数据:

物种GB EAST cod, GB blackback

部门NEFS 5

954, 30,000

价格$0.83, $0.07

日期09/01/2014

但事实证明很难捕捉所有这些......

我可以轻松获得日期,因为它会始终显示在Sent:后我使用RegEx捕获Sent:之后的所有内容,然后dateutil捕捉日期。

扇区也很容易,我只有RegEx搜索20个扇区中的一个,如果它看到其中一个捕获它。

但是捕捉物种,磅数和价格数据并确保它们正确排列,并将它们整齐地放入数据框中就是我被困住的地方。所以我现在的想法是只捕获电子邮件正文中的每一行,并将我捕获的内容分解为数据帧的不同列。

我知道这不是最干净的捕获,但我宁愿得到太多的数据,只需要稍后手动删除一些,而不是获得足够的数据。

所以我的问题是:用Python可以读取文件并将我读到的所有内容传输到Pandas数据帧中吗?

2 个答案:

答案 0 :(得分:0)

是的,一旦文件中有数据,就可以使用pandas.read_csv('filename.csv')。查看pandas.read_csv了解详情。

答案 1 :(得分:0)

这是一个过于具体的功能,我将其用于阅读电子邮件的鱼段后,我将其放入文本文件中。它假设你已经取消了日期和行业。

它可能不适用于您的实现,但希望使用python字符串方法可以使您朝着正确的方向前进,并向您展示如何将其全部添加到DataFrame中。

def fish_to_frame(fish_file, sector, date):
    # Initialize some lists
    species = []
    pounds = []
    prices = []
    date = pd.to_datetime(date, infer_datetime_format=True)
    with open(fish_file) as f:
        for line in f:
            # Fish: weight @ price
            fish, remainder = line.split(':')
            if '@' in remainder:
                weight, price = remainder.split('@')
            if 'trade' in remainder:
                weight, price = remainder.split('to ')
            weight = weight.strip(' lbs')
            species.append(fish)
            pounds.append(weight)
            prices.append(price)
    fish_frame = pd.DataFrame({'Species':species,
                              'Sector':sector,
                              'Pounds':pounds,
                              'Prices':prices,
                              'Date':date})
    return fish_frame

你可以在那里做一些额外的步骤,将权重等转换为数字等。希望这有帮助!

另外一个步骤可能是将此与已存在的列已有的DataFrame相结合。但是逐行添加新条目会很慢(呃)。