python 2.6 TypeError: принуждение к Unicode: нужна строка или буфер, найден список

Я не понимаю причину этого TypeError

сценарий:

import os
import shutil

src1 = os.listdir("/usr/dir1")
dst1 = os.listdir("/usr/dir2")


for file in src1:
    if file not in dst1:
        shutil.copy(file, dst1)

Ошибка:

File "/scripts/trans_dir_balancing.py", line 14, in <module>
    shutil.copy(file, dst1)
  File "/usr/lib64/python2.6/shutil.py", line 82, in copy
    if os.path.isdir(dst):
  File "/usr/lib64/python2.6/genericpath.py", line 41, in isdir
    st = os.stat(s)
TypeError: coercing to Unicode: need string or buffer, list found

Спасибо за помощь


person quest    schedule 28.03.2014    source источник


Ответы (3)


потому что dst1 в вашем коде — это не путь, а список путей. Это должен быть путь (строка). Посмотрите shutil.copy. (), а также в os.listdir().

person Bruno Gelb    schedule 28.03.2014

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

import os
import shutil

src = '/usr/dir1'
dst = '/usr/dir2'

for file in os.listdir(src):
    if file not in os.listdir(dst) and os.path.isfile(file):
        # copy file to dst dir if not exists
        shutil.copy(os.path.join(src, file), dst)
person shrnkrn    schedule 28.03.2014
comment
Это поднимет IOError: [Errno 21], если каталог будет найден в исходном каталоге, поэтому необходим if os.path.isfile(file):. Также стоит упомянуть, что OP переопределяет встроенный объект file, и переменная должна быть переименована. - person skamsie; 28.03.2014
comment
Хорошие моменты. Что касается пункта 1, то, если нет шансов, что это может произойти, я не думаю, что программу нужно слишком усложнять. Хотя я отредактирую код, чтобы упомянуть об этом, если ОП не знает. Спасибо. - person shrnkrn; 28.03.2014
comment
Этот код имеет небезопасное состояние гонки. Полагаясь на if file not in os.listdir(dst), вы предполагаете, что имя целевого файла не может быть создано в целевом каталоге до следующего вызова shutil.copy, что обычно неверно. Поскольку shutil.copy перезаписывает существующие файлы, это небезопасно. Вам следует рассмотреть возможность использования другого API, который не перезаписывает, и пропустить проверку существования в пользу блока try/except для обработки условия перезаписи. - person Chris Johnson; 17.04.2017

Я знаю, что этот пост старый и устаревший. Однако мне показалось забавным, что несколько месяцев спустя я работаю над подобным проектом. Я работал над программой для резервного копирования моего домашнего каталога. Вот как я это сделал.

for root, dirs, files in os.walk(r'input path of files to be backed up'):
for ckfile in files:
    for root2, dirs2, files2 in os.walk(r'input your destination directory'):
        if ckfile not in files2:
            print"Backing up the file "+ckfile
            copyf = os.path.join(root,ckfile)
            shutil.copy2(copyf, r'input your destination directory')    
        else:
            print "The file "+ckfile+" is already backed up"

Теперь мне нужен способ проверить собственное сжатие. Я рассматривал возможность использования zip, но это потребовало бы изменения кода, который у меня есть до сих пор. Я, вероятно, просто собираюсь проверить программу, чтобы узнать, какая операционная система используется, а затем просто использовать команды этой операционной системы для сжатия файла.

person user3655020    schedule 18.10.2014