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

alw*_*btc 4 python arrays clipboard list pywin32

我想将一些表格数据从Excel复制到python数组中.也就是说,用户将在Excel表格中选择一个范围,按"复制"(CTRL + C),以便将范围复制到剪贴板.然后我将把这个剪贴板数据放到python数组(列表)中.我用来win32clipboard from pywin32将剪贴板数据放入数组中:

import win32clipboard

def getClip():
    win32clipboard.OpenClipboard()
    data = win32clipboard.GetClipboardData()
    win32clipboard.CloseClipboard()
    return data
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

'365\t179\r\n96\t-90\r\n48\t-138\r\n12\t-174\r\n30\t-156\r\n'
Run Code Online (Sandbox Code Playgroud)

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

[(365,179), (96, -90), (48, -138), (12, -174), (30, -156)]
Run Code Online (Sandbox Code Playgroud)

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

data.split("\n")

['365\t179\r', '96\t-90\r', '48\t-138\r', '12\t-174\r', '30\t-156\r', '']
Run Code Online (Sandbox Code Playgroud)

Ash*_*ary 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]]
Run Code Online (Sandbox Code Playgroud)

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

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]]
Run Code Online (Sandbox Code Playgroud)


pok*_*oke 5

实际上有一种str.splitlines方法可以通过换行符分割字符串,无论使用哪个换行符.所以这适用于Unix系统上只有一个\n,在Windows上\r\n,甚至在旧的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']
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

如果你还想在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)]
Run Code Online (Sandbox Code Playgroud)

对于不同的字符串:

>>> 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)]
Run Code Online (Sandbox Code Playgroud)