DictReader,没有引号,标签文件

时间:2011-03-19 08:09:29

标签: python csv

我有一个csv文件,如下所示: 请注意,没有引号,标签(\ t)是分隔符,标题和实际内容之间有一个空行。

Facility No     Testing No      Name    Age

252     2351    Jackrabbit, Jazz        15
345     257     Aardvark, Ethel 41

我想我已经尝试了几乎所有可能的想法和参数组合

f = open('/tmp/test', 'r')
csvFile = f.read()
reader = csv.DictReader(csvFile, delimiter='\t', quoting=csv.QUOTE_NONE)
print reader.fieldnames

打印的结果是:

['F']

如何将其解析为可以解析的数据库? 将它放入字典会很有帮助。

3 个答案:

答案 0 :(得分:26)

你的csvFile是什么?它是一个表示以“F”开头的文件名的字符串吗?

csv.DictReader需要一个打开的文件对象,而不是文件名。

尝试:

with open(csvFile, 'rb') as f:
    reader = csv.DictReader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
    print reader.fieldnames

修改

如果您的csvFile是包含整个数据的字符串,则必须将其转换为StringIO(因为csv只能访问类似文件的对象,而不能访问字符串)。

尝试:

from cStringIO import StringIO

# csvFile = 'Facility No\tTesting No\tName\tAge\n\n252\t2351\tJackrabbit, Jazz\t15\n345\t257\tAardvark, Ethel\t41\n'
reader = csv.DictReader(StringIO(csvFile), delimiter='\t', quoting=csv.QUOTE_NONE)
print reader.fieldnames

或者,如果您编辑的问题打开并读取文件:

with open('/tmp/test', 'rb') as f:
    reader = csv.DictReader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
    print reader.fieldnames

这适合我。

答案 1 :(得分:1)

这可能对你有用,至少作为一个开始:


>>> import csv
>>> input = open('/tmp/csvtemp.csv')
>>> csvin = csv.reader(input, delimiter='\t')
>>> data = [row for row in csvin]
>>> header = data.pop(0)
>>> data.pop(0)  # skip blank line
[]
>>> for row in data:
...  rowdict = dict(zip(header, row))
...  print rowdict
... 
{'Age': '15', 'Testing No': '2351', 'Name': 'Jackrabbit, Jazz', 'Facility No': '252'}
{'Age': '41', 'Testing No': '257', 'Name': 'Aardvark, Ethel', 'Facility No': '345'}

答案 2 :(得分:1)

From the comments我了解您通过urllib2获取了数据。 response是一个类似文件的对象;你可以将它直接传递给csv.DictReader

response = urllib2.urlopen(URL)
reader = csv.DictReader(response, dialect=csv.excel_tab)