2014-01-23 31 views
-1

我編寫了一個腳本來讀取PDF元數據以簡化工作任務。目前的工作版本不從長遠來看非常有用:讀取PDF元數據並寫入CSV的腳本

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

不確定這是否只是一個錯字,但最後一行在第二個示例中沒有正確縮進。 – ely

回答

1

找出來了。我用來下載文件的腳本是在文件名後面加上'\ r \ n'來保存文件,我沒有注意到,直到我真的在目錄ls'd查看發生了什麼。感謝大家的幫助。

1
  1. writerow([file, title, subject])應該writerow([f, title, subject])

  2. 您可以使用sys.exc_info()來打印錯誤的詳細信息

+0

想通了。該腳本在文件名後面保存了'\ r \ n'後面的文件,直到我實際上在目錄中查看了哪些內容,我才注意到。謝謝你的幫助。 – asdoylejr

1

你檢查pdffil es變量包含你認爲它的作用?我正在列出一個清單...所以也許嘗試:

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)))