Shutil.copy не копирует

Совершенно новый для программирования, погружаюсь в него с python и «Learning Python the Hard Way».

По какой-то причине я не могу заставить shutil.copy скопировать файл. На моем рабочем столе сейчас есть файл «test1.txt» и еще один «test2.txt». Я хочу скопировать содержимое test1 в test2.

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

import shutil, sys  
shutil.copy(sys.argv[a], sys.argv[b]) # <- I plug in test1 and test2

Я получаю сообщение об ошибке NameError: имя 'test1' не определено

Однако ни один из вариантов помещения test1 и test2 в a и b не выполняется успешно. Я попробовал test, test1.txt, установил переменную test1, а затем подключил ее, ничего.


person Nikita Petrov    schedule 29.03.2015    source источник


Ответы (2)


sys.argv возвращает список. sys.argv[0] содержит имя скрипта, sys.argv[1] и sys.argv[2] — аргументы командной строки:

import shutil, sys                                                                                                                                                    

print sys.argv # print out the list so you can see what it looks like

a = sys.argv[1]
b = sys.argv[2]                                                                                                                                                      
shutil.copy(a, b)    # a & b take their values from the command line                                                                                                                             

shutil.copy('text1','text2')  # here shutil is using hard coded names

Командная строка:

$ python filecopy.py t1.txt t2.txt

Выход:

['filecopy.py', 't1.txt', 't2.txt'] 

И файлы t2.txt и text2 были записаны. Обратите внимание, что sys.argv[0] может содержать полный путь, а не только имя файла (это зависит от ОС).

person Vidhya G    schedule 29.03.2015
comment
Спасибо за подробное объяснение! Я совершенно не понимал, что мы буквально используем числа в части sys.argv вместо того, чтобы вставлять имя нашего файла. - person Nikita Petrov; 29.03.2015

Вы должны использовать shutil.copy(a, b), а не shutil.copy(sys.argv[a], sys.argv[b]). Очевидно, что значения a и b являются строками, предположительно путевыми именами, а не числами, как можно было бы ожидать, если бы они предназначались для индексов списка sys.argv.

Следующее должно работать, если файл или каталог с именем test1 существует:

a = "test1"
b = "test2"
shutil.copy(a, b)
person Dan D.    schedule 29.03.2015
comment
Я тоже пробовал это и не мог заставить его работать. Если я подключаю test1 или test1.txt и т. д., это дает ту же ошибку. - person Nikita Petrov; 29.03.2015
comment
Спасибо, это сработало! Единственное отличие состоит в том, что вместо test1 нужно выполнить test1.txt. - person Nikita Petrov; 29.03.2015