2012-08-25 42 views
6

‍Hi tất cả mọi người. Tôi gặp một thời gian tuyệt vời cố gắng tìm ra lý do tại sao có không cần phải là một thuộc tính đóng cho vài dòng mã này tôi đã viết:Python - đối tượng 'str' không có thuộc tính 'close'

from sys import argv 
from os.path import exists 

script, from_file, to_file = argv 

file_content = open(from_file).read() 
new_file = open(to_file, 'w').write(file_content) 

new_file.close() 

file_content.close() 

Tôi đọc một số điều và bài viết của người khác về vấn đề này, nhưng họ kịch bản phức tạp hơn nhiều so với những gì tôi đang học, vì vậy tôi không thể hiểu tại sao.

Tôi đang học Python theo cách cứng và sẽ đánh giá cao bất kỳ trợ giúp nào.

Cảm ơn bạn trước.

Trả lời

7

file_content là biến chuỗi, chứa nội dung của tệp - nó không có liên quan đến tệp. Bộ mô tả tệp bạn mở với open(from_file) sẽ tự động bị đóng: các phiên tệp được đóng sau khi các đối tượng tệp thoát khỏi phạm vi (trong trường hợp này, ngay sau .read()).

+0

Aha! Cảm ơn nhiều. Tôi đã không nhận ra sự khác biệt giữa các chuỗi và các đối tượng trong hình thức này. –

0

Khi bạn làm file_content = open(from_file).read(), bạn đặt file_content thành nội dung của tệp (được đọc bởi read). Bạn không thể đóng chuỗi này. Bạn cần lưu đối tượng tệp riêng biệt với nội dung của nó, chẳng hạn như:

theFile = open(from_file) 
file_content = theFile.read() 
# do whatever you need to do 
theFile.close() 

Bạn có vấn đề tương tự với new_file. Bạn nên tách cuộc gọi open(to_file) khỏi số write.

+0

Cảm ơn bạn đã xóa thông tin này. Ví dụ của bạn đã giúp tôi hiểu nó. Tôi không nghĩ về sự khác biệt giữa một chuỗi và đối tượng tập tin. –

+0

Sự khác biệt không phải là trường hợp ở đây. 'theFile' là một tệp, trong khi' theFile.read() 'là một chuỗi không có hàm đóng. – Nasir

+0

@Nasir Tôi đang cố gắng để xem nếu tôi hiểu điều này một cách chính xác: vì vậy lý do tại sao tôi không cần một chức năng gần là bởi vì 'file_content' là một chuỗi (vì tôi gọi là 'đọc' trên nó)? –

1

open(...) trả về một tham chiếu đến một đối tượng tập tin, gọi read trên mà đọc các tập tin trả về một đối tượng chuỗi, gọi write viết cho nó trở None, không ai trong số đó có một thuộc tính close.

>>> help(open) 
Help on built-in function open in module __builtin__: 

open(...) 
    open(name[, mode[, buffering]]) -> file object 

    Open a file using the file() type, returns a file object. This is the 
    preferred way to open a file. 

>>> a = open('a', 'w') 
>>> help(a.read) 
read(...) 
    read([size]) -> read at most size bytes, returned as a string. 

    If the size argument is negative or omitted, read until EOF is reached. 
    Notice that when in non-blocking mode, less data than what was requested 
    may be returned, even if no size parameter was given. 
>>> help(a.write) 
Help on built-in function write: 

write(...) 
    write(str) -> None. Write string str to file. 

    Note that due to buffering, flush() or close() may be needed before 
    the file on disk reflects the data written. 

Theres một vài cách để khắc phục điều này:

>>> file = open(from_file) 
>>> content = file.read() 
>>> file.close() 

hoặc với python> = 2,5

>>> with open(from_file) as f: 
...  content = f.read() 

Các with sẽ đảm bảo rằng các tập tin được đóng lại.

+0

Bạn tốt hơn không ghi đè lên biến 'tập tin'. Vì vậy, tốt hơn để nói 'với mở (from_file) là f: ...' thay vì 'với mở (from_file) thành tập tin: ...'. – behnam

+0

@behnam yeah thats một điểm tốt, cảm ơn. –

+0

Cảm ơn bạn. Tôi cần phải đi vào thói quen đọc tài liệu Python. Bởi vì tôi bị choáng ngợp và mất mát, tôi cố gắng tránh nó, nhưng tôi cần phải bắt đầu quen với nó. –

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