【发布时间】:2019-08-18 02:56:23
【问题描述】:
我有一个名为 Mixmeister 的旧版软件,它以 MMP 格式保存播放列表文件。
这种格式似乎包含二进制文件路径。
我希望从这些文件中提取文件路径以及任何其他信息。
我看到这是使用 JAVA 完成的(我不知道 JAVA)在这里(见 aorund ln 56): https://github.com/liesen/CueMeister/blob/master/src/mixmeister/mmp/MixmeisterPlaylist.java
这里还有 Haskell: https://github.com/larjo/MixView/blob/master/ListFiles.hs
到目前为止,我已经尝试将文件作为二进制文件读取(卡住了);使用正则表达式(杂乱的输出,成功率适中)并尝试尝试一些代码来读取块(超出我的技能水平)。
我在 Regex 中使用并取得了一定成功的代码是:
file='C:\\Users\\xxx\\Desktop\\mixmeisterfile.mmp'
with open(file, 'r', encoding="Latin-1") as filehandle:
#with open(file, 'rb') as filehandle:
for text in filehandle:
b = re.search('TRKF(.*)TKLYTRKM', text)
if b:
print(b.group())
再次,这让我很接近,但很混乱(数据并非全部完整,并且被 ascii 和二进制字符包围)。基本上,我的逻辑只是在两个字符串之间搜索以尝试提取文件名。我真正想做的是更接近 JAVA 在 GIT 中所具有的东西,即(下面的代码来自 GIT 链接):
List<Track> tracks = new ArrayList<Track>();
Marker trks = null;
for (Chunk chunk : trkl.getChunks()) {
TrackHeader header = new TrackHeader();
String file = "";
List<Marker> meta = new LinkedList<Marker>();
if (chunk.canContainSubchunks()) {
for (Chunk chunk2 : ((ChunkContainer) chunk).getChunks()) {
if ("TRKH".equals(chunk2.getIdentifier())) {
header = readTrackHeader(chunk2);
} else if ("TRKF".equals(chunk2.getIdentifier())) {
file = readTrackFile(chunk2);
} else {
if (chunk2.canContainSubchunks()) {
for (Chunk chunk3 : ((ChunkContainer) chunk2).getChunks()) {
if ("TRKM".equals(chunk3.getIdentifier())) {
meta.add(readTrackMarker(chunk3));
} else if ("TRKS".equals(chunk3.getIdentifier())) {
trks = readTrackMarker(chunk3);
}
}
}
}
}
}
Track tr = new Track(header, file, meta);
我猜如果不使用正则表达式,这将使用 RIFF 或 Python 中的块库?虽然我阅读了https://docs.python.org/2/library/chunk.html 的文档,但我不确定我是否理解如何处理这样的事情 - 主要是我不明白如何正确读取文件路径中可见混合的二进制文件。
【问题讨论】:
标签: java python-3.x binary chunks