2015-05-28 1 views
0

у меня есть этот мини-сценарий:копия из одного файла в другой - «ул» объект не имеет атрибута «закрыть»

from __future__ import print_function 
    from sys import argv 
    from os.path import exists 

    p_script, p_from_file, p_to_file = argv 

    print ('Copying from {first} to {second}'.format(first = p_from_file, 
                second = p_to_file)) 

    v_in_file = (open(p_from_file, 'r')).read() 
    print (v_in_file) 

    print ('The input file is {size} bytes long'.format(size = len(v_in_file))) 
    print ('Does the output file exists? {boolean}'.format(boolean = exists(p_to_file))) 
    raw_input('Press return to continue...') 

    v_out_file = open(p_to_file, 'w') 
    v_out_file.write(v_in_file) 

    print ('Alright, all done.') 
    v_in_file.close() 
    v_out_file.close() 

Проблема is..i не может закрыть файл и я не знаете, почему, в чем проблема? "v_in_file.close()" не выполняется должным образом.

+0

'v_in_file' есть ** данные, которые вы «читаете» из файла **, а не сам дескриптор файла ... Также используйте контекстный менеджер 'with'. – jonrsharpe

ответ

1

Ваш v_in_file представляет собой строку, оценивающую содержимое p_from_file. (Python documentation). Таким образом, он не имеет метода close().

Вы могли бы вместо того, чтобы писать,

v_in_file = open(p_from_file, 'r') file_text = v_in_file.read() v_in_file.close()

или

with open(p_from_file, 'r') as v_in_file: file_text = v_in_file.read()

автоматически закрывать файл [спасибо за напоминание, jonrsharpe]

+0

это было написано как ваш первый пример, но меня попросили попытаться написать его на одной строке все, что угодно ..., спасибо! – udarH3

1

Вы создаете файл внутри() и запрашивающий .read() метод так, в результате чего на строкового значения, после того, что вы потеряете ваш объект файла

лучший способ для создания файла в переменную и после того, как вы читаете из него, так что вы можете закрыть его должным образом после использования

Попробуйте это:

from sys import argv 
from os.path import exists 

p_script, p_from_file, p_to_file = argv 

print ('Copying from {first} to {second}'.format(first = p_from_file, 
               second = p_to_file)) 

file_to_read = open(p_from_file, 'r') 
v_in_file = file_to_read.read() 
print (v_in_file) 

print ('The input file is {size} bytes long'.format(size = len(v_in_file))) 
print ('Does the output file exists? {boolean}'.format(boolean = exists(p_to_file))) 
raw_input('Press return to continue...') 

v_out_file = open(p_to_file, 'w') 
v_out_file.write(v_in_file) 

print ('Alright, all done.') 
file_to_read.close() 
v_out_file.close() 

в соответствии с рекомендациями Buddie ниже можно будет проверить с помощью с here

+2

Вы должны использовать 'with' для обработки файлов, например. 'with open (p_from_file) как file_to_read:'. Тогда вам не нужно «закрывать». – jonrsharpe

Смежные вопросы