Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I replace a file if already exists in the destination folder?

I just want to move a file from one folder to another (already know how to do that) and in the process check all the files in the destination folder and delete the files with the same name.

I have two folders /src and /dst.

In folder /src I have:

  • 'access.log.1.txt'

and in folder /dst :

  • 'access.log.1.20171110_115840565311.txt'
  • 'access.log.1.20171110_115940565311.txt'
  • 'access.log.2.20171110_115940565311.txt'

When I move the file in /src to /dst I want to delete all the files named as the file in /src excluding the datetime() extension in the files of /dst.

So the /dst folder should look like this after the execution:

  • 'access.log.1.txt'
  • 'access.log.2.20171110_115940565311.txt'

This is the code I have to move files from /src to /dst:

entrada = ENTRADA   #This 3 are the paths to the folders  /src
salida = SALIDA     #                                     /dst
error=ERROR         #                                     /err
files=glob.glob(entrada)
for file in files:
   fichero=open(file,encoding='utf-8')
   try:
       for line in fichero:
          la=line.replace("-","")
          li=la.replace('”'+chr(10),'')
          li=li.split('"')
          line_DB(li)
       fichero.close()
       if TIME_RENAME=='True':
          execution=str(datetime.now())
          execution=execution.replace('.','')
          execution=execution.replace('-','')
          execution=execution.replace(' ','_')
          execution_time=execution.replace(':','')
          base = os.path.splitext(file)[0]
          base=base+'.'+execution_time+'.txt'
          os.rename(file,base)
          file=base
       else:
          print('Hello')
          #This is where I need the code

       shutil.move(file, salida)
       con.commit()
   except:
       logging.error(sys.exc_info())
       print(sys.exc_info())
       fichero.close()
       shutil.move(file, error)

Anyone could help me?

Thanks!!

like image 623
Miguel Avatar asked Oct 28 '22 23:10

Miguel


1 Answers

Sandip's answer should work, but if you specifically want it the way you've stated in your question, this could work:

import os

src_filename = "access.log.1.txt"
dst_dir = "test"

for filename in os.listdir(dst_dir):

    # Filter files based on number of . in filename
    if filename.count(".") < 4:
        continue

    # We need to remove the datetime extension before comparing with our filename
    filename_tokens = filename.split(".")  # List of words separated by . in the filename
    print "Tokens:", filename_tokens

    # Keep only indexes 0, 1, 2 and 4 (exclude index 3, which is the datetime-string)
    datetime_string = filename_tokens.pop(3)  # pop() also removes the datetime-string
    print "Datetime:", datetime_string
    dst_filename = ".".join(filename_tokens)
    print "Destination filename:", dst_filename

    # Check if the destination filename now matches our source filename
    if dst_filename == src_filename:
        # Get full path of file to be deleted
        filepath = os.path.join(dst_dir, filename)
        # Delete it
        print "Deleting:", filepath
        os.remove(filepath)
    print "----------------------"

Note that this approach assumes that all your destination file names looks like they do in your question, i.e. that all of them have 4 periods (.) and that the datetime string is always between your third and fourth period.

like image 139
Plasma Avatar answered Nov 15 '22 05:11

Plasma