2012-11-18 2 views
0

xlwt을 사용하여 스프레드 시트를 저장할 때 사용되는 파일 이름을 자동화하고 싶습니다. 파이썬 프로그램이 실행중인 폴더에 Data이라는 하위 디렉토리가 있다고 가정 해보십시오. 프로그램에서 해당 폴더의 파일 수를 계산하도록합니다 (# = n). 그런 다음 파일 이름은 (n + 1)로 끝나야합니다. 폴더에 파일이 0 개있는 경우 파일 이름은 Trial_1.xls이어야합니다. 이 파일은 해당 하위 디렉토리에 저장해야합니다.파이썬 자동화 파일 이름

나는 다음 알고

import xlwt, os, os.path 
n = len([name for name in os.listdir('.') if os.path.isfile(name)]) 

카운트 같은 폴더에있는 파일의 수를.

a = n + 1 
filename = "Trial_" + "a" + ".xls" 
book.save(filename) 

이렇게하면 파일 이름이 동일한 폴더에 저장됩니다.

제 질문은 어떻게 이것을 하위 디렉토리로 확장합니까? 감사.

답변

2

os.listdir('.').은 파일이 실행되는 디렉토리를 가리 킵니다. .을 관심있는 하위 디렉토리를 가리 키도록 변경하십시오.

파일 시스템의 루트에서 전체 경로 이름을 제공해야합니다. 그렇지 않으면 스크립트가 실행되는 디렉토리와 관련됩니다. 이것은 당신이 원하는 것이 아닐 수도 있습니다. 특히 다른 프로그램에서 하위 디렉토리를 참조해야하는 경우.

filename 변수의 전체 경로도 제공해야합니다. 하위 디렉토리가 포함됩니다.

인생을 더 쉽게 만들려면 변수에 대한 전체 경로를 설정하고 필요할 때 참조하십시오.

TARGET_DIR = '/home/me/projects/data/' 
n = sum(1 for f in os.listdir(TARGET_DIR) if os.path.isfile(os.path.join(TARGET_DIR, f))) 
new_name = "{}Trial_{}.xls".format(TARGET_DIR,n+1) 
+0

'os.listdir' 전체 경로를 제공하지 않습니다. 기본 이름 만. – jdi

+0

그래, 고정하고 그것을 이해하지 않고 조금 더 좋게했다. –

+0

완벽하게 작동합니다! TARGET_DIR = 'data /'는 같은 폴더에 있기 때문에 (원래 질문에서 불분명하다고 생각합니다). 감사. 또한 파일 이름을 만든 방법이 .format()에서 훨씬 효율적임을 알았습니다. 어떻게 사용합니까? 전에는 본 적이 없어요. – Jey

0

당신이 Burhan Khalid의 답변을 "완벽하게 작동합니다!" 너는 그것을 받아 들여야한다.

숫자를 계산하는 다른 방법을 지적하고자했습니다. 당신이하고있는 방식은 효과가 있습니다 만, 만약 우리가 당신이 모래알 같은 곡물을 세고 있다고 상상한다면, 너무 많은 기억을 사용하게 될 것입니다. 다음은이 수를 얻을 수있는 직접적인 방법입니다 : 모든 자격을 갖춘 이름

n = sum(1 for name in os.listdir('.') if os.path.isfile(name)) 

을, 우리는 하나를 얻고,이 모든 일이의는 sum()에 불만을 품고 당신은 당신의 수를 얻을.

이 코드는 목록 이해 대신 "생성자 식"을 사용합니다. 위의 코드는 목록을 작성하고 길이를 늘린 다음 목록을 삭제하는 대신 반복 계산을 수행하여 sum()이 계산을 반복합니다.

다소 지저분하지만 사용할 수있는 바로 가기가 있습니다. sum()은 부울 값을 허용하고 True을 1로, False을 0으로 처리합니다.

이것은 설명을 넣지 않고서는 사용하지 않을만큼 충분히 까다 롭습니다. 하지만 이것이 파이썬에서 가장 빠르고 효율적인 방법이라고 생각합니다.

+0

에 대한 설명서를 참조하십시오. "수락"기능이 있다는 것을 깨닫지 못했습니다. 나는이 사이트가 처음이다. 완료 : – Jey

+0

@Jey [질문하는 방법 FAQ 항목] (http://stackoverflow.com/faq#howtoask)을 읽어야합니다. –

3

당신은 실제로 glob를 원하는 :

from glob import glob  

DIR = 'some/where/' 
existing_files = glob(DIR + '*.xls') 
filename = DIR + 'stuff--%d--stuff.xls' % (len(existing_files) + 1) 
+0

glob는 확장 패턴에서 파일을 즉시 해결하기 때문에'os.listdir'을 사용하는 것보다 훨씬 적합합니다. 그러나 나는 결과 목록을 훨씬 더 작게 (basename 만) 만들고 DIR과 새로운 basename을 합치기 위해'os.path.join'을 사용하기 위해'os.glob1 (DIR, '* .xls')'를 사용할 것을 권한다. – jdi