TypeError:期望一个字符缓冲区对象

时间:2012-09-25 23:27:04

标签: python csv python-2.x

我正在尝试将列表列表写入新文件,但我收到此错误:

  

Traceback(最近一次调用最后一次):文件“”,第1行,in          dowork()文件“C:\ Python27 \ work \ accounting \ formatting quickbooks file \ sdf.py”,第11行,在dowork       WriteFile()文件“C:\ Python27 \ work \ accounting \ formatting quickbooks file \ sdf.py”,第71行,在WriteFile中       f.write(thefile)TypeError:期望一个字符缓冲区对象

如何将列表列表写入文件?

这就是我写作的方式:

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

如果您需要,这里是完整的来源:

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)))

3 个答案:

答案 0 :(得分:13)

错误消息的含义是您不能将列表写入文件,只能写入“字符缓冲区对象”,这意味着字符串或其他与字符串非常相似的内容。

如果您只想以与将其打印到控制台相同的方式将列表写入文件,则可以编写str(thefile)repr(thefile)(甚至可以使用print中的重定向语法{1}}而不是使用file.write)。

但是您正在使用csv模块来读取输入,并且可能希望输出采用相同的格式,因此您可能希望使用csv来编写它。

你是这样读的:

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

所以这样写:

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

我应该提一下,我不会首先构建这样的代码;我会做这样的事情:

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))

答案 1 :(得分:3)

您无法将列表写入文件;你只能写一个字符串。以某种方式将列表转换为字符串,或者迭代列表并一次写入一个元素。或者您正在使用csv模块,使用该模块写入文件。

除了文件(例如列表)thefile之外,调用其他内容肯定会导致混淆,顺便说一下。

答案 2 :(得分:2)

该文件是列表列表,而不是字符缓冲区。

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

这里有一些不好,使用全局,命名列表文件,...

(正确答案是abarnert's)。