TypeError: expected character buffer object

I am trying to write a list of list to a new file, but I get this error:

Traceback (last last call): File ", line 1, in dowork () File" C: \ Python27 \ work \ accounting \ formatting quickbooks file \ sdf.py ", line 11, in dowork File WriteFile ()" C: \ Python27 \ work \ accounting \ formatting quickbooks file \ sdf.py ", line 71, in WriteFile f.write (thefile) TypeError: a character buffer object is expected

How to write a list list to a file?

This is how I write:

def WriteFile(): global thefile f = open("output"+'.csv','w') f.seek(0) f.write(thefile) f.close() 

and here is the complete source if you need it:

 import csv thefile = [] output = [] def dowork(): sourceFile='e.csv' thefile=ReadFile(sourceFile) CleanFile(sourceFile) ProcessFile() WriteFile() def ReadFile(filename): return list(csv.reader(open(filename, 'rb'), delimiter=',', quotechar='"'))[1:] def CleanFile(sourceFile): global thefile thefiletmp=[] for i, line in enumerate(thefile): if line[2]=='': del thefile[i] else: thefiletmp.append(line[4:]) thefile=thefiletmp def ProcessFile(): global thefile iCompany=1 iNum=0 iDate=2 iAging=3 iBalance=4 COMPANIES=GetDistinctValues(1) mytemparray=[] mytempfile=[] for company in COMPANIES: for line in thefile: if line[iCompany]==company: mytemparray.append(line[iCompany]) mytemparray.append(line[iNum]) mytemparray.append(line[iDate]) if line[2] in range(0,31): mytemparray.append(line[iBalance]) mytemparray.append('0') mytemparray.append('0') mytemparray.append('0') if line[2] in range(31,61): mytemparray.append('0') mytemparray.append(line[iBalance]) mytemparray.append('0') mytemparray.append('0') if line[2] in range(61,91): mytemparray.append('0') mytemparray.append('0') mytemparray.append(line[iBalance]) mytemparray.append('0') if line[2] >90: mytemparray.append('0') mytemparray.append('0') mytemparray.append('0') mytemparray.append(line[iBalance]) mytempfile.append(mytemparray) mytemparray=[] thefile=mytempfile def WriteFile(): global thefile f = open("output"+'.csv','w') f.seek(0) f.write(thefile) f.close() def GetDistinctValues(theColumn): return sorted(list(set(line[theColumn] for line in thefile))) 
+7
source share
3 answers

What the error message says is that you cannot write the list to a file, but only a β€œcharacter buffer object”, which means a string or something else that acts like a string.

If you just want to write the list to a file the same way you print it to the console, you can write str(thefile) or repr(thefile) (or even use the redirect syntax in print instead of using file.write ).

But you are using the csv module to read the input and presumably want the result to be in the same format, so you probably want to use csv to write it.

You read like this:

 list(csv.reader(open(filename, 'rb'), delimiter=',', quotechar='"'))[1:] 

So write like this:

 csv.writer(open('foo.csv', 'wb'), delimiter=',', quotechar='"').writerows(thefile) 

I should mention that I would not structure the code like this in the first place; I would do something like this:

 with open('input.csv', 'rb') as infile, open('output.csv', 'wb') as outfile: incsv = csv.reader(infile, delimiter=',', quotechar='"') outcsv = csv.writer(outfile, delimiter=',', quotechar='"') incsv.read() # skip first line for line in incsv: if line[3] != '': outcsv.write(ProcessLine(line)) 
+12
source

You cannot write a list to a file; you can write a string. Convert the list to a string in some way, or rename the list and write the item at a time. Or you use the csv module, use this to write to a file.

Calling something other than thefile (for example, a list) thefile certainly lead to confusion, by the way.

+3
source

thefile is a list of lists, not a character buffer.

 for sublist in thefile: f.write("".join(sublist)) # perhaps 

there is something bad using global, naming the list thefile, ...

(The correct answer is abarnert's).

+2
source

All Articles