如何在python中的换行符处拆分字符串?

时间:2014-01-18 13:56:20

标签: python arrays list clipboard pywin32

我想将Excel中的一些表格数据复制到python数组中。也就是说,用户将在Excel表格中选择一个范围,按“复制”(CTRL + C),以便将范围复制到剪贴板。然后我将把这个剪贴板数据放到python数组(列表)中。我使用win32clipboard from pywin32将剪贴板数据转换为数组:

import win32clipboard

def getClip():
    win32clipboard.OpenClipboard()
    data = win32clipboard.GetClipboardData()
    win32clipboard.CloseClipboard()
    return data

我从Excel复制以下范围A1:B5

enter image description here

当我使用上面的函数时,我得到一个字符串,如:

'365\t179\r\n96\t-90\r\n48\t-138\r\n12\t-174\r\n30\t-156\r\n'

如何将此字符串拆分为列表,以便列表如下所示:

[(365,179), (96, -90), (48, -138), (12, -174), (30, -156)]

我使用split方法,但它没有给我我想要的东西。

data.split("\n")

['365\t179\r', '96\t-90\r', '48\t-138\r', '12\t-174\r', '30\t-156\r', '']

5 个答案:

答案 0 :(得分:6)

>>> s = '365\t179\r\n96\t-90\r\n48\t-138\r\n12\t-174\r\n30\t-156\r\n'
>>> [map(int, x.split('\t')) for x in s.rstrip().split('\r\n')]
[[365, 179], [96, -90], [48, -138], [12, -174], [30, -156]]

使用我的other answer中的代码,您也可以处理其他类型:

from ast import literal_eval
def solve(x):
    try:
        return literal_eval(x)
    except (ValueError, SyntaxError):
        return x

s = '365\tFoo\r\nBar\t-90.01\r\n48\tspam\r\n12e10\t-174\r\n30\t-156\r\n'
print [map(solve, x.split('\t')) for x in s.rstrip().split('\r\n')]
#[[365, 'Foo'], ['Bar', -90.01], [48, 'spam'], [120000000000.0, -174], [30, -156]]

答案 1 :(得分:5)

实际上有一个str.splitlines方法,无论使用哪个换行符,都会按换行符拆分字符串。所以这适用于只有\n的Unix系统,在\r\n的Windows上,甚至在旧的Mac系统上,其中换行符只是\r

>>> s = '365\t179\r\n96\t-90\r\n48\t-138\r\n12\t-174\r\n30\t-156\r\n'
>>> s.splitlines()
['365\t179', '96\t-90', '48\t-138', '12\t-174', '30\t-156']

获得此结果后,您可以按标签分割以获取单个单元格。所以你基本上必须在每个单元格上调用cell.split('\t')。最好使用列表解析:

>>> [row.split('\t') for row in s.splitlines()]
[['365', '179'], ['96', '-90'], ['48', '-138'], ['12', '-174'], ['30', '-156']]

作为替代方案,您还可以使用map对每个单元格应用拆分操作:

>>> list(map(lambda cell: cell.split('\t'), s.splitlines()))
[['365', '179'], ['96', '-90'], ['48', '-138'], ['12', '-174'], ['30', '-156']]

由于剪贴板中复制的数据始终具有由换行符分隔的行,并且列由制表符分隔,因此对于您复制的任何单元格范围,此解决方案也可以安全使用。

如果您还想在Python中将整数或浮点数转换为正确的数据类型,我猜您可以通过在所有仅包含数字的单元格上调用int()来添加更多转换逻辑,float()在所有包含数字及其中的点.的单元格上,将其余部分保留为字符串:

>>> def convert (cell):
        try:
            return int(cell)
        except ValueError:
            try:
                return float(cell)
            except ValueError:
                return cell
>>> [tuple(map(convert, row.split('\t'))) for row in s.splitlines()]
[(365, 179), (96, -90), (48, -138), (12, -174), (30, -156)]

对于不同的字符串:

>>> s = 'Foo\tbar\r\n123.45\t42\r\n-85\t3.14'
>>> [tuple(map(convert, row.split('\t'))) for row in s.splitlines()]
[('Foo', 'bar'), (123.45, 42), (-85, 3.14)]

答案 2 :(得分:2)

d = '365\t179\r\n96\t-90\r\n48\t-138\r\n12\t-174\r\n30\t-156\r\n'
print [tuple(map(int,item.split(","))) for item in d.replace("\t", ",").split()]

<强>输出

[(365, 179), (96, -90), (48, -138), (12, -174), (30, -156)]

答案 3 :(得分:1)

In [85]: zip(*[iter(map(int, data.split()))]*2)
Out[85]: [(365, 179), (96, -90), (48, -138), (12, -174), (30, -156)]

以下是其工作原理的细分:

首先,拆分空格:

In [86]: data.split()
Out[86]: ['365', '179', '96', '-90', '48', '-138', '12', '-174', '30', '-156']

将字符串转换为整数:

In [87]: map(int, data.split())
Out[87]: [365, 179, 96, -90, 48, -138, 12, -174, 30, -156]

使用grouper recipe对每两项进行分组:

In [88]: zip(*[iter(map(int, data.split()))]*2)
Out[88]: [(365, 179), (96, -90), (48, -138), (12, -174), (30, -156)]

答案 4 :(得分:0)

[line.split() for line in my_str.split("\n")]

这只是将数据分成几行,然后根据空格分割它。检查出来并根据您的数据进行修改。