2010-02-21 4 views
2

'C : \ Programfiles \ file.txt'와 같은 파일 경로를 사용하려고하지만 file.txt를 필요할 때마다 변경할 수있는 변수로 지정하고 싶습니다. 나는 이미 거기 arent 경우에 2 개의 전화 번호부를 비교하고 그 때 1에서 또 다른 한개에 파일을 베끼는 것을 시도하고있다. 지금까지이 코드가 있습니다. 변수가 주변 { '}와 경로에 삽입되어 있기 때문에가변 변수 파일 (파이썬 포함)

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) 

가 나는 오차를 얻는다. 이 일을 어떻게하면 될까요? set 아닌 문자열

사용 %s 대신 %r
+0

- 사용되어야한다'OS. sep'를 반복적으로 하드 코딩하는 대신 분리 문자를 사용하십시오. –

+1

Charles Duffy의 의견에 따라 작성하십시오 :'os.path.join'을 사용하여 구성 요소 경로에서 파일 시스템 경로를 구성하고 구분 기호를 하드 코딩하지 마십시오. – bignose

답변

4

경로를 구성하려면 os.path.join을 사용하십시오. 또한 재사용을 위해 디렉토리를 변수에 넣어야합니다. 또한 차이점 집합 (C은 추가 된 파일 집합입니다!)에있는 각 파일 이름을 가져 오기 위해 폴더 간의 차이를 반복해야합니다 (B - A).

가 여기에 수정 된 버전입니다 - 테스트 작업 :

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") 
+0

len (A)> len (B)는 C가 비어 있음을 보장하지 않습니다. C를 항상 계산 한 다음보고 목적으로 비어 있는지 간단히 확인해야합니다. –

+1

@ rgrig : 좋은 지적, 내 코드에서 변경했습니다. – AndiDog

1

C.pop().replace(' ', '\\ ') 대신 C의은 (- 내가 생각하는 replace은 모든 공간을 '탈출'필요하다). 마지막으로 중요한 것은 shutil.copy2을 잘못 사용하고 있다고 생각합니다 : the docs 참조 - 두 개의 인수가 필요하며 하나의 인수는 공백으로 구분됩니다.

코드에 다른 버그가 숨어있을 수 있습니다 (예 : 2\\ 부분이 의미하는 바를 모르겠다). 한 번에 한 파일 씩 copy2을 수행하면 루프가 필요할 수 있습니다. serveral, etc, 등등), 그러나 적어도 이것들은 분명히 있습니다.

+0

고마워! 많은 도움을 주었고, 파이썬에 익숙하지 않았기 때문에 여전히 ins과 outs를 얻었습니다. – Gabe

2

당신이 디렉토리를 비교 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']