>source

다음과 같은 구조가 있습니다.

Folder1
      ZZ-20201201-XX.zip
Folder2
      XX-20201201-XX.zip
      XX-20201202-XX.zip
Folder3
      YY-20201201-XX.zip
      YY-20201202-XX.zip

아래 코드를 사용하여 Folder1, Folder2Folder3 3 개의 폴더 안에있는 압축 파일을 직접 압축 해제합니다. 그래서 나는 이것을 받는다 :

Folder1
      ZZ-.txt
Folder2
      XX-.txt
     
Folder3
      YY.txt

보시다시피 파일의 압축이 풀리면 파일의 날짜가 손실되므로 폴더에 2 개의 압축 파일이 포함 된 경우 동일한 이름을 갖게되어 파일이 다시 작성됩니다. 이제 압축이 풀린 파일에 압축 파일의 날짜를 추가하고 싶습니다. 어떻게 할 수 있습니까?

import fnmatch
pattern = '*.zip'
for root, dirs, files in os.walk(my_files): 
    for filename in fnmatch.filter(files, pattern): 
        path = os.path.join(root, filename)
        date_zipped_file = re.search('-(.\d+)-', filename).group(1) #<-- this is the date of the zipped files and I want this to be included in the name of the unzipped files once they get unzipped.
        # Store the new directory so that it can be recreated
        new_dir = os.path.normpath(os.path.join(os.path.relpath(path, start=my_files), ".."))
        # Join your target directory with newly created directory
        new = os.path.join(counter_part, new_dir)
        # Create those folders, works even with nested folders
        if (not os.path.exists(new)):
            os.makedirs(new)
        zipfile.ZipFile(path).extractall(new)

내가 원하는 결과 :

Folder1
      ZZ-20201201.txt
Folder2
      XX-20201201.txt
      XX-20201202.txt
Folder3
      YY-20201201.txt
      XX-20201202.txt

  • 답변 # 1

    각 폴더의 압축을 푼 후 파일 이름을 바꿀 수 있습니다. 이 같은:

    #get all files in that unzipped folder
    files = os.listdir(path)
    #rename all files in that dir
    for file in files:
        filesplit = os.path.splitext(os.path.basename(file))
        os.rename(os.path.join(path, file), os.path.join(path, filesplit[0]+'_'+date_zipped_file+filesplit[1]))
    
    

    하지만 실제로 이미 date 이름에. 따라서 파일의 이름이 이미 바뀌 었는지 확인해야합니다. 유지함으로써 list 파일 이름 또는 간단한 regex '_'와 '.'사이의 8 자리 문자열을 찾습니다. text_20201207.txt.

    #get all files in that unzipped folder
        files = os.listdir(path)
        
        #rename all files in that dir
        for file in files:
            filesplit = os.path.splitext(os.path.basename(file))
            if not re.search(r'_\d{8}.', file):
                os.rename(os.path.join(path, file), os.path.join(path, filesplit[0]+'_'+date_zipped_file+filesplit[1]))
    
    

    최종 솔루션은 다음과 같습니다.

    import fnmatch
    pattern = '*.zip'
    for root, dirs, files in os.walk(my_files): 
        for filename in fnmatch.filter(files, pattern): 
            path = os.path.join(root, filename)
            date_zipped_file = re.search('-(.\d+)-', filename).group(1) #<-- this is the date of the zipped files and I want this to be included in the name of the unzipped files once they get unzipped.
            # Store the new directory so that it can be recreated
            new_dir = os.path.normpath(os.path.join(os.path.relpath(path, start=my_files), ".."))
            # Join your target directory with newly created directory
            new = os.path.join(counter_part, new_dir)
            # Create those folders, works even with nested folders
            if (not os.path.exists(new)):
                os.makedirs(new)
            zipfile.ZipFile(path).extractall(new) 
            #get all files in that unzipped folder
            files = os.listdir(new)
        
            #rename all files in that dir
            for file in files:
                filesplit = os.path.splitext(os.path.basename(file))
                if not re.search(r'_\d{8}.', file):
                    os.rename(os.path.join(new, file), os.path.join(new, filesplit[0]+'_'+date_zipped_file+filesplit[1]))
    
    

관련 자료

  • 이전 docker - IdentityServer4 인증/http 오류가있는 Azure 웹앱 컨테이너에 net Core 3 Linux 컨테이너 배포
  • 다음 매우 간단한 C Windows API 프로그램에서 오류 126 모듈을 찾을 수 없습니다