How do I create a incrementing filename in Python?

后端 未结 12 1971
终归单人心
终归单人心 2020-11-28 05:45

I\'m creating a program that will create a file and save it to the directory with the filename sample.xml. Once the file is saved when i try to run the program again it over

相关标签:
12条回答
  • 2020-11-28 06:14

    I would iterate through sample[int].xml for example and grab the next available name that is not used by a file or directory.

    import os
    
    i = 0
    while os.path.exists("sample%s.xml" % i):
        i += 1
    
    fh = open("sample%s.xml" % i, "w")
    ....
    

    That should give you sample0.xml initially, then sample1.xml, etc.

    Note that the relative file notation by default relates to the file directory/folder you run the code from. Use absolute paths if necessary. Use os.getcwd() to read your current dir and os.chdir(path_to_dir) to set a new current dir.

    0 讨论(0)
  • 2020-11-28 06:15

    Another solution that avoids the use of while loop is to use os.listdir() function which returns a list of all the files and directories contained in a directory whose path is taken as an argument.

    To answer the example in the question, supposing that the directory you are working in only contains "sample_i.xlm" files indexed starting at 0, you can easily obtain the next index for the new file with the following code.

    import os
    
    new_index = len(os.listdir('path_to_file_containing_only_sample_i_files'))
    new_file = open('path_to_file_containing_only_sample_i_files/sample_%s.xml' % new_index, 'w')
    
    0 讨论(0)
  • 2020-11-28 06:15

    I needed to do something similar, but for output directories in a data processing pipeline. I was inspired by Vorticity's answer, but added use of regex to grab the trailing number. This method continues to increment the last directory, even if intermediate numbered output directories are deleted. It also adds leading zeros so the names will sort alphabetically (i.e. width 3 gives 001 etc.)

    def get_unique_dir(path, width=3):
        # if it doesn't exist, create
        if not os.path.isdir(path):
            log.debug("Creating new directory - {}".format(path))
            os.makedirs(path)
            return path
    
        # if it's empty, use
        if not os.listdir(path):
            log.debug("Using empty directory - {}".format(path))
            return path
    
        # otherwise, increment the highest number folder in the series
    
        def get_trailing_number(search_text):
            serch_obj = re.search(r"([0-9]+)$", search_text)
            if not serch_obj:
                return 0
            else:
                return int(serch_obj.group(1))
    
        dirs = glob(path + "*")
        num_list = sorted([get_trailing_number(d) for d in dirs])
        highest_num = num_list[-1]
        next_num = highest_num + 1
        new_path = "{0}_{1:0>{2}}".format(path, next_num, width)
    
        log.debug("Creating new incremented directory - {}".format(new_path))
        os.makedirs(new_path)
        return new_path
    
    get_unique_dir("output")
    
    0 讨论(0)
  • 2020-11-28 06:17

    Here is one more example. Code tests whether a file exists in the directory or not if exist it does increment in the last index of the file name and saves The typical file name is: Three letters of month_date_lastindex.txt ie.e.g.May10_1.txt

    import time
    import datetime
    import shutil
    import os
    import os.path
    
    
    da=datetime.datetime.now()
    
    data_id =1
    ts = time.time()
    st = datetime.datetime.fromtimestamp(ts).strftime("%b%d")
    data_id=str(data_id)
    filename = st+'_'+data_id+'.dat'
    while (os.path.isfile(str(filename))):
        data_id=int(data_id)
        data_id=data_id+1
        print(data_id)
        filename = st+'_'+str(data_id)+'.dat'
        print(filename)
    
    
    shutil.copyfile('Autonamingscript1.py',filename)
    
    f = open(filename,'a+')
    f.write("\n\n\n")
    f.write("Data comments: \n")
    
    
    f.close()
    
    0 讨论(0)
  • 2020-11-28 06:21

    The two ways to do it are:

    1. Check for the existence of the old file and if it exists try the next file name +1
    2. save state data somewhere

    an easy way to do it off the bat would be:

    import os.path as pth
    filename = "myfile"
    filenum = 1
    while (pth.exists(pth.abspath(filename+str(filenum)+".py")):
        filenum+=1
    my_next_file = open(filename+str(filenum)+".py",'w')
    

    as a design thing, while True slows things down and isn't a great thing for code readability


    edited: @EOL contributions/ thoughts

    so I think not having .format is more readable at first glance - but using .format is better for generality and convention so.

    import os.path as pth
    filename = "myfile"
    filenum = 1
    while (pth.exists(pth.abspath(filename+str(filenum)+".py")):
        filenum+=1
    my_next_file = open("{}{}.py".format(filename, filenum),'w')
    # or 
    my_next_file = open(filename + "{}.py".format(filenum),'w')
    

    and you don't have to use abspath - you can use relative paths if you prefer, I prefer abs path sometimes because it helps to normalize the paths passed :).

    import os.path as pth
    filename = "myfile"
    filenum = 1
    while (pth.exists(filename+str(filenum)+".py"):
        filenum+=1
    ##removed for conciseness
    
    0 讨论(0)
  • 2020-11-28 06:23

    My 2 cents: an always increasing, macOS-style incremental naming procedure

    • get_increased_path("./some_new_dir").mkdir() creates ./some_new_dir ; then
    • get_increased_path("./some_new_dir").mkdir() creates ./some_new_dir (1) ; then
    • get_increased_path("./some_new_dir").mkdir() creates ./some_new_dir (2) ; etc.

    If ./some_new_dir (2) exists but not ./some_new_dir (1), then get_increased_path("./some_new_dir").mkdir() creates ./some_new_dir (3) anyways, so that indexes always increase and you always know which is the latest


    from pathlib import Path
    import re
    
    def get_increased_path(file_path):
        fp = Path(file_path).resolve()
        f = str(fp)
    
        vals = []
        for n in fp.parent.glob("{}*".format(fp.name)):
            ms = list(re.finditer(r"^{} \(\d+\)$".format(f), str(n)))
            if ms:
                m = list(re.finditer(r"\(\d+\)$", str(n)))[0].group()
                vals.append(int(m.replace("(", "").replace(")", "")))
        if vals:
            ext = " ({})".format(max(vals) + 1)
        elif fp.exists():
            ext = " (1)"
        else:
            ext = ""
    
        return fp.parent / (fp.name + ext + fp.suffix)
    
    
    0 讨论(0)
提交回复
热议问题