-2

我有一个文本文件,其中只有一列。我需要的是将唯一的列拆分为几列。例如,假设我的文件包括:

10

20

30

40

50

e

1467

1608

1733

1767

1878年

e

1787

1353

1024

693

423

我需要它变成如下:

10 1467 1787

20 1608 1353

30 1733 1024

40 1767 693

50 1878 423

只是想知道您是否帮助我使用 Python 脚本来完成。另外,如果我可以通过在 OS X 终端中编写一些命令来做到这一点,请告诉我。

4

3 回答 3

1

这是一个使用列表推导和 itertools 模块可以做什么的示例。

>>> from itertools import dropwhile, izip, takewhile
>>> l = ['1', '2', 'X', '3', '4', 'X', '5', '6']
>>> splitter = 'X'
>>> fun = lambda e: e != 'X'
>>> begin = [e for e in takewhile(fun, l)]
>>> end = [e for e in dropwhile(fun, l)][1:]
>>> begin, end
(['1', '2'], ['3', '4', 'X', '5', '6'])
>>> # OUT: (['1', '2'], ['3', '4', 'X', '5', '6'])
>>> mid = [e for e in takewhile(fun, end)]
>>> end = [e for e in dropwhile(fun, end)][1:]
>>> begin, mid, end
(['1', '2'], ['3', '4'], ['5', '6'])
>>> # OUT: (['1', '2'], ['3', '4'], ['5', '6'])
>>> [e for e in izip(begin, mid, end)]
[('1', '3', '5'), ('2', '4', '6')]
>>> # OUT: [('1', '3', '5'), ('2', '4', '6')]

当然,如果原始列表是可变长度的,则需要在循环中完成这项工作。

我建议您在BPython 解释器中测试这种语句,以便您可以轻松地测试交互式示例。

于 2012-08-07T09:26:36.523 回答
0

注意:已修​​改以反映更改的数据格式

基于您的(新)样本数据,使用“e”作为组分隔符。基本思想是遍历文件分组中的行,并在看到分隔符时开始一个新组。

# testdata contains:
10
20
30
40
50
e
1467
1608
1733
1767
1878
e
1787
1353
1024
693
423

_

DELIMITER = 'e'
groups = []
this_group = []
for l in open('testdata', 'r'):
    l = l.strip()
    if l == DELIMITER and this_group:
        groups.append(this_group)
        this_group = []
    else:
        this_group.append(l)
if this_group:
    groups.append(this_group)

for t in zip(*groups):
    print ' '.join(t)

10 1467 1787
20 1608 1353
30 1733 1024
40 1767 693
50 1878 423
于 2012-08-07T09:26:48.397 回答
0

您可以使用以下方法将整个文件的内容拆分为列表:

def read_data(filename):
    with open(filename) as f:
        return f.read().split()

data = read_data('test.txt')使用text.txt包含以下内容的运行:

10
20
30
e
11
21
31
e
12
22
32

将导致:

data = ['10', '20', '30', 'e', '11', '21', '31', 'e', '12', '22', '32']

注意:test.txt可以以任何方式格式化空格、制表符和换行符,以split()正确处理它们!

数据实际上应该位于不包含“e”条目的二维数组中。这可以使用以下方法完成:

def list_to_grid(data):
    ret  = []
    line = []
    for entry in data:
        if entry == 'e':
            if len(line) != 0:
                ret.append(line)
                line = []
            else:
                line.append(int(entry))
    if len(line) != 0:
        ret.append(line)
    return ret

注意:我确信有一种更 Pythonic 的方法可以做到这一点,但它确实有效。

data = list_to_grid(read_data('test.txt'))在文件上运行text.txt将导致:

data = [[10, 20, 30], [11, 21, 31], [12, 22, 32]]

你正在做的是转置二维数组。也就是说,给定data[i][j],它有新的位置data[j][i]。现在可以转置这些数据以获得所需的序列:

def transpose(data):
    ret = []
    for i in range(0, len(data)):
        ret.append([data[j][i] for j in range(0, len(data[i]))])
    return ret

哪个tdata = transpose(data)给出:

 data = [[10, 20, 30], [11, 21, 31], [12, 22, 32]]
tdata = [[10, 11, 12], [20, 21, 22], [30, 31, 32]]

现在打印出来:

def print_data(data):
    for line in data:
        print ' '.join([str(x) for x in line])

使用print_data(tdata)结果:

10 11 12
20 21 22
30 31 32

这就是你想要的。

于 2012-08-07T10:07:29.577 回答