文件读写
文件读写中,我们使用 Python 内置函数 open 操作文件
# open 语法如下
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
文件打开模式
| 模式 | 说明 |
|---|---|
r | 只读(默认), 文件必须存在 |
w | 只写, 文件不存在则创建, 存在则清空 |
a | 追加写入, 文件不存在则创建 |
r+ | 读写, 文件必须存在 |
w+ | 读写, 文件不存在则创建, 存在则清空 |
a+ | 读写追加, 文件不存在则创建 |
rb | 二进制只读 |
wb | 二进制只写 |
推荐使用 with 语句
使用 with 语句打开文件,可以自动关闭文件,避免忘记调用 close():
from ascript.android.system import R
with open(R.sd("a.txt"), "r") as f:
content = f.read()
# 离开 with 块后文件自动关闭
路径
Android 是基于 Linux,因此文件系统和 Linux 雷同.
在 Android 中如果您的手机没有 Root,那我们仅有权限自如的操作 "/sd" 卡路径下的文件.
友好的路径写法
获取SD卡中文件路径 我们可以借助 R 环境模块.
from ascript.android.system import R
# 获取SD卡根目录下的1.png 的完整路径
path = R.sd("1.png")
print(path)
from ascript.android.system import R
# 获取SD卡根目录下的airscript文件夹下的 a.txt
path = R.sd("/airscript/a.txt")
print(path)
创建文件
使用 w 或 a 模式打开文件时,如果文件不存在会自动创建
from ascript.android.system import R
file = open(R.sd("a.txt"), mode='w')
# w、w+、a+、a模式都能创建新文件
file.close()
# 推荐写法: 使用 with 自动关闭
from ascript.android.system import R
with open(R.sd("a.txt"), "w") as f:
f.write("Hello")
创建文件夹
创建单层目 录
import os
from ascript.android.system import R
path = R.sd("aaa") # 在sd卡创建一个 aaa文件夹
os.mkdir(path)
递归创建多层目录
import os
from ascript.android.system import R
# 一次性创建多层目录, 父目录不存在也会自动创建
os.makedirs(R.sd("a/b/c"), exist_ok=True)
exist_ok=True 表示如果目录已存在不会报错.
删除 文件
删除单个文件
import os
from ascript.android.system import R
os.remove(R.sd("1.txt"))
删除空文件夹
import os
from ascript.android.system import R
os.rmdir(R.sd("b"))
递归删除文件夹(含内容)
import shutil
from ascript.android.system import R
# 删除整个目录及其所有内容
shutil.rmtree(R.sd("b"))
注意
shutil.rmtree 会删除目录下的所有文件和子目录,请谨慎使用.
判断文件/目录
判断文件是否存在
import os
from ascript.android.system import R
if os.path.exists(R.sd("a.txt")):
print("文件存在")
else:
print("文件不存在")
判断是否为文件
import os
from ascript.android.system import R
if os.path.isfile(R.sd("a.txt")):
print("这是一个文件")
判断是否为目录
import os
from ascript.android.system import R
if os.path.isdir(R.sd("folder")):
print("这是一个目录")
获取文件信息
获取文件大小
import os
from ascript.android.system import R
size = os.path.getsize(R.sd("a.txt"))
print(f"文件大小: {size} 字节")
获取文件名和扩展名
import os
# 获取文件名
name = os.path.basename("/sdcard/folder/a.txt")
print(name) # a.txt
# 分离文件名和扩展名
name, ext = os.path.splitext("a.txt")
print(name) # a
print(ext) # .txt
获取文件所在目录
import os
dir_path = os.path.dirname("/sdcard/folder/a.txt")
print(dir_path) # /sdcard/folder
列出目录内容
列出所有文件和文件夹
import os
from ascript.android.system import R
files = os.listdir(R.sd())
for f in files:
print(f)
列出指定类型的文件
import glob
from ascript.android.system import R
# 列出SD卡下所有 .txt 文件
txt_files = glob.glob(R.sd("*.txt"))
for f in txt_files:
print(f)
# 递归搜索所有子目录下的 .png 文件
png_files = glob.glob(R.sd("**/*.png"), recursive=True)
for f in png_files:
print(f)
读文件
读取所有内容
from ascript.android.system import R
with open(R.sd("1.txt"), "r") as f:
content = f.read()
print(content)
读取一行
from ascript.android.system import R
with open(R.sd("1.txt"), "r") as f:
line = f.readline()
print(line)
读取所有行
from ascript.android.system import R
with open(R.sd("1.txt"), "r") as f:
for line in f.readlines():
print(line.strip()) # strip() 去除换行符
逐行读取(大文件推荐)
from ascript.android.system import R
# 不会一次性加载整个文件到内存, 适合大文件
with open(R.sd("1.txt"), "r") as f:
for line in f:
print(line.strip())
读取 JSON 文件
import json
from ascript.android.system import R
with open(R.sd("config.json"), "r", encoding="utf-8") as f:
data = json.load(f)
print(data)
读取二进制文件
from ascript.android.system import R
with open(R.sd("image.png"), "rb") as f:
data = f.read()
print(f"文件大小: {len(data)} 字节")
写文件
写入字符串
from ascript.android.system import R
# w 模式: 每次写入会清空原内容
with open(R.sd("1.txt"), "w") as f:
f.write("自在老师")
写入多行
from ascript.android.system import R
with open(R.sd("1.txt"), "w") as f:
lines = ["第一行\n", "第二行\n", "第三行\n"]
f.writelines(lines)