2016-11-18 2 views
2

:다른 디렉터리에서 파일을 하나의 공용 디렉터리로 이동하고 이름을 바꾸는 방법은 무엇입니까? 다음 디렉토리 구조를 감안할 때

dir/2012-01-01/employee.csv.bz2 
dir/2012-01-02/employee.csv.bz2 
dir/2012-01-03/employee.csv.bz2 
dir/2012-01-04/employee.csv.bz2 
dir/2012-01-05/employee.csv.bz2 

내가 .csvcsv.bz2에서 확장자 이름을 변경하고 새 폴더로 .csv 확장자를 가진 파일 만 이동 싶습니다했다

dir/all_files 

나는 시도 무엇 이름은 바뀌지 만 파일을 새로운 방향으로 이동하지는 못합니다.

path = 'dir/' 
os.mkdir('dir/all_files') 

extensions = ('.csv') 
for folderName, subfolders, filenames in os.walk(path): 
    for filename in filenames: 
     ext = os.path.splitext(filename)[-1].lower() 
     if ext in extensions: 
      infilename = os.path.join(folderName, filename) 
      newname = os.path.join('dir', 'all_files', filename.replace('.csv.bz2', '.csv')) 
      output = os.rename(infilename, newname) 
나는 모든 employee.csv로 표시되는 파일을 이동할 때문에

output = os.rename(infilename, newname) 
FileExistsError: [WinError 183] Cannot create a file when that file already exists: 'dir/2012-01-01\\employee.csv.bz2' -> 'dir/all_files\\employee.csv' 

그것은 물론 의미가 있습니다 : 오류에 첫 번째 항목 및 결과를 이동

.

제 질문은 어떻게 이러한 파일을 all_files으로 옮길 수 있습니까?

+0

현재 작업 디렉토리가 무엇입니까? 즉, 파이썬 인스턴스가 실행되는 디렉토리입니까? 'dir /'에있는 모든 디렉토리가'2012-'로 시작합니까? –

+1

하나의 디렉토리에 여러 개의'employee.csv' 파일을 가질 수 없기 때문에, 그들이 위치한 디렉토리를 기반으로 개별 이름을 부여해야합니다. –

+0

예,'dir /'은'2012'로 시작하지만 곧'2013'로 바뀔 수 있습니다. 파이썬은'/ usr/bin/python'을 실행하고 현재 작업 디렉토리는'os.getcwd()'가있을 때'/ home/myname /'입니다. 나는'newname'에 밀리 세컨드를 덧붙여서 고유 한 이름을 주려고했지만 여전히 오류가 발생합니다. 시퀀스의 종류를 추가해야한다고 생각합니다. 여기 파이썬 지식이 끝납니다. – Mamba

답변

2

당신의 문제는 당신이 모든 파일을 같은 디렉토리에 넣고 모두 동일한 이름을 가지고 있다는 것입니다. 첫 번째 폴더의 이름이 무엇인지에 따라 이름을 바꿀 수 있습니다. 이 코드는 작동합니다 :

import os 

path = 'dir/' 
os.mkdir('dir/all_files') 

extensions = ['.csv'] 
for folder, _, filenames in os.walk(path): 
    for filename in filenames: 
     if folder == path or folder == os.path.join(path, 'all_files'): 
      continue 
     folder = folder.strip(path) 
     extension = os.path.splitext(os.path.splitext(filename)[0])[-1].lower() 
     if extension in extensions: 
      infilename = os.path.join(path, folder, filename) 
      newname = os.path.join(path, 'all_files', "{}-{}".format(folder.strip('./'), filename.replace('.csv.bz2', '.csv'))) 
      os.rename(infilename, newname) 
+0

안녕하세요, 스탠. 고마워요. 모든 파일은 같은 폴더에 있어야합니다. 이것이 여기에 해당하는지 여부가 확실하지 않은 경우 – Mamba

+0

이름이 무엇 이길 원하십니까? 아마'2012-01-01-employee.csv' 등? –

+0

예, 좋을 것입니다 – Mamba

-1

당신이 질문에 명시된 모든 것이 사실이라면, 당신의 문제에 대한 정직 해결책이 될 것입니다 다음 : 나는 당신의 문제 문을 시뮬레이션하고 위의 확인

import os 
import re 

path = 'dir/' 

# os.mkdir(path+'all_files') 
os.system('ls '+path+' > '+path+'dirList.txt'); 

with open(path+'dirList.txt') as f: 
    for line in f: 
     if re.match('[1-9]',line): 
      os.system('mv '+path+line.strip()+'/employee.csv.bz2 ' 
         +path+'all_files/'+line.strip()+'-employee.csv') 

os.system('rm '+path+'dirList.txt') # Optional delete the temporary file 

코드이며, Mac 및 Ubuntu와 같은 유닉스 및 리눅스 기반 OS 인에 특정한 입니다.

+0

문자열을 함께 추가하는 것은 나쁜 습관이고, 명령은 파이썬에 존재하기 때문에 리눅스 터미널을 사용할 필요가 없습니다. –

관련 문제