2010-12-12 22 views
6

này nên câu hỏi rất đơn giản, mà tôi không thể tìm thấy câu trả lời bằng cách tìm kiếm của Google: Làm thế nào để đóng tập tin xử lý được mở bởi pyPDF "PdfFileReader" ClassLàm thế nào để đóng pyPDF "PdfFileReader" tập tin Class xử lý

Đây là đoạn:

import os.path 
from pyPdf import PdfFileReader 

fname = 'my.pdf' 
input = PdfFileReader(file(fname, "rb")) 

os.rename(fname, 'my_renamed.pdf') 

điều này làm tăng lỗi [32]

Cảm ơn

+0

Bạn có chạy các cửa sổ và 'my_renamed.pdf' tồn tại trước khi bạn đổi tên không? – khachik

+0

Có, tôi quên đề cập đến tôi chạy Windows 7 32 bit và sử dụng Python 2.5. Tệp 'my_renamed.pdf' không tồn tại – romor

+0

@romor '32' có nghĩa là không thể truy cập tệp vì nó đang được sử dụng. Cố gắng đóng 'fname' theo cách thủ công (sau khi đọc nó) và sau đó đổi tên. – khachik

Trả lời

4

hệ điều hành đang ngăn một tập tin khỏi bị đổi tên trong khi cái gì khác có nó mở. Đây là một điều tốt (tm).

Tuyên bố with của Python sẽ tự động đóng tệp sau khi bạn đọc xong/thao tác nó.

with open(fname, "rb") as f: 
    input = PdfFileReader(f, "rb")) 

os.rename(fname, 'my_renamed.pdf') 

Nếu bạn vẫn còn trên Python 2.5, bạn sẽ phải làm một nhập khẩu đặc biệt:

from __future__ import with_statement 

Python 2.6 trở lên có với kích hoạt theo mặc định.

3

Nếu bạn thực sự phải truy cập này từ đối tượng PdfFileReader (có nghĩa là: nếu bạn không có một tham chiếu đến tập tin đối tượng chính mình), bạn có thể sử dụng reader.stream.close()

Lưu ý rằng PdfFileReader sẽ cần một đối tượng tệp mở để truy cập nội dung của pdf (nó không kéo tất cả mọi thứ vào bộ nhớ ngay từ đầu), vì vậy chỉ đóng tệp khi bạn làm xong với trình đọc.

1

tôi sẽ sugest để xử lý các tập tin mở ra khỏi PdfFileReader

Mã của bạn sẽ là:

import os.path 
from pyPdf import PdfFileReader 

fname = 'my.pdf' 
fh = file(fname, "rb") 
input = PdfFileReader(fh) 

fh.close() 
os.rename(fname, 'my_renamed.pdf') 
0

thay vì sử dụng input=PdfFileReader(file(fname, "rb")) tạo thêm một input stream như thế này

inputStream=file(fname, "rb") 
    input=PdfFileReader(inputStream) 

và khi công việc được thực hiện, hãy sử dụng inputStream.close() thì u sẽ có thể gọi nó qua gói os

Các vấn đề liên quan