Python - How to create a csv, if csv already exists [duplicate] - python
Does Python have any built-in functionality to add a number to a filename if it already exists?
My idea is that it would work the way certain OS's work - if a file is output to a directory where a file of that name already exists, it would append a number or increment it.
I.e: if "file.pdf" exists it will create "file2.pdf", and next time "file3.pdf".
I ended up writing my own simple function for this. Primitive, but gets the job done:
def uniquify(path):
filename, extension = os.path.splitext(path)
counter = 1
while os.path.exists(path):
path = filename + " (" + str(counter) + ")" + extension
counter += 1
return path
In a way, Python has this functionality built into the tempfile module. Unfortunately, you have to tap into a private global variable, tempfile._name_sequence. This means that officially, tempfile makes no guarantee that in future versions _name_sequence even exists -- it is an implementation detail.
But if you are okay with using it anyway, this shows how you can create uniquely named files of the form file#.pdf in a specified directory such as /tmp:
import tempfile
import itertools as IT
import os
def uniquify(path, sep = ''):
def name_sequence():
count = IT.count()
yield ''
while True:
yield '{s}{n:d}'.format(s = sep, n = next(count))
orig = tempfile._name_sequence
with tempfile._once_lock:
tempfile._name_sequence = name_sequence()
path = os.path.normpath(path)
dirname, basename = os.path.split(path)
filename, ext = os.path.splitext(basename)
fd, filename = tempfile.mkstemp(dir = dirname, prefix = filename, suffix = ext)
tempfile._name_sequence = orig
return filename
print(uniquify('/tmp/file.pdf'))
I was trying to implement the same thing in my project but #unutbu's answer seemed too 'heavy' for my needs so I came up with following code finally:
import os
index = ''
while True:
try:
os.makedirs('../hi'+index)
break
except WindowsError:
if index:
index = '('+str(int(index[1:-1])+1)+')' # Append 1 to number in brackets
else:
index = '(1)'
pass # Go and try create file again
Just in case someone stumbled upon this and requires something simpler.
If all files being numbered isn't a problem, and you know beforehand the name of the file to be written, you could simply do:
import os
counter = 0
filename = "file{}.pdf"
while os.path.isfile(filename.format(counter)):
counter += 1
filename = filename.format(counter)
recently I encountered the same thing and here is my approach:
import os
file_name = "file_name.txt"
if os.path.isfile(file_name):
expand = 1
while True:
expand += 1
new_file_name = file_name.split(".txt")[0] + str(expand) + ".txt"
if os.path.isfile(new_file_name):
continue
else:
file_name = new_file_name
break
Let's say you already have those files:
This function generates the next available non-already-existing filename, by adding a _1, _2, _3, ... suffix before the extension if necessary:
import os
def nextnonexistent(f):
fnew = f
root, ext = os.path.splitext(f)
i = 0
while os.path.exists(fnew):
i += 1
fnew = '%s_%i%s' % (root, i, ext)
return fnew
print(nextnonexistent('foo.txt')) # foo_3.txt
print(nextnonexistent('bar.txt')) # bar_1.txt
print(nextnonexistent('baz.txt')) # baz.txt
Since the tempfile hack A) is a hack and B) still requires a decent amount of code anyway, I went with a manual implementation. You basically need:
A way to Safely create a file if and only if it does not exist (this is what the tempfile hack affords us).
A generator for filenames.
A wrapping function to hide the mess.
I defined a safe_open that can be used just like open:
def iter_incrementing_file_names(path):
"""
Iterate incrementing file names. Start with path and add " (n)" before the
extension, where n starts at 1 and increases.
:param path: Some path
:return: An iterator.
"""
yield path
prefix, ext = os.path.splitext(path)
for i in itertools.count(start=1, step=1):
yield prefix + ' ({0})'.format(i) + ext
def safe_open(path, mode):
"""
Open path, but if it already exists, add " (n)" before the extension,
where n is the first number found such that the file does not already
exist.
Returns an open file handle. Make sure to close!
:param path: Some file name.
:return: Open file handle... be sure to close!
"""
flags = os.O_CREAT | os.O_EXCL | os.O_WRONLY
if 'b' in mode and platform.system() == 'Windows':
flags |= os.O_BINARY
for filename in iter_incrementing_file_names(path):
try:
file_handle = os.open(filename, flags)
except OSError as e:
if e.errno == errno.EEXIST:
pass
else:
raise
else:
return os.fdopen(file_handle, mode)
# Example
with safe_open("some_file.txt", "w") as fh:
print("Hello", file=fh)
I haven't tested this yet but it should work, iterating over possible filenames until the file in question does not exist at which point it breaks.
def increment_filename(fn):
fn, extension = os.path.splitext(path)
n = 1
yield fn + extension
for n in itertools.count(start=1, step=1)
yield '%s%d.%s' % (fn, n, extension)
for filename in increment_filename(original_filename):
if not os.isfile(filename):
break
This works for me.
The initial file name is 0.yml, if it exists, it will add one until meet the requirement
import os
import itertools
def increment_filename(file_name):
fid, extension = os.path.splitext(file_name)
yield fid + extension
for n in itertools.count(start=1, step=1):
new_id = int(fid) + n
yield "%s%s" % (new_id, extension)
def get_file_path():
target_file_path = None
for file_name in increment_filename("0.yml"):
file_path = os.path.join('/tmp', file_name)
if not os.path.isfile(file_path):
target_file_path = file_path
break
return target_file_path
import os
class Renamer():
def __init__(self, name):
self.extension = name.split('.')[-1]
self.name = name[:-len(self.extension)-1]
self.filename = self.name
def rename(self):
i = 1
if os.path.exists(self.filename+'.'+self.extension):
while os.path.exists(self.filename+'.'+self.extension):
self.filename = '{} ({})'.format(self.name,i)
i += 1
return self.filename+'.'+self.extension
I found that the os.path.exists() conditional function did what I needed. I'm using a dictionary-to-csv saving as an example, but the same logic could work for any file type:
import os
def smart_save(filename, dict):
od = filename + '_' # added underscore before number for clarity
for i in np.arange(0,500,1): # I set an arbitrary upper limit of 500
d = od + str(i)
if os.path.exists(d + '.csv'):
pass
else:
with open(d + '.csv', 'w') as f: #or any saving operation you need
for key in dict.keys():
f.write("%s,%s\n"%(key, dictionary[key]))
break
Note: this appends a number (starting at 0) to the file name by default, but it's easy to shift that around.
This function validates if the file name exists using regex expresion and recursion
def validate_outfile_name(input_path):
filename, extension = os.path.splitext(input_path)
if os.path.exists(input_path):
output_path = ""
pattern = '\([0-9]\)'
match = re.search(pattern, filename)
if match:
version = filename[match.start() + 1]
try: new_version = int(version) + 1
except: new_version = 1
output_path = f"{filename[:match.start()]}({new_version}){extension}"
output_path = validate_outfile_name(output_path)
else:
version = 1
output_path = f"{filename}({version}){extension}"
return output_path
else:
return input_path
I've implemented a similar solution with pathlib:
Create file-names that match the pattern path/<file-name>-\d\d.ext. Perhaps this solution can help...
import pathlib
from toolz import itertoolz as itz
def file_exists_add_number(path_file_name, digits=2):
pfn = pathlib.Path(path_file_name)
parent = pfn.parent # parent-dir of file
stem = pfn.stem # file-name w/o extension
suffix = pfn.suffix # NOTE: extension starts with '.' (dot)!
try:
# search for files ending with '-\d\d.ext'
last_file = itz.last(parent.glob(f"{stem}-{digits * '?'}{suffix}"))
except:
curr_no = 1
else:
curr_no = int(last_file.stem[-digits:]) + 1
# int to string and add leading zeros
curr_no = str(last_no).zfill(digits)
path_file_name = parent / f"{stem}-{curr_no}{suffix}"
return str(path_file_name)
Pls note: That solution starts at 01 and will only find file-pattern containing -\d\d!
def create_file():
counter = 0
filename = "file"
while os.path.isfile(f"dir/{filename}{counter}.txt"):
counter += 1
print(f"{filename}{counter}.txt")
A little bit later but there is still something like this should work properly, mb it will be useful for someone.
You can use built-in iterator to do this ( image downloader as example for you ):
def image_downloader():
image_url = 'some_image_url'
for count in range(10):
image_data = requests.get(image_url).content
with open(f'image_{count}.jpg', 'wb') as handler:
handler.write(image_data)
Files will increment properly. Result is:
image.jpg
image_0.jpg
image_1.jpg
image_2.jpg
image_3.jpg
image_4.jpg
image_5.jpg
image_6.jpg
image_7.jpg
image_8.jpg
image_9.jpg
Easy way for create new file if this name in your folder
if 'sample.xlsx' in os.listdir('testdir/'):
i = 2
while os.path.exists(f'testdir/sample ({i}).xlsx'):
i += 1
wb.save(filename=f"testdir/sample ({i}).xlsx")
else:
wb.save(filename=f"testdir/sample.xlsx")
Related
How to create a file with '01' if name exists?
Is there a specific argument in open() built-in function so that if the filename already exists, it creates a file by adding a number to its name ?? such that if "file.txt" exists, it automatically creates "file-01.txt" Or any other solution.!
No, I don't think there's something like this but you can do it yourself using os.path.isfile : import os filename = "yourFileName.txt" if os.path.isfile(filename): #check if filename exists in the directory filename = filename.split(".")[:-1] + "-01" + filename.split(".")[-1] with open(filename, "w+") as f: f.write(yourString)
I have found a solution, Thanks!! b = True c = 1 while b: f_name = 'Task-{:02.0f}.txt'.format(c) try: f = open(f_name,'x') b = False except FileExistsError: c += 1 f.close()
Something like this? import os if os.path.exists(filename): fileparts = filename.split('.') filename = fileparts[0] + '01.' for a in fileparts[1:]: filename += a
See what you think of this. ...this is what I use to do what you're looking for. It's the smallest way I found to solve the problem before, and is easy to wrap into a function: import os name = 'blah.txt' uniq_name = name while os.path.isfile(uniq_name): # if increment variable 'delta' isn't defined, make it 1. Otherwise increment delta = delta+1 if 'delta' in vars() else 1 uniq_name = f'{os.path.splitext(name)[0]}-{delta}{os.path.splitext(name)[1]}' # this you don't need - it's just equivalent to a 'touch' command to show # the output open(uniq_name, 'a').close()
traverse directory structure in python recursively without os.walk
I am trying to write a python2 function that will recursively traverse through the whole directory structure of a given directory, and print out the results. All without using os.walk This is what I have got so far: test_path = "/home/user/Developer/test" def scanning(sPath): output = os.path.join(sPath, 'output') if os.path.exists(output): with open(output) as file1: for line in file1: if line.startswith('Final value:'): print line else: for name in os.listdir(sPath): path = os.path.join(sPath, name) if os.path.isdir(path): print "'", name, "'" print_directory_contents(path) scanning(test_path) This is what I currently get, the script doesn't enter the new folder: ' test2' 'new_folder' The issue is that it does not go further down than one directory. I would also like to able to indicate visually what is a directory, and what is a file
Try this: import os test_path = "YOUR_DIRECTORY" def print_directory_contents(dir_path): for child in os.listdir(dir_path): path = os.path.join(dir_path, child) if os.path.isdir(path): print("FOLDER: " + "\t" + path) print_directory_contents(path) else: print("FILE: " + "\t" + path) print_directory_contents(test_path) I worked on windows, verify if still working on unix. Adapted from: http://codegists.com/snippet/python/print_directory_contentspy_skobnikoff_python
Try this out with recursion it is much simple and less code import os def getFiles(path="/var/log", files=[]): if os.path.isfile(path): return files.append(path) for item in os.listdir(path): item = os.path.join(path, item) if os.path.isfile(item): files.append(item) else: files = getFiles(item, files) return files for f in getFiles("/home/afouda/test", []): print(f)
Try using a recursive function, def lastline(fil): with open(fil) as f: for li in f.readlines(): if li.startswith("Final Value:"): print(li) ## If it still doesnt work try putting 'dirs=[]' here def lookforfiles(basepath): contents = os.listdir(basepath) dirs = [] i = 0 while i <= len(contents): i += 1 for n in contents: f = os.path.join(basepath, n) if os.path.isfile(f): lastline(f) print("\n\nfile %s" % n) elif os.path.isdir(f): print("Adding dir") if f in dirs: pass else: dirs.append(f) else: for x in dirs: print("dir %s" % x) lookforfiles(x) sorry if this doesn't fit your example precisely but I had a hard time understanding what you were trying to do.
This question is a duplicate of Print out the whole directory tree. TL;TR: Use os.listdir.
Move file to a folder or make a renamed copy if it exists in the destination folder
I have a piece of code i wrote for school: import os source = "/home/pi/lab" dest = os.environ["HOME"] for file in os.listdir(source): if file.endswith(".c") shutil.move(file,dest+"/c") elif file.endswith(".cpp") shutil.move(file,dest+"/cpp") elif file.endswith(".sh") shutil.move(file,dest+"/sh") what this code is doing is looking for files in a source directory and then if a certain extension is found the file is moved to that directory. This part works. If the file already exists in the destination folder of the same name add 1 at end of the file name, and before the extension and if they are multiples copies do "1++". Like this: test1.c,test2.c, test3.c I tried using os.isfile(filename) but this only looks at the source directory. and I get a true or false.
To test if the file exists in the destination folder you should os.path.join the dest folder with the file name import os import shutil source = "/home/pi/lab" dest = os.environ["HOME"] # Avoid using the reserved word 'file' for a variable - renamed it to 'filename' instead for filename in os.listdir(source): # os.path.splitext does exactly what its name suggests - split the name and extension of the file including the '.' name, extension = os.path.splitext(filename) if extension == ".c": dest_filename = os.path.join(dest, filename) if not os.path.isfile(dest_filename): # We copy the file as is shutil.copy(os.path.join(source, filename) , dest) else: # We rename the file with a number in the name incrementing the number until we find one that is not used. # This should be moved to a separate function to avoid code duplication when handling the different file extensions i = 0 dest_filename = os.path.join(dest, "%s%d%s" % (name, i, extension)) while os.path.isfile(dest_filename): i += 1 dest_filename = os.path.join(dest, "%s%d%s" % (name, i, extension)) shutil.copy(os.path.join(source, filename), dest_filename) elif extension == ".cpp" ... # Handle other extensions If you want to have put the renaming logic in a separate function using glob and re this is one way: import glob import re ... def rename_file(source_filename, source_ext): filename_pattern = os.path.join(dest, "%s[0-9]*%s" % (source_filename, source_ext)) # Contains file such as 'a1.c', 'a2.c', etc... existing_files = glob.glob(filename_pattern) regex = re.compile("%s([0-9]*)%s" % (source_filename, source_ext)) # Retrieve the max of the index used for this file using regex max_index = max([int(match.group(1)) for match in map(regex.search, existing_files) if match]) source_full_path = os.path.join(source, "%s%s" % (source_filename, source_ext)) # Rebuild the destination filename with the max index + 1 dest_full_path = os.path.join(dest, "%s%d%s" % (source_filename, (max_index + 1), source_ext)) shutil.copy(source_full_path, dest_full_path) ... # If the file already exists i.e. replace the while loop in the else statement rename_file(name, extension)
I din't test the code. But something like this should do the job:- i = 0 filename = "a.txt" while True: if os.isfile(filename): i+= 1 break if i: fname, ext = filename.split('.') filename = fname + str(i) + '.' + ext
Problem with file cleaning process?
I am working on very large file system. My task is to clean the system with some given parameters. Below program fragment can give a idea. import DirectoryWalker extentions_to_delete = list([".rar",".doc",".URL",".js",".EXE",".mht",".css",".txt", ".cache", ".xml"]) extentions_to_copy = list([".jpg",".BMP",".GIF",".jpeg",".gif",".bmp",".png",".JPG"]) dw = DirectoryWalker.DirectoryWalker("/media/08247451247443AA/home/crap/") def copy_advice(key, files): for ext in extentions_to_copy: if(ext == key): print str(len(files)) + " Files of type " + key + " should be coppied to the target folder." for file in files: copy_to = "/media/08247451247443AA/home/crap-pics/" moved = dw.move_file_to(file, copy_to, True) if not moved: print file + " : not moved" walks = dw.get_all_file_types() for key in DirectoryWalker.Walk.store.keys(): files = DirectoryWalker.Walk.store[key] copy_advice(key, files) In the DirectoryWalker following code is written. Walk is a simple class which have a store object. def get_all_file_types(self): extentions = [] for dirpath,dirnames,filenames in os.walk(self.dir_name): for file in filenames: extentions.append(Walk(dirpath +"/"+ file)) return extentions def move_file_to(self, file_path, copy_to, rename_if_exists= False): file_name = os.path.split(file_path)[1] target_file_name = copy_to + file_name; coppied = False if not os.path.isfile(target_file_name): coppied = True try: os.rename(file_path, target_file_name) except OSError: coppied = False print "Oops! Unable to rename : " + file_path + " to target : " + target_file_name if rename_if_exists: coppied = True file_name = "new_"+ file_name try: os.rename(file_path, target_file_name) except OSError: coppied = False print "Oops! Unable to rename : " + file_path + " to target : " + target_file_name return coppied The Walk class class Walk: store = dict([]) def __init__(self, filename): self.file_ext = os.path.splitext(filename)[-1] self.file_name = filename if not (Walk.store.has_key(self.file_ext)): Walk.store[self.file_ext] = list() Walk.store[self.file_ext].append(self.file_name) But when program executed, it only moves almost 10400 files. But manual calculation suggest, there should be 13400 files in the file system. Please let me know, what I am doing wrong? Update Solutions After a careful investigations, I come out with result that there are many ambiguous file names in the target file system and those files were missing.
To answer your question, why not start with a simpler piece of code to test? import os all_files = [] for root, dirs, files in os.walk('/media/08247451247443AA/home/crap/'): all_files.extend(files) print len(all_files) As a side note, could you replace the Walk class with a defaultdict?
After a careful investigations, I come out with result that there are many ambiguous file names in the target file system and those files were missing.
Extracting extension from filename in Python
Is there a function to extract the extension from a filename?
Use os.path.splitext: >>> import os >>> filename, file_extension = os.path.splitext('/path/to/somefile.ext') >>> filename '/path/to/somefile' >>> file_extension '.ext' Unlike most manual string-splitting attempts, os.path.splitext will correctly treat /a/b.c/d as having no extension instead of having extension .c/d, and it will treat .bashrc as having no extension instead of having extension .bashrc: >>> os.path.splitext('/a/b.c/d') ('/a/b.c/d', '') >>> os.path.splitext('.bashrc') ('.bashrc', '')
New in version 3.4. import pathlib print(pathlib.Path('yourPath.example').suffix) # '.example' print(pathlib.Path("hello/foo.bar.tar.gz").suffixes) # ['.bar', '.tar', '.gz'] I'm surprised no one has mentioned pathlib yet, pathlib IS awesome!
import os.path extension = os.path.splitext(filename)[1]
import os.path extension = os.path.splitext(filename)[1][1:] To get only the text of the extension, without the dot.
For simple use cases one option may be splitting from dot: >>> filename = "example.jpeg" >>> filename.split(".")[-1] 'jpeg' No error when file doesn't have an extension: >>> "filename".split(".")[-1] 'filename' But you must be careful: >>> "png".split(".")[-1] 'png' # But file doesn't have an extension Also will not work with hidden files in Unix systems: >>> ".bashrc".split(".")[-1] 'bashrc' # But this is not an extension For general use, prefer os.path.splitext
worth adding a lower in there so you don't find yourself wondering why the JPG's aren't showing up in your list. os.path.splitext(filename)[1][1:].strip().lower()
Any of the solutions above work, but on linux I have found that there is a newline at the end of the extension string which will prevent matches from succeeding. Add the strip() method to the end. For example: import os.path extension = os.path.splitext(filename)[1][1:].strip()
You can find some great stuff in pathlib module (available in python 3.x). import pathlib x = pathlib.PurePosixPath("C:\\Path\\To\\File\\myfile.txt").suffix print(x) # Output '.txt'
With splitext there are problems with files with double extension (e.g. file.tar.gz, file.tar.bz2, etc..) >>> fileName, fileExtension = os.path.splitext('/path/to/somefile.tar.gz') >>> fileExtension '.gz' but should be: .tar.gz The possible solutions are here
Although it is an old topic, but i wonder why there is none mentioning a very simple api of python called rpartition in this case: to get extension of a given file absolute path, you can simply type: filepath.rpartition('.')[-1] example: path = '/home/jersey/remote/data/test.csv' print path.rpartition('.')[-1] will give you: 'csv'
Just join all pathlib suffixes. >>> x = 'file/path/archive.tar.gz' >>> y = 'file/path/text.txt' >>> ''.join(pathlib.Path(x).suffixes) '.tar.gz' >>> ''.join(pathlib.Path(y).suffixes) '.txt'
Surprised this wasn't mentioned yet: import os fn = '/some/path/a.tar.gz' basename = os.path.basename(fn) # os independent Out[] a.tar.gz base = basename.split('.')[0] Out[] a ext = '.'.join(basename.split('.')[1:]) # <-- main part # if you want a leading '.', and if no result `None`: ext = '.' + ext if ext else None Out[] .tar.gz Benefits: Works as expected for anything I can think of No modules No regex Cross-platform Easily extendible (e.g. no leading dots for extension, only last part of extension) As function: def get_extension(filename): basename = os.path.basename(filename) # os independent ext = '.'.join(basename.split('.')[1:]) return '.' + ext if ext else None
You can use a split on a filename: f_extns = filename.split(".") print ("The extension of the file is : " + repr(f_extns[-1])) This does not require additional library
filename='ext.tar.gz' extension = filename[filename.rfind('.'):]
Extracting extension from filename in Python Python os module splitext() splitext() function splits the file path into a tuple having two values – root and extension. import os # unpacking the tuple file_name, file_extension = os.path.splitext("/Users/Username/abc.txt") print(file_name) print(file_extension) Get File Extension using Pathlib Module Pathlib module to get the file extension import pathlib pathlib.Path("/Users/pankaj/abc.txt").suffix #output:'.txt'
Even this question is already answered I'd add the solution in Regex. >>> import re >>> file_suffix = ".*(\..*)" >>> result = re.search(file_suffix, "somefile.ext") >>> result.group(1) '.ext'
This is a direct string representation techniques : I see a lot of solutions mentioned, but I think most are looking at split. Split however does it at every occurrence of "." . What you would rather be looking for is partition. string = "folder/to_path/filename.ext" extension = string.rpartition(".")[-1]
Another solution with right split: # to get extension only s = 'test.ext' if '.' in s: ext = s.rsplit('.', 1)[1] # or, to get file name and extension def split_filepath(s): """ get filename and extension from filepath filepath -> (filename, extension) """ if not '.' in s: return (s, '') r = s.rsplit('.', 1) return (r[0], r[1])
you can use following code to split file name and extension. import os.path filenamewithext = os.path.basename(filepath) filename, ext = os.path.splitext(filenamewithext) #print file name print(filename) #print file extension print(ext)
A true one-liner, if you like regex. And it doesn't matter even if you have additional "." in the middle import re file_ext = re.search(r"\.([^.]+)$", filename).group(1) See here for the result: Click Here
Well , i know im late that's my simple solution file = '/foo/bar/whatever.ext' extension = file.split('.')[-1] print(extension) #output will be ext
try this: files = ['file.jpeg','file.tar.gz','file.png','file.foo.bar','file.etc'] pen_ext = ['foo', 'tar', 'bar', 'etc'] for file in files: #1 if (file.split(".")[-2] in pen_ext): #2 ext = file.split(".")[-2]+"."+file.split(".")[-1]#3 else: ext = file.split(".")[-1] #4 print (ext) #5 get all file name inside the list splitting file name and check the penultimate extension, is it in the pen_ext list or not? if yes then join it with the last extension and set it as the file's extension if not then just put the last extension as the file's extension and then check it out
You can use endswith to identify the file extension in python like bellow example for file in os.listdir(): if file.endswith('.csv'): df1 =pd.read_csv(file) frames.append(df1) result = pd.concat(frames)
For funsies... just collect the extensions in a dict, and track all of them in a folder. Then just pull the extensions you want. import os search = {} for f in os.listdir(os.getcwd()): fn, fe = os.path.splitext(f) try: search[fe].append(f) except: search[fe]=[f,] extensions = ('.png','.jpg') for ex in extensions: found = search.get(ex,'') if found: print(found)
This method will require a dictonary, list, or set. you can just use ".endswith" using built in string methods. This will search for name in list at end of file and can be done with just str.endswith(fileName[index]). This is more for getting and comparing extensions. https://docs.python.org/3/library/stdtypes.html#string-methods Example 1: dictonary = {0:".tar.gz", 1:".txt", 2:".exe", 3:".js", 4:".java", 5:".python", 6:".ruby",7:".c", 8:".bash", 9:".ps1", 10:".html", 11:".html5", 12:".css", 13:".json", 14:".abc"} for x in dictonary.values(): str = "file" + x str.endswith(x, str.index("."), len(str)) Example 2: set1 = {".tar.gz", ".txt", ".exe", ".js", ".java", ".python", ".ruby", ".c", ".bash", ".ps1", ".html", ".html5", ".css", ".json", ".abc"} for x in set1: str = "file" + x str.endswith(x, str.index("."), len(str)) Example 3: fileName = [".tar.gz", ".txt", ".exe", ".js", ".java", ".python", ".ruby", ".c", ".bash", ".ps1", ".html", ".html5", ".css", ".json", ".abc"]; for x in range(0, len(fileName)): str = "file" + fileName[x] str.endswith(fileName[x], str.index("."), len(str)) Example 4 fileName = [".tar.gz", ".txt", ".exe", ".js", ".java", ".python", ".ruby", ".c", ".bash", ".ps1", ".html", ".html5", ".css", ".json", ".abc"]; str = "file.txt" str.endswith(fileName[1], str.index("."), len(str)) Examples 5, 6, 7 with output Example 8 fileName = [".tar.gz", ".txt", ".exe", ".js", ".java", ".python", ".ruby", ".c", ".bash", ".ps1", ".html", ".html5", ".css", ".json", ".abc"]; exts = [] str = "file.txt" for x in range(0, len(x)): if str.endswith(fileName[1]) == 1: exts += [x]
The easiest way to get is to use mimtypes, below is the example: import mimetypes mt = mimetypes.guess_type("file name") file_extension = mt[0] print(file_extension)
Here if you want to extract the last file extension if it has multiple class functions: def listdir(self, filepath): return os.listdir(filepath) func = functions() os.chdir("C:\\Users\Asus-pc\Downloads") #absolute path, change this to your directory current_dir = os.getcwd() for i in range(len(func.listdir(current_dir))): #i is set to numbers of files and directories on path directory if os.path.isfile((func.listdir(current_dir))[i]): #check if it is a file fileName = func.listdir(current_dir)[i] #put the current filename into a variable rev_fileName = fileName[::-1] #reverse the filename currentFileExtension = rev_fileName[:rev_fileName.index('.')][::-1] #extract from beginning until before . print(currentFileExtension) #output can be mp3,pdf,ini,exe, depends on the file on your absolute directory Output is mp3, even works if has only 1 extension name
I'm definitely late to the party, but in case anyone wanted to achieve this without the use of another library: file_path = "example_tar.tar.gz" file_name, file_ext = [file_path if "." not in file_path else file_path.split(".")[0], "" if "." not in file_path else file_path[file_path.find(".") + 1:]] print(file_name, file_ext) The 2nd line is basically just the following code but crammed into one line: def name_and_ext(file_path): if "." not in file_path: file_name = file_path else: file_name = file_path.split(".")[0] if "." not in file_path: file_ext = "" else: file_ext = file_path[file_path.find(".") + 1:] return [file_name, file_ext] Even though this works, it might not work will all types of files, specifically .zshrc, I would recomment using os's os.path.splitext function, example below: import os file_path = "example.tar.gz" file_name, file_ext = os.path.splitext(file_path) print(file_name, file_ext) Cheers :)
# try this, it works for anything, any length of extension # e.g www.google.com/downloads/file1.gz.rs -> .gz.rs import os.path class LinkChecker: #staticmethod def get_link_extension(link: str)->str: if link is None or link == "": return "" else: paths = os.path.splitext(link) ext = paths[1] new_link = paths[0] if ext != "": return LinkChecker.get_link_extension(new_link) + ext else: return ""
def NewFileName(fichier): cpt = 0 fic , *ext = fichier.split('.') ext = '.'.join(ext) while os.path.isfile(fichier): cpt += 1 fichier = '{0}-({1}).{2}'.format(fic, cpt, ext) return fichier