# 怎么用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 命令更改为匹配您的设备和系统。
参考GPT和自己的思路:
根据你提供的代码和问题,有几个问题需要注意和解决:
在执行 adb shell
命令时,你需要进入到 /sdcard
目录下,否则无法获取该目录下所有文件的信息。所以正确的命令应该是 result = subprocess.check_output(['adb', 'shell', 'cd', '/sdcard', ';', 'ls', '-R'], universal_newlines=True)
。
在使用正则表达式检索 .log
文件时,你的正则表达式应该是 pattern = re.compile(r'.*\.log')
,因为 .
表示任何字符,而 *
表示匹配前面的字符零次或多次,所以需要用 \
转义 .
。
删除文件时需要在文件名前加上路径 /sdcard/
,所以应该是 subprocess.run(['adb', 'shell', 'rm', f'/sdcard/{file}'])
。
在解析命令输出时,你需要判断当前行是否以 /sdcard
开头而不是包含 /sdcard
,因为 df 命令输出的格式不一定相同。所以应该使用 if line.startswith('/sdcard'):
。
在输出总容量、已用容量和可用容量时,你需要使用转义字符 \
而不是 \_
,所以应该是 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))
这样就不需要使用“\”转义匹配符“%”了。
这是提示文件没有找到,检查一下。