9

リストのリストを新しいファイルに書き込もうとしていますが、次のエラーが発生します:

トレースバック (最新の呼び出しが最後): ファイル ""、1 行目、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: expected a character buffer object

リストのリストをファイルに書き込むにはどうすればよいですか?

これは私が書いている方法です:

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

3 に答える 3

15

エラーメッセージが言っているのは、リストをファイルに書き込むことはできず、文字列または文字列のように機能する何かを意味する「文字バッファーオブジェクト」のみを書き込むことができるということです。

str(thefile)リストをコンソールに出力するのと同じ方法でファイルに書き出すだけの場合は、 orを書くことができます(または を使用する代わりにrepr(thefile)リダイレクト構文を使用することもできます)。printfile.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))
于 2012-09-26T00:10:28.690 に答える
4

リストをファイルに書き込むことはできません。文字列しか書けません。何らかの方法でリストを文字列に変換するか、リストを反復処理して一度に要素を書き込みます。または、csvモジュールを使用している場合は、それを使用してファイルに書き込みます。

ところで、ファイル以外のもの (リストなど) を呼び出すと、thefile混乱が生じることは間違いありません。

于 2012-09-25T23:28:46.090 に答える
2

ファイルはリストのリストであり、文字バッファーではありません。

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

グローバルを使用し、リストにファイルの名前を付けます...

(正解は abarnert さんです)。

于 2012-09-25T23:29:00.090 に答える