我正在尝试将列表列表写入新文件,但我收到此错误:
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)))
答案 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)。