使用场景:


python openpyxl粘贴为数值 python粘贴板_单引号


复制粘贴在我们的日常工作中使用率极高,

~毕竟我们都是面向ctrl+c和ctrl+v编程~

比如说用SQL导数据,


某天同事扔给你一份疑似开挂的用户id,让你查一下他们的充值金额


python openpyxl粘贴为数值 python粘贴板_快捷键_02


这对你当然不是个难事,基本的SQL就可以搞定,


1select user_id,pay_amount from some_table
2where user_id in ()

因为要经常调用,你甚至都保存好了模板

但是在数据库里用户id是字符类型,而你Excel复制出来的话是整数形式



python openpyxl粘贴为数值 python粘贴板_vb net excel 剪贴板 粘贴_03

我们怎么才能快捷地批量添加单引号和逗号?这就是本文的主题了
1. 利用Sublime Text 3的快捷键

python openpyxl粘贴为数值 python粘贴板_快捷键_04

文字版:


Ctrl+a 全选 --> Ctrl+Shift+L 多行编辑 --> 单引号 --> End 跳转到每行的末尾 --> 逗号 --> Ctrl+End
跳转到整个文本的最后 --> 退格键 删掉最后一个逗号

这种方法将用户id从Excel复制到Sublime,然后通过快捷键完成操作,看起来有点繁琐,但是熟练快捷键后整个操作很快就能完成。

不过这种方法有个弊端,就是受限于Sublime的性能,当数据到了1万以上,快捷键批量处理就会很卡

所以当数据量比较大的时候,我们采取第二种方法

2. 利用Excel公式



python openpyxl粘贴为数值 python粘贴板_快捷键_05


如图所示,A列为用户id,在B1单元格,我们输入

两个英文的单引号;(因为在Excel里,单元格开头的单引号是

文本的象征,所以如果我们只输入一个单引号,这意味着这个单元格是个空字符串)在C1单元格,我们输入一个

逗号;接着我们就可以利用“

&”来拼接字符串了


python openpyxl粘贴为数值 python粘贴板_快捷键_06


公式如下(注意B1和C1要绝对引用)


1=$B$1&A1&$B$1&$C$1

写好公式后,直接往下拖拽就好了

这种方法相比Sublime的快捷键,会麻烦一点,但是有两个优势

  1. 大部分人都没有安装Sublime,但几乎每台电脑都装有Excel或WPS
  2. 当行数上万的时候,Sublime的多行模式就会很卡了,而对Excel来说,10万行秒出结果
但是当id数量达到100万的时候,Excel的公式拖拽也变得很慢了,实测100万行要55秒才完成

于是有了方法3

3. 用Python实现

首先我们要介绍一个操作剪贴板的模块——pyperclip

安装:pip instasll pyperclip

这个模块有两个函数:

  • copy(), 向剪贴板发送文本
  • paste(), 从剪贴板接收文本

用法示例:



python openpyxl粘贴为数值 python粘贴板_快捷键_07


首先用copy函数来发送文本到剪贴板(即复制内容),然后把从剪贴板接收的内容(即粘贴内容),打印出来


这时候你用ctrl+v粘贴,出来的文本也是“Python从放弃到真香”


如果你不用copy方法,直接用paste的话,会打印出你剪贴板的文本,也就是你上一次复制的内容。



python openpyxl粘贴为数值 python粘贴板_vb net excel 剪贴板 粘贴_08

总结一下,pyperclip的用法就是和剪贴板相关联(仅限文本),copy了什么内容,就会原封不动的paste什么内容。

当然到目前为止,我们这个用Python实现的复制粘贴并没有能够优化系统剪贴板的功能,甚至还不如后者(因为只能复制文本),不着急,我们继续完善代码。

引入pyperclip这个模块,主要是为了和剪贴板相通,也就是实现复制-粘贴,我们还要在中间加一个编辑文本的功能,
即复制-编辑-粘贴,这个编辑功能我们利用Python的字符串操作完成

先举个例子:
比如说我要把复制的文本全部倒过来粘贴,怎么实现呢?

1import pyperclip
2
3s = pyperclip.paste()
4s_ = s[::-1]
5pyperclip.copy(s_)

效果图:



python openpyxl粘贴为数值 python粘贴板_vb net excel 剪贴板 粘贴_09

下面进入正题,如何将Excel上面的id批量加上单引号和逗号

首先,复制Excel上的5个id,粘贴出来研究



python openpyxl粘贴为数值 python粘贴板_vb net excel 剪贴板 粘贴_10


发现每个id后面都有个空行,且末尾空了两行


利用内置函数repr()查看它的真实面目


python openpyxl粘贴为数值 python粘贴板_单引号_11

原来每个id后面都有个\r\n,这时我们选择用\r\n作为分隔符


python openpyxl粘贴为数值 python粘贴板_单引号_12

由于最后有一个空值,我们把空值去掉(其实不去空值,也不影响后面操作)

1import pyperclip 
 2
 3s = pyperclip.paste()
 4s_ = s.split('\r\n')
 5
 6list_ = []
 7for i in s_:
 8    if i:
 9        list_.append(i)
10print(list_)

如果用列表推导式的话,看起来会简练很多

1import pyperclip 
2
3s = pyperclip.paste()
4list_ = [i for i in s.split('\r\n') if i]
5print(list_)

每个id的两端都加上单引号,末尾加逗号,注意单引号要转义



python openpyxl粘贴为数值 python粘贴板_单引号_13

用换行符(\n)连接每个id,转换为字符串



python openpyxl粘贴为数值 python粘贴板_单引号_14

用切片删掉最末尾的一个引号

1  s_ = '\n'.join(list_)[:-1]

最后,把处理后的字符串发送给剪贴板

1import pyperclip 
2
3s = pyperclip.paste()
4list_ = ['\'' + i + '\''+',' for i in s.split('\r\n') if i]
5s_ = '\n'.join(list_)[:-1]
6pyperclip.copy(s_)

测试一下:

python openpyxl粘贴为数值 python粘贴板_单引号_15

大功告成!

实测100w个id:

python openpyxl粘贴为数值 python粘贴板_快捷键_16

一秒内完成!

虽然我们通过剪贴板加上字符处理,实现的功能很强大,但是使用起来还是有些繁琐复制——打开py文件——运行——粘贴

如果能把中间的两步合成一步,那么用户体验无疑会提升很多、

我想到的方法是编写一个bat,然后用快捷键调用(抛砖引玉)

具体步骤:
在py文件的同一个目录下建立一个txt,写入 python 自动加单引号和逗号.py



python openpyxl粘贴为数值 python粘贴板_剪贴板_17


然后把后缀改成bat

python openpyxl粘贴为数值 python粘贴板_剪贴板_18


发送bat的快捷方式到桌面

python openpyxl粘贴为数值 python粘贴板_vb net excel 剪贴板 粘贴_19


右键属性,设置快捷键

python openpyxl粘贴为数值 python粘贴板_vb net excel 剪贴板 粘贴_20

好了,最终,整个流程变为:复制——快捷键——粘贴