Python似乎并没有读取磁盘方面的库, 但可以直接用内置打开文件的open()函数。
下篇:Python 数据恢复实战 - 恢复U盘中的chk文件,以及误删的文件
目录
基础知识
在"此电脑"的图标上右键, 点击"管理", 存储 -> 磁盘管理, 就可以对你电脑的磁盘数据结构一探究竟。
磁盘、分区、驱动器的区别
1. 磁盘是直接存储数据的设备,例如机械硬盘、固态硬盘、U盘等。
2, 分区是磁盘空间的划分,常常使用NTFS、FAT32等格式的文件系统,用于存储文件。
3, 驱动器是分配了驱动器号(盘符)的分区,拥有驱动器号如 C: ,注意并不是每个分区都有驱动器号。
Windows的路径 \\.\
类似于Linux的 /dev 目录,在 Windows 中,路径 \\.\
是一个特殊的路径前缀,用于表示对设备或文件系统对象的直接访问,但访问一部分设备需要管理员权限。以下是\\.\的几种用法:
-
访问硬盘等设备:
\\.\
可以用来直接访问系统设备,比如磁盘驱动器、卷、串口等。例如, 可以用\\.\PhysicalDrive0 来表示计算机上的第一个物理磁盘,\\.\Volume{GUID}表示特定GUID的硬盘分区。 -
访问管道:
\\.\
还可以访问命名管道和系统串口等设备。例如,\\.\COM1 表示一个系统的com1串口,\\.\pipe\mypipe 能访问 mypipe 这个命名管道。
在本文中,着重介绍路径\\.\读取硬盘的这一用法。
读取磁盘数据
disk = open(r"\\.\PhysicalDrive0","rb") # 打开磁盘0,PhysicalDrive不区分大小写
# 读取第一个扇区, 也就是磁盘主引导记录, 1扇区为512字节
print(disk.read(512))
读取结果如下:
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\xc3\xd2+\x00\x00\x00\x00\x02\x00\xee\xff\xff\xff\x01\x00\x00\x00\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00U\xaa'
前述读取的是0磁盘, 也就是第一个硬盘。需要读取其他硬盘, 只需将"Physicaldrive0"改成对应的数字即可。
注意: 一定要以管理员身份运行Python, 才有权限读写硬盘数据。(方法是: 在使用的Python IDE,如VSCode的图标上右键, 在菜单中选择"以管理员身份运行", 即可。期间若出现"允许某程序进行更改"的提示, 请选择"是"。)
写入磁盘数据
写入磁盘数据, 要使用读写模式( rb+ 模式) 打开磁盘。
disk=open(r'\\.\physicaldrive2','rb+')
disk.seek(512) # 偏移量, 这里是第2个扇区
disk.write(b'\x00'*512)
disk.close()
读写单个磁盘分区
读写磁盘分区和读写硬盘大致相同, 但需要将"physicaldrive"改成分区对应的驱动器号。另外, 没有驱动器号的隐藏分区不能通过这种方式读写。
# 打开C盘分区
disk = open(r'\\.\C:', 'rb')
# 读取第一个扇区数据
print(disk.read(512))
# 读到的是PBR, 分区引导记录
写入分区的代码:
# 以读写模式打开磁盘分区
disk = open(r'\\.\g:', 'rb+')
with open(r"d:\分区PBR备份.txt","wb") as f:
f.write(disk.read(512)) # --备份分区开第1个扇区数据--
disk.seek(0) # 将文件指针移回起始位置
# 写入, 这一步不会影响磁盘数据
disk.write(b'\x00'*512)
# 将数据真正写入磁盘
disk.close()
执行后会发现, 分区G: 被成功破坏。此时, 虽然分区G: 的文件无法被访问, 但原始数据仍然可以用打开分区的方式读取。
还原数据用的代码:
disk = open(r'\\.\g:', 'rb+')
with open(r"d:\分区PBR备份.txt","rb") as f:
disk.write(f.read())
总结, 前面介绍了Python读写整个物理硬盘, 和单个驱动器的技巧。
读写磁盘原始数据有广泛的用途, 例如分区数据备份, 数据恢复等。