我正在尝试从.ldb文件中提取数据。 Chrome扩展OneTab对我造成了干扰,我正在尝试恢复它保存的链接。我相信我已经从旧的博客文章中找到了解决方案,但是我对编码的了解不足,无法确定如何遵循。
这是博客文章的链接: https://antimatter15.com/2015/12/recovering-deleted-data-from-leveldb/
我相信我已经按照他的建议正确地完成了构建Go应用程序的所有工作。它创建了一个名为“ ldbdump”的文件,但没有文件扩展名。下一步是我遇到麻烦的地方。我试图在Jupyter Notebook中运行他的Python代码(这是我仅有的Python经验,但经验有限),但是只会出错。
我正在使用的原始代码可以在上面的链接的“恢复”标题下找到。我将“基本”的定义从“测试资料复制”更改为指向一个文件夹,其中同时包含我要读取的.ldb文件和“ ldbdump”文件。收到错误后,我还在底部更改了print命令的语法。其他所有东西都一个人呆着。
base = "D:\\Downloads\\ldb archive"
import os
from subprocess import Popen, PIPE
import json
import ast
for f in os.listdir(base):
if f.endswith(".ldb"):
process = Popen(["ldbdump", os.path.join(base, f)], stdout=PIPE)
(output, err) = process.communicate()
exit_code = process.wait()
for line in (output.split("\n")[1:]):
if line.strip() == "": continue
parsed = ast.literal_eval("{" + line + "}")
key = parsed.keys()[0]
print(json.dumps({ "key": key.encode('string-escape'), "value": parsed[key] }))
如果我正确理解了博客文章,则应在将.ldb文件的内容转换为JSON文件后打印其中的内容(尽管我不确定该JSON文件的保存位置)。之后,我可以继续进行下一步,以清理结果以提高可读性。相反,我得到一个错误。因为我一开始几乎不知道我在做什么,所以我不能说自己在做什么错。我真正了解的只是顶部的“找不到文件”。看起来像这样:
FileNotFoundError Traceback (most recent call last)
<ipython-input-2-26ff29e32d63> in <module>
1 for f in os.listdir(base):
2 if f.endswith(".ldb"):
----> 3 process = Popen(["ldbdump", os.path.join(base, f)], stdout=PIPE)
4 (output, err) = process.communicate()
5 exit_code = process.wait()
~\Anaconda3\lib\subprocess.py in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, encoding, errors, text)
767 c2pread, c2pwrite,
768 errread, errwrite,
--> 769 restore_signals, start_new_session)
770 except:
771 # Cleanup if the child failed starting.
~\Anaconda3\lib\subprocess.py in _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, unused_restore_signals, unused_start_new_session)
1170 env,
1171 os.fspath(cwd) if cwd is not None else None,
-> 1172 startupinfo)
1173 finally:
1174 # Child is launched. Close the parent's copy of those pipe
FileNotFoundError: [WinError 2] The system cannot find the file specified
就像我说的那样,我不确定自己做错了什么。我最好的猜测是,我没有正确修改博客文章的代码以使其指向我的PC上的文件,或者原始代码错误地假定了我的机器的某些信息(这意味着我的操作系统错误,我不应该运行放在笔记本中,我缺少一些依赖关系,等等。)
作为参考,我使用的是运行Windows 10的台式机,我正在尝试使用Jupyter Notebook 5.7.4运行此代码,除了本节中列出的软件包外,我没有导入任何其他软件包。上面的代码,而我几乎不知道自己在做什么。对不起。请帮忙。
答案 0 :(得分:0)
在我的研究中,我添加了一些修复程序
import os
import subprocess
import json
import ast
for f in os.listdir(base):
if f.endswith(".ldb"):
process = subprocess.Popen(["ldbdump", os.path.join(base, f)], stdout=subprocess.PIPE, shell = True)
(output, err) = process.communicate()
exit_code = process.wait()
for line in (output.split("\n")[1:]):
if line.strip() == "": continue
parsed = ast.literal_eval("{" + line + "}")
key = parsed.keys()[0]
print json.dumps({ "key": key.encode('string-escape'), "value": parsed[key] })
答案 1 :(得分:0)
已经有点晚了,但是我遇到了同样的问题。解决方案实际上很简单:由Windows在Go下构建的ldbdump
文件(无扩展名)是正确的Windows可执行文件。只需添加.exe扩展名,您就可以直接在Windows命令提示符下运行它,例如ldbdump 000005.ldb
(ldbdump文件必须具有.exe扩展名,否则它是未知命令)。它将以逗号分隔的键/值对列表(纯文本)输出ldb dump。您可以简单地将输出复制并粘贴到文本文件中,或将输出通过管道传输到文件中,然后以所需的任何方式对其进行格式化等。
最重要的是:这是一个普通的Windows可执行文件,不需要使用python-使用您喜欢的任何工具来处理输出或手动完成输出。