2013-03-16 69 views
0

我有如下具有组织数据的CSV文件:Python的CSV刮

Name: xyz 
DNS: xyz 
Type: xyz 
Date: xyz 

Name: xyz 
DNS: xyz 
Type: xyz 
Date: xyz 

Name: xyz 
DNS: xyz 
Type: xyz 
Date: xyz 

这将继续为许多用户ñ。

我想弄清楚如何在Python中正确读取这些数据,这似乎不是一个难题,只是困惑于我如何读取信息,因为这不是通常的csv文件设置,它会更容易,如果它是名称,DNS等,那么我会知道如何正确处理。

我开始是这样的:)

import csv 
r = csv.reader(open("data.csv")) 

现在做r.next(会得到每一件事情一行行,但因为我的计划是,如果有日期,检查计数器,这不是有帮助大于特定时间,并且类型字段匹配特定值,像循环计数器那样在循环中添加一些变量。

这是一种接近我的数据是如何构成的意识正在做的,但我不认为这会帮助我在我的追求:

How can I scrape data from a text table using Python?

+6

呃,不会远程看起来像一个CSV文件... – 2013-03-16 21:32:39

+1

CSV表示逗号分隔值。在某些地区,分号或制表符也被接受。这些都不在你的例子中。 – liori 2013-03-16 21:41:57

回答

1

这不是一个csv文件。如果这是你的格式,你可以扫描文件,直到你到达一个空白的新行,表示一个部分。然后您可以相应地解析每个部分。

我不”想csv是不会来这里的任何帮助

你可以读取该文件,并通过行

f = open('data.csv') 
for line in f: 
    pass 
1

线遍历它你可以尝试通过设置来读取数据**fmtparams参数时调用csv.readerDialect.delimiter设置为\nDialect.lineterminator\n\n。 (或替换每个\n通过\r\n或只是\r,这取决于你的结束文件的格式就行了。)

然后你会得到Name: xyzDNS: xyz等为您的“CSV”文件的“列”的内容 - 和你只需要在冒号分割进行进一步处理......

1

正如其他人提到的,你不需要一个CSV阅读器(确保你可以使用它,但没有任何好处)。只需读取数据文件并为当前部分保留一些状态。在空白行存储当前部分并重置状态。

像这样的东西应该工作:

def load(input): 
    data = [] 
    current = {} 
    for line in input: 
     # may be useful to strip the line here and forget about 
     # leading/trailing whitespaces 
     if not line.strip(): 
      data.append(current) 
      current = {} 
     # use line.split(':') if `:' does not appear in values 
     colon = line.find(':') 
     if colon == -1: # unknown format, throw an exception or just ignore it 
      continue 
     key = line[:colon] 
     value = line[colon+2:-1] # or line[colon1].strip() to remove trailing whitespace 
     current[key] = value 
    return data 

import sys 

if __name__ == "__main__": 
    with(open(sys.argv[1])) as input: 
     print load(input)