2012-09-25 37 views
7

Tôi cố gắng để viết một danh sách của một danh sách vào một tập tin mới, nhưng tôi nhận được lỗi này:Lỗi Loại: mong đợi một đối tượng nhân vật đệm

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

Làm thế nào để viết một danh sách của một danh sách công việc một tập tin?

Đây là cách tôi đang viết:

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

và đây là nguồn gốc hoàn toàn nếu bạn cần nó:

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

Bạn thực sự nên thay thế biến toàn cầu bằng biến mà bạn chuyển đến từng chức năng và đóng các tệp khi bạn hoàn tất. Và bây giờ chúng ta có thể thấy toàn bộ mã, tôi khuyên bạn nên tổ chức lại nó để bạn có một hàm 'ProcessLine' (bạn có thể đảo ngược vòng lặp' line' và 'company'), và chỉ lọc từng dòng một, vì vậy bạn không cần danh sách và không cần xóa mọi thứ khỏi danh sách tại chỗ, v.v. Toàn bộ điều sẽ đơn giản hơn nhiều theo cách đó. – abarnert

+0

có thể trùng lặp của [TypeError: dự kiến ​​một đối tượng đệm ký tự - trong khi cố gắng lưu số nguyên vào textfile] (http: // stackoverflow.com/questions/9786941/typeerror-expected-a-character-buffer-object-while-trying-to-save-integer-to) –

Trả lời

12

Thông báo lỗi nói rằng bạn không thể ghi danh sách vào tệp, chỉ "đối tượng đệm ký tự", có nghĩa là chuỗi hoặc một thứ khác hoạt động giống như chuỗi.

Nếu bạn chỉ muốn viết danh sách các tập tin trong cùng một cách bạn muốn in chúng ra cửa sổ Console, bạn có thể viết str(thefile) hoặc repr(thefile) (hoặc thậm chí sử dụng cú pháp chuyển hướng trong print thay vì sử dụng file.write).

Nhưng bạn đang sử dụng mô-đun csv để đọc đầu vào và có lẽ bạn muốn sử dụng cùng một định dạng, vì vậy bạn có thể muốn sử dụng csv để viết.

Bạn đang đọc như thế này:

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

Vì vậy, viết như thế này:

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

tôi nên đề cập đến rằng tôi sẽ không cấu trúc mã như thế này ở nơi đầu tiên; Tôi sẽ làm một cái gì đó như thế này:

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

+1 điều thực sự mong muốn. –

3

Bạn không thể viết một danh sách vào một tập tin; bạn chỉ có thể viết một chuỗi. Chuyển đổi danh sách thành một chuỗi theo một cách nào đó hoặc lặp lại qua danh sách và viết một phần tử tại một thời điểm. Hoặc bạn đang sử dụng mô-đun csv, hãy sử dụng mô-đun đó để ghi vào tệp.

Gọi một thứ khác ngoài tệp (chẳng hạn như danh sách) thefile nhất định dẫn đến nhầm lẫn, chỉ bằng cách này.

+0

Ha, tôi từ bỏ, bạn thắng: D –

+0

LoạiError: mục chuỗi 0: chuỗi được mong đợi , danh sách tìm thấy –

+0

cảm ơn yo có thể ushow tôi làm thế nào tôi có thể sử dụng mô-đun csv để viết? –

2

thefile là danh sách các danh sách, không phải là bộ đệm ký tự.

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

có một số xấu ở đây, sử dụng toàn cầu, đặt tên một danh sách thefile, ...

(Câu trả lời đúng là abarnert của).

Các vấn đề liên quan