python怎么检索安卓手机12版本内存,图片,视频,等格式存储情况?并且清理.log,为什么我这段代码会出错?

#  怎么用python知道我手机的存储情况,并且检索.log,并且清理

# 导入库
import subprocess
import re

# 执行 adb shell
result = subprocess.check_output(['adb', 'shell', 'sdcard'], universal_newlines=True)

# 使用正则表达式检索.log
pattern = re.compile(r'.*\.log')
match = pattern.findall(result)

# 遍历并删除.log文件
for file in match:
    subprocess.run(['adb', 'shell', 'rm', f'/sdcard/{file}'])
    
# 执行 df 命令获取手机存储情况
result = subprocess.check_output(['adb', 'shell', 'df'], universal_newlines=True).splitlines()

# 解析命令输出
for line in result:
    if '/sdcard' in line:
        storage_info = line.split()
        total_storage = int(storage_info[1]) * 1024
        used_storage = int(storage_info[2]) * 1024
        available_storage = int(storage_info[3]) * 1024
        print(f"总容量:{total_storage},已用容量:{used_storage},可用容量:{available_storage}")

# 这将输出您的手机总容量、已用容量和可用容量,并删除所有以“.log”结尾的文件。请确保将路径和 adb 命令更改为匹配您的设备和系统。

img

参考GPT和自己的思路:

根据你提供的代码和问题,有几个问题需要注意和解决:

  1. 在执行 adb shell 命令时,你需要进入到 /sdcard 目录下,否则无法获取该目录下所有文件的信息。所以正确的命令应该是 result = subprocess.check_output(['adb', 'shell', 'cd', '/sdcard', ';', 'ls', '-R'], universal_newlines=True)

  2. 在使用正则表达式检索 .log 文件时,你的正则表达式应该是 pattern = re.compile(r'.*\.log'),因为 . 表示任何字符,而 * 表示匹配前面的字符零次或多次,所以需要用 \ 转义 .

  3. 删除文件时需要在文件名前加上路径 /sdcard/,所以应该是 subprocess.run(['adb', 'shell', 'rm', f'/sdcard/{file}'])

  4. 在解析命令输出时,你需要判断当前行是否以 /sdcard 开头而不是包含 /sdcard,因为 df 命令输出的格式不一定相同。所以应该使用 if line.startswith('/sdcard'):

  5. 在输出总容量、已用容量和可用容量时,你需要使用转义字符 \ 而不是 \_,所以应该是 print(f"总容量:{total_storage},已用容量:{used_storage},可用容量:{available_storage}")

尝试解决以上问题后,你的代码应该如下所示:

# 导入库
import subprocess
import re

# 执行 adb shell
result = subprocess.check_output(['adb', 'shell', 'cd', '/sdcard', ';', 'ls', '-R'], universal_newlines=True)

# 使用正则表达式检索.log
pattern = re.compile(r'.*\.log')
match = pattern.findall(result)

# 遍历并删除.log文件
for file in match:
    subprocess.run(['adb', 'shell', 'rm', f'/sdcard/{file}'])

# 执行 df 命令获取手机存储情况
result = subprocess.check_output(['adb', 'shell', 'df'], universal_newlines=True).splitlines()

# 解析命令输出
for line in result:
    if line.startswith('/sdcard'):
        storage_info = line.split()
        total_storage = int(storage_info[1]) * 1024
        used_storage = int(storage_info[2]) * 1024
        available_storage = int(storage_info[3]) * 1024
        print(f"总容量:{total_storage},已用容量:{used_storage},可用容量:{available_storage}")

# 这将输出您的手机总容量、已用容量和可用容量,并删除所有以“.log”结尾的文件。请确保将路径和 adb 命令更改为匹配您的设备和系统。

参考GPT和自己的思路:

首先,通过执行“adb shell”命令连接到手机,然后使用正则表达式检索“.log”文件并删除它们是正确的。但你需要在“adb shell”中使用正确的路径,因为你的代码中当前路径是“/sdcard”,而这在某些安卓版本中可能不是正确的路径。你可以尝试使用“/storage/emulated/0”路径来访问内部存储空间。

然后,执行“df”命令来获取存储情况是正确的。但是需要注意的是,你需要将提取到的值乘以1024,因为df命令输出的是以kb为单位的值。此外,你需要使用正确的索引来获取需要的存储量值。因为你的代码中,你可能会得到的行是以下这种形式:

/dev/block/mmcblk0p54 15990784 8489088 7531696 53% /mnt/expand/2ac9ab1b-3301-4913-bc6e-555b783c5866

其中第二列是总存储,第三列是已用存储,而第四列是可用存储。

代码可能会出错,因为使用斜杠时需要在字符串前面加上一个反斜杠转义字符,即“\”。“total_storage”和“used_storage”变量中的\_应该是“_”才对。但却可以通过以下方式避免这个问题:

print("总容量:%d,已用容量:%d,可用容量:%d\n" % (total_storage, used_storage, available_storage))

这样就不需要使用“\”转义匹配符“%”了。

这是提示文件没有找到,检查一下。