我想将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
:
当我使用上面的函数时,我得到一个字符串,如:
'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', '']
答案 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")]
这只是将数据分成几行,然后根据空格分割它。检查出来并根据您的数据进行修改。