2014-06-12 76 views
0

我需要對一些pdf文件進行一些操作。作爲第一步,我想將它們從一個目錄複製到支持我需求的樹中。我用下面的代碼爲什麼我不能打開已使用此代碼複製的PDF文件

for doc in docList: 
    #   these steps just create the directory structure I need from the file name 
    fileName = doc.split('\\')[-1] 
    ID = fileName.split('_')[0] 
    basedate = fileName.split('.')[0].split('_')[-1].strip() 
    rdate = '\\R' + basedate + '-' +'C' + basedate 
    newID = str(cikDict[ID]) 
    newpath = basePath + newID + rdate 
    #   check existence of the new path 
    if not os.path.isdir(newpath): 
     os.makedirs(newpath) 
    #   reads the file in and then writes it to the new directory 
    fstring = open(doc).read() 
    outref = open(newpath +'\\' + fileName, 'wb') 
    outref.write(fstring) 
    outref.close() 

當我運行這個代碼時,目錄被創建並且每個目錄中都有正確名稱的文件。但是,當我點擊打開一個文件時,Acrobat會收到一個錯誤消息,通知我該文件已損壞,無法修復。

我能夠使用

shutil.copy(doc,newpath) 

替換最後一個四行復制文件 - 但我一直無法弄清楚,爲什麼我無法讀取該文件作爲一個字符串,然後把它寫在一個新的位置。

有一件事我做的是比較有什麼從源到文件內容是什麼讀取後讀它已被寫入後:

>>> newstring = open(newpath + '\\' +fileName).read() 
>>> newstring == fstring 
True 

所以它不會出現內容被改變?

+1

嘗試'一個fstring =開放(DOC,「RB」)。閱讀()' – dawg

+0

相同的消息,但這次我駁回消息後,該文件沒有打開。這至少是你應該發佈的部分答案,如果你有時間對rb如何產生影響發表評論感謝 – PyNEwbie

回答

1

您應該使用shutil複製文件。這是平臺意識,你可以避免這樣的問題。

但是你已經發現了。

使用with打開和關閉文件會更好。然後文件被自動打開和關閉。這是更地道:

with open(doc, 'rb') as fin, open(fn_out, 'wb') as fout: 
    fout.write(fin.read())      # the ENTIRE file is read with .read() 

如果可能你在處理大量文件,讀取和寫入的塊:

with open(doc, 'rb') as fin, open(fn_out, 'wb') as fout: 
    while True: 
     chunk=fin.read(1024) 
     if chunk: 
      fout.write(chunk) 
     else: 
      break 

注意「RB」和「WB」參數open。由於您在Windows下清楚地打開了該文件,因此可以防止將文件解釋爲Windows字符串。

您還應該使用os.path.join而不是newpath + '\\' +fileName類型的操作。

2

我一直無法弄清楚爲什麼我無法將文件讀取爲字符串,然後將其寫入新的位置。

請注意,PDF是一種二進制文件格式,而不是文本文件格式。作爲文本解釋根據一些字符編碼字節和字節序列作爲字符

  • 讀數據:方法處理的文件(或數據一般)作爲文本可能以不同的方式改變它,特別是。將文本寫回爲數據,也會根據某種字符編碼再次進行轉換。

    如果應用的編碼不同,結果明顯不同於原始文件。但是,即使使用了相同的編碼,差異也會蔓延開來:如果原始文件包含的字節在應用的編碼中沒有意義,則會使用一些替換字符,而最終結果文件包含該替換字符的編碼,而不是原始字節序列。此外,一些編碼對同一個字符有多種可能的編碼。因此,某些輸入字節序列可能會被代表輸出中相同字符的其他序列替換。

  • 結束系序列可以根據平臺的偏好而改變。

    二進制文件可以包含關於一個或另一個平臺,例如用作結束行標記不同的字節序列CR,LF,CRLF ......將數據視爲文本的方法可能會將所有這些數據替換爲本地平臺上有利的一個序列。但是,由於二進制文件中的這些字節可能與行尾有不同的含義,因此這種替換可能具有破壞性。

  • 在一般控制字符可被忽略

    在許多編碼字節0..31具有含義的控制字符。將二進制數據作爲文本處理的方法可能會以某種方式解釋它們,這可能會導致再次更改輸出。

所有這些變化都可以完全破壞二進制數據,例如, PDF中的壓縮流。

您可以嘗試使用二進制模式讀取文件,也可以在模式字符串中使用b打開文件。在閱讀和寫作時使用二進制模式可以解決您的問題。

有一件事我做的是比較有什麼從源到文件內容是什麼讀取後讀取它已經寫入後:

>>> newstring = open(newpath + '\\' +fileName).read() 
>>> newstring == fstring 
True 

所以它不會出現內容被改變?

你比較也讀取文件爲文本。因此,您不會比較原始文件和複製文件的實際字節內容,而是根據讀取時假定的編碼來解釋它們的解釋。所以在比較的雙方都已經完成了損壞。

+0

感謝你的評論有助於我理解一些我不知道的複雜性。 – PyNEwbie

相關問題