2014-06-12 38 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

相关问题