使用模块pypdf2
和urllib
我计划对Python中的许多.pdf文件进行相当大规模(文本)的分析。我目前的计划是使用urllib
下载文件,将其保存到我的计算机,然后使用pypdf2
打开/提取文本。
.pdf文件的大小范围为10-500 MB,(因为有~16000 .pdf文件)意味着项目的规模将在GB到TB的范围内。提取的数据不会很大,只是标记的单词关联集/计数,但.pdf文件本身就是一个问题。
我不打算一次全部下载它们,而是迭代地下载它们,以免我的系统不堪重负。以下是高级工作流程:
for pdf_url in all_list:
download_using_urllib(pdf_url)
text = read_text(pypdf2.pdf.PdfFileReader(pdf_url+'.pdf'))
store_word_assoc(text)
delete_file(pdf_url)
大部分代码已经编写完毕,如果相关,我可以发布。我的问题是:在我的HD上存储然后删除多达8 TB的数据会导致我的电脑出现任何问题吗?正如你所看到的那样,我并不是一次性存储它,但我只是有点担心,因为我之前从未做过这种规模的任何事情。如果这是一个问题,我怎么能以其他方式构建我的项目以避免这个?
谢谢!
答案 0 :(得分:2)
我想说你可能会考虑在下载时将PDF存储在内存中。 NamedTemporaryFiles可能是处理此问题的好方法。您可以将文件保存在内存中并从中读取,然后丢弃该文件。这样可以避免你的高清做大量写密集的事情。
您也可以考虑使用requests而不是urllib,它比urllib更直观。哦,作为奖励,它们都适用于Python 2和3。
答案 1 :(得分:1)
假设你有几GB的内存,我建议你把它们留在内存中。它将足够慢,因为它是下载那么多数据。不必要地将它保存到磁盘只会增加这个痛苦的过程。
由于这将是一个非常长时间运行的过程,我还建议您跟踪提取的文件。这样当它崩溃时,你可以从你离开的地方开始。
I am going to use requests, because it is very developer friendly.
伪代码:
pdf_url中的pdf_url: if yet_got_it(pdf_url): 继续
req = requests.get(pdf_url)
if req.status_code < 400:
text = read_text(req.content)
store_word_assoc(text)
mark_completed(pdf_url)
如果内存不足,建议的解决方案将起作用,不会对磁盘产生太大影响。这是一个很好的写作,但假设你没有一个应该没有什么不良影响的SSD。