Python 将列读入单独的列表
我有一个包含10多行和3列的文本文件,如: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,....] 我可以
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模块(我的重点是如何根据您的示例提取解析数据并分离特定列)。