Python Forum
Attribute Error for Rename / Replace
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Attribute Error for Rename / Replace
#1
Hello Everyone -

I'm very new to python and I have a use case where I need to rename .zip files and then extract. I think I have the extraction part down (it is commented out for the time being) but I am having trouble with the rename portion. My directory has files that look like this: 20191210.092030_Monthly_Service_Cost_12-10-2019-02-17

Ultimately, I would like my zip file to look like MonthlyServiceCost.zip ... Feedback would be greatly appreciated!

import os, zipfile

#Parameters 

dir_name = 'C:\\Users\\m88576\\Desktop\\UnzipDirectory' # Defines target directory
extension = ".zip" #Defines target extension (zip)
os.chdir(dir_name) # change working dir to target directory

#Rename Zip Files

file_list = os.listdir(dir_name) #creates variable
print(file_list) #List all files in the directory before extract

file_list_rename = file_list.replace('.','').replace('1', '').replace('2', '').replace('3', '').replace('4', '').replace('5', '').replace('6', '').replace('7', '').replace('8', '').replace('9', '').replace('0', '').replace('_', '').replace('-','')
os.rename(file_list, file_list_rename)

#os.rename(file_list, file_list.strip('123456789_'))#removes numerical and non-string characters

#Unzip Files

#for item in os.listdir(dir_name): # loop through items in dir
   # if item.endswith(extension): # check for ".zip" extension
     #   file_name = os.path.abspath(item) # get full path of files
     #   zip_ref = zipfile.ZipFile(file_name) # create zipfile object
     #   zip_ref.extractall(dir_name) # extract file to dir
     #   zip_ref.close() # close file
     #   os.remove(file_name) # delete zipped file

print(file_list) #List all files in the directory after extract
Error:
Traceback (most recent call last): File "C:\Users\m88576\Desktop\UnzipDirectory\TargetUnzip.py", line 14, in <module> file_list_rename = file_list.replace('.','').replace('1', '').replace('2', '').replace('3', '').replace('4', '').replace('5', '').replace('6', '').replace('7', '').replace('8', '').replace('9', '').replace('0', '').replace('_', '').replace('-','') AttributeError: 'list' object has no attribute 'replace'
Reply
#2
Well, file_list is a list, while replace is a method of strings. You can't use a string method directly on a list of strings, you have to loop through the list and apply it to each of the strings individually.

You might always want to look at the maketrans method of strings.
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures
Reply
#3
(Jan-06-2020, 05:18 PM)warden89 Wrote: . My directory has files that look like this: 20191210.092030_Monthly_Service_Cost_12-10-2019-02-17
Ultimately, I would like my zip file to look like MonthlyServiceCost.zip
A would write regex to clean it up first,then add .zip.
Example.
>>> import re 
>>> 
>>> s = '20191210.092030_Monthly_Service_Cost_12-10-2019-02-17'
>>> r = re.search(r'_(.*[a-zA-Z])', s)
>>> result = r.group(1).replace('_', '')
>>> print(f'{result}.zip')
MonthlyServiceCost.zip
>>> 
>>> s = '9999.777.44_Monthly_Service_Cost_111-777_999.44'
>>> r = re.search(r'_(.*[a-zA-Z])', s)
>>> result = r.group(1).replace('_', '')
>>> print(f'{result}.zip')
MonthlyServiceCost.zip
Reply
#4
Hi - thanks for the recommendation - it worked! Some of the zipped files in question have periods "." in the file name - is it possible to remove them without messing up the file association? I imagine I would need to add an if/else statement of some kind?

import os, zipfile, string

#Parameters

dir_name = 'C:\\Users\\m88576\\Desktop\\UnzipDirectory' # Defines target directory
extension = ".zip" #Defines target extension (zip)
os.chdir(dir_name) # change working dir to target directory

#Rename Zip Files

file_list = os.listdir(dir_name)

def rename_files(): #Obtain the file names from the folder
    for file_name in file_list: #Rename the files inside of the folder.
        os.rename(file_name, file_name.translate(str.maketrans('','','0123456789_-')))
rename_files()
Output:
['.MonthlyServiceCost.zip', 'GLBAT.zip', 'UnitCostReport.zip']
Reply
#5
Just playing with string .split method Smile . It assumes that needed part is between first and last underscore (as provided in example).

>>> s = '20191210.092030_Monthly_Service_Cost_12-10-2019-02-17'
>>> f"{''.join(s.split('_', maxsplit=1)[1].rsplit('_', maxsplit=1)[0].split('_'))}.zip"
'MonthlyServiceCost.zip'
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy

Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Reply
#6
(Jan-07-2020, 08:22 AM)perfringo Wrote: Just playing with string .split method Smile . It assumes that needed part is between first and last underscore (as provided in example).

I'm not sure how to incorporate this into the code I already have - apologies I am very new to this. If I can get it working though, it looks like it might be a better solution then what I commented out above it.

