cylondude
cylondude

Reputation: 1888

writing .csv files from for loops and lists

I am new to python but I have searched on Stack Overflow, google, and CodeAcademy for an answer or inspiration for my obviously very simple problem. I thought finding a simple example where a for loop is used to save every interation would be easy to find but I've either missed it or don't have the vocab to ask the right question. So please don't loudly sigh in front of your monitor at this simple question. Thanks.

I would like to simply write a csv file with each iteration of the two print lines on the code below in a seperate column. so an output example might look like:

##################
andy.dat, 8

brett.dat, 9

candice.dat, 11         
#################

the code I have so far is:

import sys
import os.path

image_path = "C:\\"

for filename in os.listdir (image_path):
    print filename
    print len(filename)

If I try to do

x =  filename

then I only get the last interation of the loop written to x. How do I write all of them to x using a for loop? Also, how to write it as a column in a csv with the print result of len(filename) next to it? Thanks.

Upvotes: 2

Views: 8601

Answers (4)

pradyunsg
pradyunsg

Reputation: 19486

Try this:

# Part 1
import csv
import os

# Part 2
image_path = "C:\\"

# Part 3    
li = [] # empty list
for filename in os.listdir(image_path):
    li.append((filename, len(filename))) # populating the list

# Part 4
with open('test.csv', 'w') as f:
    f.truncate()
    writer = csv.writer(f)
    writer.writerows(li)

Explanation:
In Part 1,
we import the module os and csv.
In Part 2,
we declare image_path.

Now the for loops..
In Part 3,
we declare an empty list (li).
Then we go into a for loop, in which we populate the list with every item and it's length in image_path. In Part 4,
we move to writing the csv file. In the with statement, we wrote all the data from li, into our file.

Upvotes: 0

Jared
Jared

Reputation: 26437

Although for this task you don't need it, I would take advantage of standard library modules when you can, like csv. Try something like this,

import os
import csv

csvfile = open('outputFileName.csv', 'wb')
writer = csv.writer(csvfile)

for filename in os.listdir('/'): # or C:\\ if on Windows
    writer.writerow([filename, len(filename)])

csvfile.close()

Upvotes: 2

aga
aga

Reputation: 29454

import sys
import os

image_path = "C:\\"
output = file("output.csv", "a")

for filename in os.listdir (image_path):
    ouput.write("%s,%d" % (filename, len(filename)))

Where a in file constructor opens file for appending, you can read more about different modes in which you can use file object here.

Upvotes: 0

jedwards
jedwards

Reputation: 30260

I'd probably change this:

for filename in os.listdir (image_path):
    print filename
    print len(filename)

To something like

lines = list()

for filename in os.listdir(image_path):
    lines.append("%s, %d" % (filename, len(filename)))

My version creates a python list, then on each iteration of your for loop, appends an entry to it.

After you're done, you could print the lines with something like:

for line in lines:
    print(line)

Alternatively, you could initially create a list of tuples in the first loop, then format the output in the second loop. This approach might look like:

lines = list()

# Populate list
for filename in os.listdir(image_path):
    lines.append((filename, len(filename))

# Print list
for line in lines:
    print("%s, %d" % (line[0], line[1]))

# Or more simply
for line in lines:
    print("%s, %d" % line)

Lastly, you don't really need to explicitly store the filename length, you could just calculate it and display it on the fly. In fact, you don't even really need to create a list and use two loops.

Your code could be as simple as

import sys, os

image_path = "C:\\"
for filename in os.listdir(image_path):
    print("%s, %d" % (filename, len(filename))

Upvotes: 0

Related Questions