读取PDF元数据并写入CSV的脚本

时间:2014-01-23 15:30:37

标签: python csv

我编写了一个脚本来阅读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返回的错误)消息然后停止。我已经盯着它看了一会儿,我不确定从哪里开始。有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:1)

  1. writerow([file, title, subject])应为writerow([f, title, subject])

  2. 您可以使用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目录才能查看到底是什么。感谢大家的帮助。