import os, zipfile, string, re
from shutil import copyfile

###Parameters ###

dir_name = 'C:\\Users\\m88576\\Desktop\\UnzipDirectory' # Defines target directory
extension = ".zip" #Defines target extension (zip)
os.chdir(dir_name) # change working dir to target directory

###Rename Zip Files###

file_list = os.listdir(dir_name)

def rename_files(): #Obtain the file names from the folder
    for file_name in file_list: #Rename the files inside of the folder.
        #os.rename(file_name, file_name.translate(str.maketrans('','','0123456789_-'))) #Removes characters noted to the left
        f"{''.join(file_list.split('_', maxsplit=1)[1].rsplit('_', maxsplit=1)[0].split('_'))}.zip"
rename_files()
Error:
'list' object has no attribute 'split'
Reply
#7
Hi All -

I am writing a script that manipulate multiple a .ZIP file - right now my script renames the zip file, unzips the file directory and then deletes the zip file. What I am really struggling with is renaming the file within the now unzipped directory. I have multiple, newly unzipped folders all with files called "report.csv" within... These files need to be renamed based on their parent folder name. I have no idea how to do that.

Ex:
20191210.092030__ITFM_12-10-2019-02_17.zip --> ITFM.zip ...
C:\Users\m88576\Desktop\UnzipDirectory\ITFM\report.csv --> C:\Users\m88576\Desktop\UnzipDirectory\ITFM.csv

20191210.092030_Monthly_Service_Cost_12-10-2019-02-17.zip --> MonthlyServiceCost.zip ...
C:\Users\m88576\Desktop\UnzipDirectory\MonthlyServiceCost\report.csv --> C:\Users\m88576\Desktop\UnzipDirectory\MonthlyServiceCost.csv

TL;DR: I need the file (report.csv) in question to be named after its parent folder and be moved one folder up
Any advice or guidance would be extremely appreciated. Thanks!

My code:

import os, zipfile, string, re
from shutil import copyfile

###Parameters ###

dir_name = 'C:\\Users\\m88576\\Desktop\\UnzipDirectory' # Defines target directory
extension = ".zip" #Defines target extension (zip)
os.chdir(dir_name) # change working dir to target directory
print('1...Setting Parameters...')

###Rename Zip Files###

file_list = os.listdir(dir_name)

def rename_files(): #Obtain the file names from the folder
    for file_name in file_list: #Rename the files inside of the folder.
        os.rename(file_name, file_name.translate(str.maketrans('','','0123456789_-'))) #Removes characters noted to the left
rename_files()
print("2...Zip Files Renamed...")

##Unzip & Rename File Directories###

filename = ['report.csv']

for item in os.listdir(dir_name):  # loop through items in dir
    if item.endswith(".zip"):  # check for ".zip" extension
        file_path = os.path.join(dir_name, item)  # get zip file path
        with zipfile.ZipFile(file_path) as zf:  # open the zip file
            for target_file in filename:  # loop through the list of files to extract
                if target_file in zf.namelist():  # check if the file exists in the archive
                    target_name = os.path.splitext(file_path)[0] # generate the desired output name:
                    target_path = dir_name  # output path
                    zf.extractall(target_name) # extract file to dir
print("3...Files Unzipped...")                    

###Delete Zip Files###

for item in os.listdir(dir_name):
        if item.endswith(".zip"):
            os.remove(item)
print("4...Zip files deleted...")                               
                   
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Error: audioio has no attribute 'AudioOut' netwrok 3 592 Oct-22-2023, 05:53 PM
Last Post: netwrok
  cx_oracle Error - AttributeError: 'function' object has no attribute 'cursor' birajdarmm 1 2,209 Apr-15-2023, 05:17 PM
Last Post: deanhystad
  Getting 'NoneType' object has no attribute 'find' error when WebScraping with BS Franky77 2 5,163 Aug-17-2021, 05:24 PM
Last Post: Franky77
  Attribute Error received not understood (Please Help) crocolicious 5 2,611 Jun-19-2021, 08:45 PM
Last Post: crocolicious
  error in scapy attribute 'haslayer' evilcode1 5 6,433 Mar-02-2021, 11:19 AM
Last Post: evilcode1
  attribute error instead of correct output MaartenRo 2 2,147 Aug-28-2020, 10:22 AM
Last Post: Larz60+
  attribute error stumped on how to fix it. hank4eva 7 4,596 Aug-11-2020, 04:47 AM
Last Post: hank4eva
  Attribute Error - trying to create a pixel array out of PNG files The_Sarco 1 1,969 Apr-29-2020, 07:10 PM
Last Post: deanhystad
  Reading DBF files from Amazon s3 throwing error - 'int' object has no attribute 'isa abeesm 1 2,856 Sep-22-2019, 05:49 PM
Last Post: ndc85430
  Attribute Error Adit99 5 3,579 Aug-18-2019, 11:44 AM
Last Post: ichabod801

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020