走目录时字数统计 PDF 文件
word count PDF files when walking directory
你好 Whosebug 社区!
我正在尝试构建一个 Python 程序,它将遍历目录(和所有子目录)并对所有 .html、.txt 和.pdf 文件。阅读 .pdf 文件时,需要一些额外的东西(PdfFileReader)来解析文件。解析 .pdf 文件时出现以下错误并且程序停止:
AttributeError: 'PdfFileReader' 对象没有属性 'startswith'
不解析.pdf文件时问题完全成功。
代码
#!/usr/bin/python
import re
import os
import sys
import os.path
import fnmatch
import collections
from PyPDF2 import PdfFileReader
ignore = [<lots of words>]
def extract(file_path, counter):
words = re.findall('\w+', open(file_path).read().lower())
counter.update([x for x in words if x not in ignore and len(x) > 2])
def search(path):
print path
counter = collections.Counter()
if os.path.isdir(path):
for root, dirs, files in os.walk(path):
for file in files:
if file.lower().endswith(('.html', '.txt')):
print file
extract(os.path.join(root, file), counter)
if file.lower().endswith(('.pdf')):
file_path = os.path.abspath(os.path.join(root, file))
print file_path
with open(file_path, 'rb') as f:
reader = PdfFileReader(f)
extract(os.path.join(root, reader), counter)
contents = reader.getPage(0).extractText().split('\n')
extract(os.path.join(root, contents), counter)
pass
else:
extract(path, counter)
print(counter.most_common(50))
search(sys.argv[1])
完整错误
Traceback (most recent call last):File line 50, in <module> search(sys.argv[1])
File line 36, in search extract(os.path.join(root, reader), counter)
File line 68, in join if b.startswith('/'):
AttributeError: 'PdfFileReader' object has no attribute 'startswith'
使用.pdf文件调用提取函数时似乎失败了。任何 help/guidance 将不胜感激!
预期结果(作品 w/out .pdf 文件)
[('cyber', 5101), ('2016', 5095), ('date', 4912), ('threat', 4343)]
问题是这一行
reader = PdfFileReader(f)
returns 一个 PdfFileReader 类型的对象。然后将此对象传递给 extract() 函数,该函数需要文件路径而不是 PdfFileReader 对象。
建议将您当前在 search() 函数中进行的 PDF 相关处理移动到 extract function() 中。然后,在提取函数中,您将检查它是否是一个 PDF 文件,然后采取相应的行动。所以,像这样:
def extract(file_path, counter):
if file_path.lower().endswith(('.pdf')):
reader = PdfFileReader(file)
contents = reader.getPage(0).extractText().split('\n')
counter.update([x for x in contents if x not in ignore and len(x) > 2])
elif file_path.lower().endswith(('.html', '.txt')):
words = re.findall('\w+', open(file_path).read().lower())
counter.update([x for x in words if x not in ignore and len(x) > 2])
else:
## some other file type...
尚未测试上面的代码片段,但希望您能理解。
你好 Whosebug 社区!
我正在尝试构建一个 Python 程序,它将遍历目录(和所有子目录)并对所有 .html、.txt 和.pdf 文件。阅读 .pdf 文件时,需要一些额外的东西(PdfFileReader)来解析文件。解析 .pdf 文件时出现以下错误并且程序停止:
AttributeError: 'PdfFileReader' 对象没有属性 'startswith'
不解析.pdf文件时问题完全成功。
代码
#!/usr/bin/python
import re
import os
import sys
import os.path
import fnmatch
import collections
from PyPDF2 import PdfFileReader
ignore = [<lots of words>]
def extract(file_path, counter):
words = re.findall('\w+', open(file_path).read().lower())
counter.update([x for x in words if x not in ignore and len(x) > 2])
def search(path):
print path
counter = collections.Counter()
if os.path.isdir(path):
for root, dirs, files in os.walk(path):
for file in files:
if file.lower().endswith(('.html', '.txt')):
print file
extract(os.path.join(root, file), counter)
if file.lower().endswith(('.pdf')):
file_path = os.path.abspath(os.path.join(root, file))
print file_path
with open(file_path, 'rb') as f:
reader = PdfFileReader(f)
extract(os.path.join(root, reader), counter)
contents = reader.getPage(0).extractText().split('\n')
extract(os.path.join(root, contents), counter)
pass
else:
extract(path, counter)
print(counter.most_common(50))
search(sys.argv[1])
完整错误
Traceback (most recent call last):File line 50, in <module> search(sys.argv[1])
File line 36, in search extract(os.path.join(root, reader), counter)
File line 68, in join if b.startswith('/'):
AttributeError: 'PdfFileReader' object has no attribute 'startswith'
使用.pdf文件调用提取函数时似乎失败了。任何 help/guidance 将不胜感激!
预期结果(作品 w/out .pdf 文件)
[('cyber', 5101), ('2016', 5095), ('date', 4912), ('threat', 4343)]
问题是这一行
reader = PdfFileReader(f)
returns 一个 PdfFileReader 类型的对象。然后将此对象传递给 extract() 函数,该函数需要文件路径而不是 PdfFileReader 对象。
建议将您当前在 search() 函数中进行的 PDF 相关处理移动到 extract function() 中。然后,在提取函数中,您将检查它是否是一个 PDF 文件,然后采取相应的行动。所以,像这样:
def extract(file_path, counter):
if file_path.lower().endswith(('.pdf')):
reader = PdfFileReader(file)
contents = reader.getPage(0).extractText().split('\n')
counter.update([x for x in contents if x not in ignore and len(x) > 2])
elif file_path.lower().endswith(('.html', '.txt')):
words = re.findall('\w+', open(file_path).read().lower())
counter.update([x for x in words if x not in ignore and len(x) > 2])
else:
## some other file type...
尚未测试上面的代码片段,但希望您能理解。