2014-06-12 2 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 = open (doc, 'rb'). read()' – 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'와 open에 'WB'인수를. Windows에서이 파일을 분명히 여는 것이므로 파일을 Windows 문자열로 해석 할 수 없습니다.

newpath + '\\' +fileName 유형 조작이 아닌 os.path.join도 사용해야합니다.

2

왜 파일을 문자열로 읽은 다음 새 위치에 쓸 수 없는지 알 수 없었습니다.

PDF는 텍스트 파일 형식이 아닌 바이너리 파일 형식입니다. 텍스트로 (일반적으로 또는 데이터) 파일을 치료하는 방법은 특히, 다른 방법을 변경할 수 있습니다

  • 읽기 데이터를 텍스트 일부의 문자 인코딩에 따라 문자로 바이트 바이트 시퀀스를 해석한다. 텍스트를 다시 데이터로 쓰는 것은 일부 문자 인코딩에 따라 변형됩니다.

    적용된 인코딩이 다른 경우 결과가 원본 파일과 분명히 다릅니다. 그러나 동일한 인코딩이 사용 된 경우에도 차이점이 발생할 수 있습니다. 원래 파일에 적용된 인코딩에서 의미가없는 바이트가 포함 된 경우 일부 대체 문자가 대신 사용되며 최종 결과 파일에는 해당 대체 문자의 인코딩이 포함됩니다. 원래 바이트 시퀀스.또한 일부 인코딩에는 동일한 문자에 대해 여러 가지 가능한 인코딩이 있습니다. 따라서, 일부 입력 바이트 시퀀스는 출력에서 ​​동일한 문자를 나타내는 다른 시퀀스로 대체 될 수 있습니다.

  • 플랫폼의 기본 설정에 따라 행의 시퀀스가 ​​변경 될 수 있습니다.

    바이너리 파일은 하나 또는 다른 플랫폼에서 줄 끝 표시로 사용되는 다른 바이트 시퀀스를 포함 할 수 있습니다. CR, LF, CRLF, ... 데이터를 텍스트로 처리하는 메소드는 모두 로컬 플랫폼에서 선호하는 하나의 시퀀스로 대체 할 수 있습니다. 그러나 바이너리 파일의 이러한 바이트는 줄 끝 (end-of-line)과 다른 의미를 가질 수 있으므로이 대체는 파괴적 일 수 있습니다. 일반적으로

  • 제어 문자는 바이트 0..31는 제어 문자 등의 의미를 가지고 많은 인코딩에서

    을 무시 할 수있다. 이진 데이터를 텍스트로 처리하는 방법은 어떻게 든 해석하여 결과가 변경 될 수 있습니다.

이러한 모든 변경 사항으로 인해 바이너리 데이터가 완전히 파괴 될 수 있습니다. PDF 내에서 압축 된 스트림.

모드 문자열에 b으로 파일을 읽는 방법으로 이진 모드를 사용해 볼 수도 있습니다. 읽고 쓰는 동안 바이너리 모드를 사용하면 문제가 해결 될 수 있습니다.

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

는 그래서 변경된 내용을 표시하지 않습니다 내가 한

것은 성경에 기록 된 후 파일 내용이 읽기 후에 무엇에 소스에서 읽은 것을 비교했다?

또한 파일을 텍스트로 읽습니다. 따라서 원래의 실제 바이트 내용과 복사 된 파일을 비교하지는 않지만 읽는 동안 가정 된 인코딩에 따라 해석됩니다. 그래서 피해가 이미 비교의 양쪽에서 이루어졌습니다.

+0

감사합니다. 귀하의 의견은 제가 인식하지 못했던 복잡성을 이해하는 데 도움이되었습니다. – PyNEwbie

관련 문제