Python 将列读入单独的列表

Python 将列读入单独的列表,python,list,python-2.7,Python,List,Python 2.7,我有一个包含10多行和3列的文本文件,如: Classification Type A B Commercial Homes 12 15 Residential Homes 10 14 ................ .. .. 我想分别阅读每一列,如下所示: Classification = ['Commercial Homes', 'Residential Homes'.......] A = [12,10,....] B = [15,14,....] 我可以

我有一个包含10多行和3列的文本文件,如:

Classification Type  A  B
Commercial Homes     12 15
Residential Homes    10 14
................     .. ..
我想分别阅读每一列,如下所示:

Classification = ['Commercial Homes', 'Residential Homes'.......]
A = [12,10,....]
B = [15,14,....]

我可以使用
split()
将它们读入单独的列表,但分类名称有多个单词,我必须在列表中捕获全名,而不是第一个单词。任何建议都将不胜感激

类似的方法可能会奏效:

#!/usr/bin/python
with open('./mydata', 'r') as raw_data:
    data = [line.strip().split() for line in raw_data.readlines()]
header = data.pop(0) ## Pop off header, removed from list
a = [record[1] for record in data]
b = [record[2] for record in data]
显然,我们将遍历该列表两次,一次遍历
a
,另一次遍历
b
。对于小数据集,这不会带来任何性能问题

或者,我们可以这样做:

#!/usr/bin/python
a = list()
b = list()
with open('./mydata', 'r') as raw_data:
    for line in raw_data:
        if line.startswith('Classification'):
            continue # skip the header line
        line = line.strip().split()
        a.append(line[1])
        b.append(line[2])

这有点冗长。但它只需通过一次数据就可以完成这项工作。

类似的方法可能会奏效:

#!/usr/bin/python
with open('./mydata', 'r') as raw_data:
    data = [line.strip().split() for line in raw_data.readlines()]
header = data.pop(0) ## Pop off header, removed from list
a = [record[1] for record in data]
b = [record[2] for record in data]
显然,我们将遍历该列表两次,一次遍历
a
,另一次遍历
b
。对于小数据集,这不会带来任何性能问题

或者,我们可以这样做:

#!/usr/bin/python
a = list()
b = list()
with open('./mydata', 'r') as raw_data:
    for line in raw_data:
        if line.startswith('Classification'):
            continue # skip the header line
        line = line.strip().split()
        a.append(line[1])
        b.append(line[2])
这有点冗长。但它只需一次通过数据即可完成工作。

只需使用
zip()
转换csv阅读器对象表示的矩阵即可:

import csv

with open(fn) as f:
    reader=csv.reader(f, delimiter='\t')
    a, b, c = zip(*reader)

    print a
    ('Classification Type', 'Commercial Homes', 'Residential Homes')
    print b
    ('A', '12', '10')
    print c
    ('B', '15', '14')
    # trim the tuples as you wish, such as b=list(b[1:])...
然后,您可能需要具有该元组第一个值的dict:

data={}
for t in zip(*reader):
    data[t[0]]=t[1:]

print data    
# {'A': ('12', '10'), 'B': ('15', '14'), 'Classification Type': ('Commercial Homes', 'Residential Homes')}
然后可以简化为一条语句:

data={t[0]:t[1:] for t in zip(*reader)}
# {'A': ('12', '10'), 'B': ('15', '14'), 'Classification Type': ('Commercial Homes', 'Residential Homes')}
只需使用
zip()
转换csv阅读器对象表示的矩阵:

import csv

with open(fn) as f:
    reader=csv.reader(f, delimiter='\t')
    a, b, c = zip(*reader)

    print a
    ('Classification Type', 'Commercial Homes', 'Residential Homes')
    print b
    ('A', '12', '10')
    print c
    ('B', '15', '14')
    # trim the tuples as you wish, such as b=list(b[1:])...
然后,您可能需要具有该元组第一个值的dict:

data={}
for t in zip(*reader):
    data[t[0]]=t[1:]

print data    
# {'A': ('12', '10'), 'B': ('15', '14'), 'Classification Type': ('Commercial Homes', 'Residential Homes')}
然后可以简化为一条语句:

data={t[0]:t[1:] for t in zip(*reader)}
# {'A': ('12', '10'), 'B': ('15', '14'), 'Classification Type': ('Commercial Homes', 'Residential Homes')}

使用csv库执行此任务

import csv

def main():
    with open(r'CSVReaderData.txt', 'r') as f:
        reader = csv.reader(f, delimiter='\t')
        col1, col2, col3 = zip(*reader)

    print 'Classification = ',list(col1)
    print 'A = ',list(col2)
    print 'B = ',list(col3)

if __name__ == '__main__':
    main()

使用csv库执行此任务

import csv

def main():
    with open(r'CSVReaderData.txt', 'r') as f:
        reader = csv.reader(f, delimiter='\t')
        col1, col2, col3 = zip(*reader)

    print 'Classification = ',list(col1)
    print 'A = ',list(col2)
    print 'B = ',list(col3)

if __name__ == '__main__':
    main()

这些列用什么分隔?制表符、空格、逗号?这些列用什么分隔?制表符、空格、逗号?我使用制表符分隔列。那就行了。啊!我没有注意到你对数据行的主要评论中包含空格。默认情况下,Python.split()字符串方法在任何空白序列上进行拆分。您可以提供参数来拆分其他字符(但是,在这种情况下,只有单个字符,要拆分正则表达式,您可以使用re模块中的方法)。正如其他人所说,要从CSV(逗号分隔值)或类似格式的源解析数据,请使用CSV模块。(我的重点是如何根据您的示例提取已解析的数据并分离特定列。我使用tab delimited来分离列。这样就可以了。啊!我没有注意到您在数据行上的主要注释包含空格。Python.split()默认情况下,字符串方法在任何空白序列上拆分。您可以提供参数在其他字符上拆分(但是,在这种情况下,只有单个字符,要在正则表达式上拆分,您将使用re模块中的方法)。正如其他人所说,要从CSV解析数据(逗号分隔值)或者类似格式的源代码使用csv模块(我的重点是如何根据您的示例提取解析数据并分离特定列)。