python文件复制命令_Python脚本葵花宝典之一键批量复制文件

问题

QA小张新接了一个测试任务,其中有一测试项需要使用有批量视频或图片的安卓设备,而且还需要使用不同的机型系统适配,如果使用传统的手工复制操作,成本很高,首先要找到系统相册,然后进行复制操作

相册中照片或视频较少,需在相册中多次进行全选复制操作

相册中照片或视频较少,如果从外部导入要确保外部有批量文件且了解要导入的路径

如涉及到适配,需要在每个设备都操作一次

问题分析

是否有一个方案能实现自动化复制文件的功能?

联想到adb shell cp命令支持文件复制,可以考虑将封装脚本自动化实现,另外在复制前,需要检查adb连接状态,复制后需要刷新图库,否则系统相册无法及时更新复制的文件

方案优势劣势

方案一 手工操作

直接操作,没有编写脚本耗时

重复操作比较耗时

方案二 自动化脚本

一次开发多次使用

需要下载并熟悉脚本

Python脚本实现

步骤一 检查adb连接状态

def check_adb_status(self):

print("第一步:检查adb连接状态")

command = 'adb devices'

adbfile = os.popen(command, "r")

result = adbfile.read()

adbfile.close()

# 对result处理,获取连接状态

formatresult = result.replace('\n', '').replace(' ', '')

if "device" not in formatresult:

print("adb连接失败,请重新连接\n")

sys.exit(1)

else:

print("adb连接成功\n")

self.get_lock_screen()

步骤二 实现拷贝的功能。传入两个参数file_path和copy_count,分别代表要复制的源文件路径和要复制的次数。

def run_copy_file(cls, file_path, copy_count):

ADB_PUSH = 'adb push %s /data/local/tmp/' % file_path

os.system(ADB_PUSH)

time.sleep(2)

filename = os.path.basename(file_path)

print('filename名称为' + filename)

now = datetime.datetime.now()

nowtime = now.strftime('%Y_%m_%d_%H_%M_%S')

count = 1

while count <= copy_count:

ADB_SHELL_CP = 'adb shell cp /data/local/tmp/%s /sdcard/DCIM/Camera/%s_%s_%s'\

% (filename, count, nowtime, filename)

print("第%s次复制" % count)

print("ADB_SHELL_CP*******" + ADB_SHELL_CP)

os.system(ADB_SHELL_CP)

time.sleep(2)

count = count + 1

#更新广播,刷新系统相册

print("复制完成,刷新相册")

os.system(ADB_SHLEL_BROADCAST)

注:为了便于识别拷贝的文件,文件名称由三部分组成,拷贝次数_当前时间_被拷贝文件名称,如29_2020_04_19_19_11_50_jiantou.gif脚本执行过程及结果

传入本地待复制文件路径和预期复制次数,以复制gif文件且复制次数为30次为例,如下

if __name__ == "__main__":

cpfile = CopyFile()

cpfile.check_adb_status()

copy_file_count = 30

# file_path = r"D:\技术\读书笔记\gaoxiaoxuexi.jpg"

copy_file_path = r"D:\技术\读书笔记\jiantou.gif"

# file_path = r'D:\技术\读书笔记\WeChat_20200409154818.mp4'

CopyFile.run_copy_file(copy_file_path, copy_file_count)

脚本执行结果,截图部分如下

第一步:检查adb连接状态

adb连接成功

第二步:开始检查设备锁屏状态

未锁屏可继续操作

441 KB/s (15827 bytes in 0.035s)

filename名称为jiantou.gif

第1次复制

ADB_SHELL_CP*******adb shell cp /data/local/tmp/jiantou.gif /sdcard/DCIM/Camera/1_2020_04_19_19_11_50_jiantou.gif

....

第29次复制

ADB_SHELL_CP*******adb shell cp /data/local/tmp/jiantou.gif /sdcard/DCIM/Camera/29_2020_04_19_19_11_50_jiantou.gif

第30次复制

ADB_SHELL_CP*******adb shell cp /data/local/tmp/jiantou.gif /sdcard/DCIM/Camera/30_2020_04_19_19_11_50_jiantou.gif

复制完成,刷新相册

Broadcasting: Intent { act=android.intent.action.MEDIA_SCANNER_SCAN_FILE dat=file:///sdcard/DCIM/Camera flg=0x400000 }

Broadcast completed: result=0

脚本执行完成后,在设备相机和设备文件下均展示复制成功的文件,如下图所示

脚本格式化检查

通过pylint检查代码是否需要进符合规范,如下检查结果7.45/10需要优化

pylint copyfile_nosh.py

************* Module 9.utils.copyfile_nosh

copyfile_nosh.py:1:0: C0114: Missing module docstring (missing-module-docstring)

copyfile_nosh.py:17:4: C0116: Missing function or method docstring (missing-function-docstring)

copyfile_nosh.py:32:4: C0116: Missing function or method docstring (missing-function-docstring)

copyfile_nosh.py:32:4: R0201: Method could be a function (no-self-use)

copyfile_nosh.py:45:4: C0116: Missing function or method docstring (missing-function-docstring)

copyfile_nosh.py:45:27: W0621: Redefining name 'file_path' from outer scope (line 71) (redefined-outer-name)

copyfile_nosh.py:45:38: W0621: Redefining name 'copy_count' from outer scope (line 69) (redefined-outer-name)

copyfile_nosh.py:46:8: C0103: Variable name "ADB_PUSH" doesn't conform to snake_case naming style (invalid-name)

copyfile_nosh.py:53:12: C0103: Variable name "ADB_SHELL_CP" doesn't conform to snake_case naming style (invalid-name)

copyfile_nosh.py:45:4: R0201: Method could be a function (no-self-use)

copyfile_nosh.py:67:4: C0103: Constant name "cpfile" doesn't conform to UPPER_CASE naming style (invalid-name)

copyfile_nosh.py:69:4: C0103: Constant name "copy_count" doesn't conform to UPPER_CASE naming style (invalid-name)

copyfile_nosh.py:71:4: C0103: Constant name "file_path" doesn't conform to UPPER_CASE naming style (invalid-name)

------------------------------------------------------------------

Your code has been rated at 7.45/10 (previous run: 6.20/10, +1.25)

按照提示修改后,执行结果如下,终于9分以上了,如果与git关联,并设置git-pylint配置limit=9.0 那么代码就可以提交成功啦

注:有些提示如要忽略,可使用-d ,如下

pylint copyfile_nosh.py -d C0103 -d C0116

************* Module 9.utils.copyfile_nosh

copyfile_nosh.py:1:0: C0114: Missing module docstring (missing-module-docstring)

------------------------------------------------------------------

Your code has been rated at 9.81/10 (previous run: 9.81/10, +0.00)

遇到的小坑

在文件复制后,系统相册仍未展示复制后的照片或视频,此时需要刷新图库,执行如下命令

方案一 执行如下命令即可

adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/DCIM/Camera

方案二 重启设备,如果方案一不生效

猜你喜欢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值