读取列作为列表

时间:2013-03-23 08:59:56

标签: python delimited-text tab-delimited tab-delimited-text

我在表单中的txt文件中有数据。制表符分隔的数据

here
     a b c
     e f g
tere
     x y z
     w t y

我需要将列读入列表。像

col1 = ['here', '', '', tere, '', '']
col2= ['', 'a', 'e', '', 'x'.'w']

等等。

我用过

import re

infile = open('text.txt', 'r')
i=0
a0='';a1='';a2='';a3='';a4='';a5='';a6='';a7='';
for line in infile:
    [a1[i],a2[i],a3[i],a4[i],a5[i],a6[i],a7[i],a8[i]] = line.split('\t')
    i+=1

它说'str'对象不支持项目分配。

任何提示?

5 个答案:

答案 0 :(得分:6)

如果您希望分配给每列变量的所有数据,请从列表开始:

per_row = []
for line in infile:
    per_row.append(line.strip().split('\t'))

然后才将其转换为列表:

per_column = zip(*per_row)

这是一个列表清单; per_column[0]是第一列数据。

您确实希望使用csv module来阅读表格数据。

遗憾的是,您的代码与Python的工作距离不够近。您为空字符串分配了几个变量,然后尝试将它们用作列表。

答案 1 :(得分:2)

对@Martijn Pieters的更正回答

应该是这样的

per_row = []
for line in infile:
    per_row.append(line.split('\t'))

然后才将其转换为列列表:

per_column = zip(*per_row)

这是一个列表清单; per_column[0]是第一列数据。

这给出了我想要的结果。 strip()也会移除空白单元格。

答案 2 :(得分:0)

在这里,

a0='';a1='';a2='';a3='';a4='';a5='';a6='';a7='';

一旦将变量声明为空字符串,就不能单独更改字符串(逐个字符),因为它们是不可变的字符串。

[a1[i],a2[i],a3[i],a4[i],a5[i],a6[i],a7[i],a8[i]] = line.split('\t')

因此,您可以使用字符串列表而不是字符串。

答案 3 :(得分:0)

csv模块通常也是处理制表符分隔文件的最佳方式:

from __future__ import print_function

import csv

MAXCOLS = 4
cols = [[] for _ in xrange(MAXCOLS)]
with open('text.txt', 'rb') as input:
    for row in csv.reader(input, delimiter='\t'):
        for i in xrange(MAXCOLS):
            cols[i].append(row[i] if i < len(row) else '')

for i in xrange(MAXCOLS):
    print('cols[{}]: {}'.format(i, cols[i]))

输出:

cols[0]: ['here', '', '', 'tere', '', '']
cols[1]: ['', 'a', 'e', '', 'x', 'w']
cols[2]: ['', 'b', 'f', '', 'y', 't']
cols[3]: ['', 'c', 'g', '', 'z', 'y']

答案 4 :(得分:0)

import csv

## open file
infile = open('col2Rows.txt', 'r')

## define csv reader object, assuming delimiter is tab
tsvfile = csv.reader(infile, delimiter='\t')

lines = []

## iterate through lines in file
for line in tsvfile:
    lines.append(line)

print "Col1",[line[0] for line in lines]

就像Martijn Pieters所说,csv模块非常方便。只要确保你的内存不足(即输入文件不应该太大。)