使用csv模块从.txt文件解析文本

时间:2015-06-22 14:48:07

标签: python python-2.7 parsing csv

我每天都收到一封电子邮件,除了部分数据不同外,电子邮件的格式始终相同。我写了一个VBA宏,将电子邮件导出到文本文件。现在它是一个文本文件,我想解析数据,以便我只获得新信息。

电子邮件的格式是这样的

> Irrelevant data  
> Irrelevant data
> Type:     YUK
> Status:   OPEN
> Date:     6/22/2015
> Description: ----
> 
> Description blah blah blah
> Thank you

我想捕获相关数据。例如,在这种情况下,我想只捕获YUK,OPEN,2015年6月22日和描述等等等等。我尝试使用csv模块逐行扫描并打印出行但我似乎无法找到解析该信息的方法。

这是我到目前为止所拥有的。它只打印出线条。

import os
import glob
import csv

path = "emailtxt/"
glob = max(glob.iglob(path + '*.txt'), key=os.path.getctime)#most recent file located in the emailtxt
newestFile = os.path.basename(glob)#removes the emailtxt\ from its name

f = open(path+newestFile)

read = csv.reader(f)
for row in read:
    print row

f.close()

我如何解析文本文件?

4 个答案:

答案 0 :(得分:1)

我在这里并不瘦,你根本不需要csv模块,只需要定期的文件I / O就能为你做到你想做的事,即;逐行读取文件,并从每一行中提取您需要的数据并将其存储在list中,例如:

import os
import glob

path = "emailtxt/"
glob = max(glob.iglob(path + '*.txt'), key=os.path.getctime)#most recent file located in the emailtxt
newestFile = os.path.basename(glob)          #removes the emailtxt\ from its name

capture_list = []                            #list to hold captured words
with open(path+newestFile, 'r') as f:        #open the file for reading
    for line in f:                           #Go line by line
        capture_list.append(line.split()[2]) #add to the list last word

答案 1 :(得分:1)

如果能够单独打印出行,解析它们就是分开行(表示为字符串)的问题。假设在每个项描述符之后有一些空格,或者在每个描述符之后有一个冒号,你可以使用它来解析冒号和空格之后的任何内容。看到python字符串common operations能够在有用的点分割行。

在实际解析数据方面,您可以执行一系列if语句来捕获每个状态或文件类型。对于日期,请尝试使用time.strptime函数来评估datetime对象的日期。您所要做的就是匹配日期的格式,在您的情况下,似乎是“%m /%d /%y”。

答案 2 :(得分:1)

如何使用正则表达式

def get_info(string_to_search):
    res_dict = {}
    import re

    find_type = re.compile("Type:[\s]*[\w]*")
    res = find_type.search(string_to_search)
    res_dict["Type"] = res.group(0).split(":")[1].strip()

    find_Status = re.compile("Status:[\s]*[\w]*")
    res = find_Status.search(string_to_search)
    res_dict["Status"] = res.group(0).split(":")[1].strip()

    find_date = re.compile("Date:[\s]*[/0-9]*")
    res = find_date.search(string_to_search)
    res_dict["Date"] = res.group(0).split(":")[1].strip()

    res_dict["description"] = string_to_search.split("Description:")[1].replace("Thank you","")
    return res_dict


search_string = """> Irrelevant data
> Irrelevant data
> Type:     YUK
> Status:   OPEN
> Date:     6/22/2015
> Description: ----
>
> Description blah blah blah
> Thank you
"""
info =  get_info(search_string)

print info
print info["Type"]
print info["Status"]
print info["Date"]
print info["description"]

输出:

{'Status': 'OPEN', 'Date': '6/22/2015', 'Type': 'YUK', 'description': ' ----\n>\n> Description blah blah blah\n> \n'}
YUK
OPEN
6/22/2015
 ----
>
> Description blah blah blah
> 

答案 3 :(得分:1)

我认为cvs模块不是这里使用的模块。如果您只是进行简单搜索,请使用字符串比较并按特征字符拆分它们。如果它更复杂,那就选择正则表达式。

import os

with open("email.txt") as file:
    data = [line.replace("> ","") for line in file.readlines()]
    for line in data:
        s = line.split(":")
        if len(s) > 1:
            print s[1].strip()