7

I want my program to be able to write files in a sequential format, ie: file1.txt, file2.txt, file3.txt. It is only meant to write a single file upon execution of the code. It can't overwrite any existing files, and it MUST be created. I'm stumped.

Mister X
  • 116
  • 1
  • 1
  • 6
  • 1
    Duplicate: http://stackoverflow.com/questions/2401235/python-help-with-counters-and-writing-files. Please edit your questions, do not simply post the same question again. – S.Lott Mar 08 '10 at 15:19
  • It wasn't the same, I was asking how to implement the counter, I wasn't sure how to do about doing it. I'm sorry for any mix up, I just thought it would be good to ask it separately so anyone needing to know that instead could find it by searching. – Mister X Mar 09 '10 at 15:36
  • The classical solution to this is using `O_CREAT | O_EXCEL` flags to create a file while using the system call `open`. I have written a package which exploits this and makes creating such files easier: https://pypi.python.org/pypi/seqfile – musically_ut Apr 27 '15 at 11:01

3 Answers3

4

Two choices:

  1. Counter File.

  2. Check the directory.

Counter File.

with open("thecounter.data","r") as counter:
    count= int( counter.read() )

count += 1

Each time you create a new file, you also rewrite the counter file with the appropriate number. Very, very fast. However, it's theoretically possible to get the two out of synch. in the event of a crash.

You can also make the counter file slightly smarter by making it a small piece of Python code.

settings= {}
execfile( "thecounter.py", settings )
count = settings['count']

Then, when you update the file, you write a little piece of Python code: count = someNumber. You can add comments and other markers to this file to simplify your bookkeeping.

Check the directory.

import os
def numbers( path ):
    for filename in os.listdir(path):
        name, _ = os.path.splitext()
        yield int(name[4:])
count = max( numbers( '/path/to/files' ) )

count += 1

Slower. Never has a synchronization problem.

S.Lott
  • 384,516
  • 81
  • 508
  • 779
  • http://stackoverflow.com/questions/2401235/python-help-with-counters-and-writing-files – badp Mar 08 '10 at 12:45
3

Or you could append the current system time to make unique filenames...

ultrajohn
  • 2,527
  • 4
  • 31
  • 56
1

Here is the way I implemented this:

import os
import glob
import re

#we need natural sort to avoid having the list sorted as such:
#['./folder1.txt', './folder10.txt', './folder2.txt', './folder9.txt']
def sorted_nicely(strings):
    "Sort strings the way humans are said to expect."
    return sorted(strings, key=natural_sort_key)

def natural_sort_key(key):
    import re
    return [int(t) if t.isdigit() else t for t in re.split(r'(\d+)', key)]

#check if folder.txt exists
filename = "folder.txt" #default file name

#if it does find the last count
if(os.path.exists(filename)):
        result = sorted_nicely( glob.glob("./folder[0-9]*.txt"))
        if(len(result)==0):
                filename="folder1.txt"
        else:
                last_result = result[-1]
                number = re.search( "folder([0-9]*).txt",last_result).group(1)
                filename="folder%i.txt"%+(int(number)+1)

Thanks to Darius Bacon for the natural sort functions(see his answer here: https://stackoverflow.com/a/341730)

Sorry if the above code is fugly

Community
  • 1
  • 1
Nuno Furtado
  • 4,548
  • 8
  • 37
  • 57
  • 3
    Suggestion: to avoid any TOCTTOU issues, make it a loop where you try to open the file with a create flag, which should cause an exception if it already exists, which you can catch and then try again with the next number. – Darius Bacon Apr 10 '14 at 19:34