Writing a Counter object to a CSV-file in Python 3 In Python 3.4, a Counter object called cnt like this:  

Counter({'0200': 3, '3000': 2, '3011': 2, '0210': 1, '4000': 1})  


is to be written to a comma-separated file.  

I first tried with CSV and DictWriter that I had not used before, but I kept getting misty errors and was pressed for time, so I decided to make this simple version (it works):  

outfile = infile[:-4] + '_freq.csv'  
fp = open(outfile, encoding='utf-8-sig', mode='w')  
fp.write('KMC|freq\n')  
for tag, count in cnt.items():  
    fp.write('{}|{}\n'.format(tag, count))  

fp.close()  


Then when I had some time I felt I should learn to use DictWriter and CSV, assuming it'd be 'better' or 'more pythonic'.

That turned into this (works too):  

outfile2 = infile[:-4] + '_freq2.csv'  
with open(outfile2, encoding='utf-8-sig', mode='w', newline='') as f:
                # Note: empty newline to avoid blank lines in the output file 
    fieldnames = ['KMC', 'freq']  
    writer = csv.DictWriter(f, fieldnames=fieldnames, delimiter='|')  
    writer.writeheader()  
    for tag, count in cnt.items():  
        writer.writerow({'KMC': tag, 'freq': str(count)})  


The trick with the empty newline to avoid blank lines is from here. 

I like the first approach better. I think CSV and DictWriter are intended for much larger amounts of columns than the two small ones I got. But I'm no expert. 

Any learned comments?
Simplicity

I think that, for an easy task like this, the first version is better as it is considerably simpler while accomplishing the same goal.

It can still be improved though:

Cleaner deletion of file extension

infile[:-4] is probably used to remove the extension from the file, but it is not obvious, I suggest infile.replace(".txt","")( 
where the extension may be different from txt but you get the idea).

Context managing

It is so easy to forget to close a file, it is better to use with that will close it automatically every time:

with open(outfile, encoding='utf-8-sig', mode='w') as fp:
fp.write('KMC|freq\n')  
for tag, count in cnt.items():  
    fp.write('{}|{}\n'.format(tag, count))  


Naming

cnt is a mysterious name, I have no idea what kind of data it may contain, I suggest coming up with a better name.