shreya
shreya

Reputation: 407

write multiple files at a time

I have a file with 196 list in it,and I want to create new 196 output files and write each of the list in a new file, so that I will have 196 output files each containing 1 list of input data Here is the input file:

"['128,129', '116,118', '108,104', '137,141', '157,144', '134,148', '138,114', '131,138', '248,207', '208,247', '246,248', '101,106', '131,115', '119,120', '131,126', '138,137', '132,129']"
"['154,135', '151,147', '236,244', '243,238', '127,127', '125,126', '122,124', '123,126', '127,129', '122,121', '147,134', '126,132', '128,137', '233,222', '222,236', '125,126']"

.....here for eg, I have given only 2 list but total 196 list are present. Output should be:

file 1 :

128,129
116,118
108,104

file2 :

154,135
151,147
236.244

Current code:

fn = open("/home/vidula/Desktop/project/ori_tri/inpt.data","r")
fnew = fn.read()
fs = fnew.split('\n')
for value in fs:
    f = [open("/home/vidula/Desktop/project/ori_tri/input_%i.data" %i,'w') for i in range(len(list_of_files))]
    f.write(value)
    f.close()

Error: list do not attribute write.

Upvotes: 5

Views: 49807

Answers (5)

Rider
Rider

Reputation: 39

You can't make python look inside the list class for the write object as an iterable in the list comprehension. The list is not compatible with the write() method. In python lists are appended.

Assuming your data file has new lines already in the file, create a filter object to remove blank lines then iterate:

string1 = '128,129', '134, 167', '127,189'
string2 = '154, 134', '156, 124', '138, 196'
l1 = list(string1)
l2 = list(string2)
data = [l1, l2]
f = open("inpt.data", "w")
for val in data:
    f.write(str(val))
    f.write('\n')
f.close()

with open("inpt.data", "r", encoding='utf-8') as fs:
    reader = fs.read()
    file = reader.split('\n')
    file = filter(None, file)

The simplest way:

# create one file for each list of data (1) on every new line 
i = 0
for value in file:
    i += 1
    f = open("input_%s.data" % i, 'w')
    f.write(value)
fs.close()

The pythonic simple way:

for i, line in enumerate(file):
    fi = open("input_%s.data" % i, 'w')
    fi.write(line)
fs.close()

Upvotes: 1

Samuele Mattiuzzo
Samuele Mattiuzzo

Reputation: 11038

your f is a list of files, you have to loop through it:

for file in f:
   file.write(value)

Upvotes: 2

user1006989
user1006989

Reputation:

I think this is what you are looking for:

with open("/home/vidula/Desktop/project/ori_tri/inpt.data","r") as fn:
    listLines = fn.readlines()

for fileNumber, line in enumerate(listLines):
    with open("/home/vidula/Desktop/project/ori_tri/input{0}.data".format(fileNumber), "w") as fileOutput:
        fileOutput.write(line)

Upvotes: 0

John Zwinck
John Zwinck

Reputation: 249123

Your current code is loading everything into memory, which is quite unnecessary, then it is making a list in a place that is not appropriate, hence your error. Try this:

fn = open("/home/vidula/Desktop/project/ori_tri/inpt.data","r")
for i, line in enumerate(fn):
    f = open("/home/vidula/Desktop/project/ori_tri/input_%i.data" %i,'w')
    f.write(line)
    f.close()

This will just write each line as it was to each file. Look up the enumerate function I used to do the indexing.

Having done this, you will still need to write parsing logic to turn each line into a series of lines...I'm not going to do that for you here, since your original code didn't really have logic for it either.

Upvotes: 11

pranshus
pranshus

Reputation: 187

I am assuming that you want to read 196 files and then write the data (after some modification) to new 196 files. If you use maps and reduce (functional programming) it can do what you want. Though without much explanation in the question, I am unable to help much.

def modify(someString):
    pass # do processing

def newfiles(oldfilename): return '%s.new.txt'%(oldfilename) # or something 

filenames = ('a', 'b', 'c', 'd', ....) 
handles = [(open(x, 'r'), open(newfile(x), 'w')) for x in filenames] # not using generator
tmp = [y[1].write(modify(y[0].read())) for y in handles) 

Upvotes: 0

Related Questions