从两个制表符分隔的文件创建单个字典

时间:2014-06-30 15:53:27

标签: python python-2.7 csv dictionary

我对Python有点新鲜,并且仍然在努力学习它的所有技巧和开发。 我正在寻找是否可以从两个单独的文件中收集列数据来创建单个字典,而不是两个不同的字典。我之前用于导入文件的代码如下所示:

import csv
from collections import defaultdict

columns = defaultdict(list)
with open("myfile.txt") as f:
    reader = csv.DictReader(f,delimiter='\t')   
    for row in reader:
        for (header,variable) in row.items():
            columns[header].append(variable)           
f.close()

此代码使文件第一行的每个元素成为其下方数据列的标题。我现在要做的是导入一个文件,该文件只包含一行我将用作我的标题,并导入另一个仅包含我将与标题匹配的数据的文件。到目前为止我所尝试的内容类似于:

columns = defaultdict(list)
with open("headerData.txt") as g:
    reader1 = csv.DictReader(g,delimiter='\t')
    for row in reader1:
        for (h,v) in row.items():
            columns[h].append(v)

    with open("variableData.txt") as f:
        reader = csv.DictReader(f,delimiter='\t')   
        for row in reader:
            for (h,v) in row.items():
                columns[h].append(v)

将open语句嵌套到正确的方法来尝试这个吗?老实说,我完全迷失了该怎么做。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

如果标题不在文件中,您就不能使用DictReader。但您可以使用itertools.chain

创建一个伪文件对象,该文件对象将生成标题,然后生成数据
from itertools import chain
with open('headerData.txt') as h, open('variableData.txt') as data:
    f = chain(h, data)
    reader = csv.DictReader(f,delimiter='\t')
    # proceed with you code from the first snippet

# no close() calls needed when using open() with "with" statements

另一种方法当然是将标题读入列表并在csv.reader上使用常规variableData.txt

with open('headerData') as h:
    names = next(h).split('\t')
with open('variableData.txt') as f:
    reader = csv.reader(f, delimiter='\t')
    for row in reader:
        for name, value in zip(names, row):
            columns[name].append(value)

答案 1 :(得分:2)

默认情况下,DictReader将占用csv文件的第一行,并将其用作dict的键。但是,根据the docs,您还可以向其传递fieldnames参数,该参数是包含要用于dict的键名称的序列。所以你可以这样做:

columns = defaultdict(list)
with open("headerData.txt") as f, open("variableData.txt") as data:
    reader = csv.DictReader(data, 
                            fieldnames=f.read().rstrip().split('\t'), 
                            delimiter='\t')   
    for row in reader:
        for (h,v) in row.items():
            columns[h].append(v)