Переменные файлы с Python - PullRequest
       9

Переменные файлы с Python

2 голосов
/ 21 февраля 2010

Я пытаюсь получить путь к файлу, например, C: \ Programfiles \ file.txt, но мне бы хотелось, чтобы file.txt был переменной, которую я могу изменить, когда мне это нужно. Я пытаюсь сравнить 2 каталога, а затем скопировать файлы из одного в другой, если они еще не там. пока у меня есть этот код.

import os
import shutil
A= set(os.listdir(r"C:\Users\Morpheous\Desktop\Python Test"))
B= set(os.listdir(r"C:\Users\Morpheous\Desktop\Python Test 2"))
if len(A)< len(B):
    C=B-A
    print("File is: %s" %(C))
    shutil.copy2('C:\\Users\\Morpheous\\Desktop\\Python Test 2\\%r'%(C),'C:\\Users\\Morpheous\\Desktop\\Python Test')

elif len(A) > len(B):
    C=B-A
    print(C)

и я получаю ошибку, потому что переменная вставляется в путь с {''} вокруг него. Как мне это сделать?

Ответы [ 3 ]

4 голосов
/ 21 февраля 2010

Пожалуйста, используйте os.path.join для построения путей. Также вы должны поместить каталоги в переменные для повторного использования. Кроме того, вам нужно перебрать разницу между папками (B - A), чтобы получить каждое имя файла в наборе различий (C - это набор файлов, которые были добавлены!).

Вот исправленная версия - протестирована и работает:

import os
import shutil

pathA = r"C:\Users\Morpheous\Desktop\Python Test"
pathB = r"C:\Users\Morpheous\Desktop\Python Test 2"

A = set(os.listdir(pathA))
B = set(os.listdir(pathB))
C = B - A

if len(C):
    print("Difference is: %s" % repr(C))

    for addedFile in C:
        shutil.copy2(os.path.join(pathB, addedFile),
                     os.path.join(pathA, addedFile))
else:
    print("No new files")
2 голосов
/ 22 февраля 2010

вы должны использовать библиотеку типа filecmp для сравнения каталогов / файлов

>>> import filecmp
>>> import os
>>> dira = os.path.join("/home","dir1")
>>> dirb = os.path.join("/home","dir2")
>>> os.listdir(dira)
['file.jpg', 'file2.txt']
>>> os.listdir(dirb)
['file1.jpg', 'file2.txt']
>>> r=filecmp.dircmp(a,b)
>>> r.right_only  # only in dirb
['file1.jpg']
>>> r.left_only   # only in dira
['file.jpg']
1 голос
/ 21 февраля 2010

Используйте %s вместо %r и C.pop().replace(' ', '\\ ') вместо C, что является set, а не строкой (replace необходим для "экранирования" каждого пробела - я думаю, ). И последнее, но не менее важное: я думаю, что вы используете shutil.copy2 неправильно: см. документы - ему нужны два аргумента, а не один аргумент с разделителем пробела.

В вашем коде могут скрываться и другие ошибки (я не уверен, например, что должна означать эта часть 2\\; вам может понадобиться цикл, поскольку copy2 делает по одному файлу за раз и у вас может быть несколько; и т. д., и т. д.), но, по крайней мере, они точно есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...