DictReader,无遮拦,制表符文件

22 投票
3 回答
51407 浏览
提问于 2025-04-16 14:01

我有一个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 个回答

1

从评论中我了解到,你是通过 urllib2 来获取数据的。response 是一个像文件一样的对象;你可以直接把它传给 csv.DictReader 来处理:

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

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


>>> 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'}
45

你的 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

这个方法对我有效。

撰写回答