我编写了一个脚本来阅读PDF元数据以简化工作中的任务。从长远来看,目前的工作版本不是很有用:
from pyPdf import PdfFileReader
BASEDIR = ''
PDFFiles = []
def extractor():
output = open('windoutput.txt', 'r+')
for file in PDFFiles:
try:
pdf_toread = PdfFileReader(open(BASEDIR + file, 'r'))
pdf_info = pdf_toread.getDocumentInfo()
#print str(pdf_info) #print full metadata if you want
x = file + "~" + pdf_info['/Title'] + " ~ " + pdf_info['/Subject']
print x
output.write(x + '\n')
except:
x = file + '~' + ' ERROR: Data missing or corrupt'
print x
output.write(x + '\n')
pass
output.close()
if __name__ == "__main__":
extractor()
目前,正如您所看到的,我必须手动输入工作目录并手动填充PDF文件列表。它还只是以我可以复制/粘贴/分离到电子表格的格式打印出终端中的数据。
我希望脚本能够自动运行到我扔进去的任何目录中并填充CSV文件以便于使用。到目前为止:
from pyPdf import PdfFileReader
import csv
import os
def extractor():
basedir = os.getcwd()
extension = '.pdf'
pdffiles = [filter(lambda x: x.endswith('.pdf'), os.listdir(basedir))]
with open('pdfmetadata.csv', 'wb') as csvfile:
for f in pdffiles:
try:
pdf_to_read = PdfFileReader(open(f, 'r'))
pdf_info = pdf_to_read.getDocumentInfo()
title = pdf_info['/Title']
subject = pdf_info['/Subject']
csvfile.writerow([file, title, subject])
print 'Metadata for %s written successfully.' % (f)
except:
print 'ERROR reading file %s.' % (f)
#output.writerow(x + '\n')
pass
if __name__ == "__main__":
extractor()
在当前状态下,它似乎只打印一个错误(如,异常中的错误消息,而不是Python返回的错误)消息然后停止。我已经盯着它看了一会儿,我不确定从哪里开始。有人能指出我正确的方向吗?
答案 0 :(得分:1)
writerow([file, title, subject])
应为writerow([f, title, subject])
您可以使用sys.exc_info()
打印错误的详细信息
答案 1 :(得分:1)
您是否检查过pdffiles变量包含您认为它的作用?我在列表中得到一个列表......所以也许试试:
for files in pdffiles:
for f in files:
#do stuff with f
我个人喜欢glob。请注意,我在扩展变量中的.pdf之前添加*:
import os
import glob
basedir = os.getcwd()
extension = '*.pdf'
pdffiles = glob.glob(os.path.join(basedir,extension)))
答案 2 :(得分:1)
想出来。我用来下载文件的脚本是在文件名之后用'\ r \ n'尾随保存文件,我没有注意到,直到我实际ls
目录才能查看到底是什么。感谢大家的帮助。