Skip to main content

文件读写

文件读写中,我们使用 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)

创建文件

使用 wa 模式打开文件时,如果文件不存在会自动创建

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)

追加写入

from ascript.android.system import R

# a 模式: 在文件末尾追加, 不清空原内容
with open(R.sd("1.txt"), "a") as f:
f.write("追加的内容\n")

写入 JSON 文件

import json
from ascript.android.system import R

data = {"name": "AScript", "version": "3.3"}

with open(R.sd("config.json"), "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)

写入二进制文件

from ascript.android.system import R

with open(R.sd("output.bin"), "wb") as f:
f.write(b'\x00\x01\x02\x03')

复制与移动

复制文件

import shutil
from ascript.android.system import R

shutil.copy(R.sd("a.txt"), R.sd("b.txt"))

复制整个目录

import shutil
from ascript.android.system import R

shutil.copytree(R.sd("folder_a"), R.sd("folder_b"))

移动/重命名文件

import shutil
from ascript.android.system import R

# 移动文件
shutil.move(R.sd("a.txt"), R.sd("folder/a.txt"))

# 重命名文件
shutil.move(R.sd("a.txt"), R.sd("b.txt"))
# 也可以用 os.rename
import os
from ascript.android.system import R

os.rename(R.sd("a.txt"), R.sd("b.txt"))

路径拼接

import os

# 推荐使用 os.path.join 拼接路径, 自动处理分隔符
path = os.path.join("/sdcard", "folder", "a.txt")
print(path) # /sdcard/folder/a.txt

CSV 文件操作

读取 CSV

import csv
from ascript.android.system import R

with open(R.sd("data.csv"), "r", encoding="utf-8") as f:
reader = csv.reader(f)
for row in reader:
print(row) # 每行是一个列表

写入 CSV

import csv
from ascript.android.system import R

with open(R.sd("data.csv"), "w", encoding="utf-8", newline='') as f:
writer = csv.writer(f)
writer.writerow(["姓名", "年龄", "城市"])
writer.writerow(["张三", 25, "北京"])
writer.writerow(["李四", 30, "上海"])