2012-09-25 25 views
7

मैं एक नई फ़ाइल के लिए एक सूची की एक सूची लिखने के लिए कोशिश कर रहा हूँ, लेकिन मैं इस त्रुटि हो रही है:लेखन त्रुटि: उम्मीद एक चरित्र बफर वस्तु

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

मैं करने के लिए एक सूची की एक सूची कैसे लिख सकता हूँ एक पंक्ति?

यह मैं कैसे लिख रहा हूँ है:

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

आपको वास्तव में ग्लोबल वैरिएबल को एक चर के साथ बदलना चाहिए जिसे आप प्रत्येक फ़ंक्शन में पास करते हैं, और जब आप उनके साथ काम करते हैं तो फ़ाइलों को बंद करें। और अब जब हम पूरा कोड देख सकते हैं, तो मैं दृढ़ता से सुझाव दूंगा कि आपके पास 'प्रोसेसलाइन' फ़ंक्शन है (आप केवल 'लाइन' और' कंपनी' लूप को उलट सकते हैं), और बस लाइन से लाइन फ़िल्टर करें, ताकि आप किसी सूची की आवश्यकता नहीं है, और इन्हें सूची में से चीजों को हटाने की आवश्यकता नहीं है, और इसी तरह। पूरी बात इस तरह से बहुत आसान होगी। – abarnert

+0

संभव डुप्लिकेट [TypeError: अपेक्षित एक वर्ण बफर ऑब्जेक्ट - टेक्स्टफाइल में पूर्णांक को सहेजने का प्रयास करते समय] (http: // stackoverflow।कॉम/प्रश्न/9786 9 41/टाइपर-अपेक्षित-ए-कैरेक्टर-बफर-ऑब्जेक्ट-जबकि-कोशिश-टू-सेव-इंटीजर-टू -0) –

उत्तर

12

त्रुटि संदेश क्या कह रहा है कि आप किसी फ़ाइल में एक सूची नहीं लिख सकते हैं, केवल "एक वर्ण बफर ऑब्जेक्ट", जिसका अर्थ स्ट्रिंग या स्ट्रिंग की तरह बहुत कुछ करता है।

तुम सिर्फ एक ही तरीके से फाइल करने के लिए सूची आप कंसोल के लिए उन्हें प्रिंट होता लिखना चाहते हैं, तो आप str(thefile) या repr(thefile) (या यहां तक ​​कि बजाय file.write का उपयोग करने का print में रीडायरेक्ट सिंटैक्स का उपयोग करें) लिख सकते हैं।

लेकिन आप इनपुट पढ़ने के लिए 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)) 
+0

+1 वास्तव में क्या चाहता था। –

3

आप एक फ़ाइल के लिए एक सूची नहीं लिख सकते हैं; आप केवल एक स्ट्रिंग लिख सकते हैं। सूची को किसी स्ट्रिंग में किसी तरह से कनवर्ट करें, या फिर सूची में पुनरावृत्त करें और एक समय में एक तत्व लिखें। या आप csv मॉड्यूल का उपयोग कर रहे हैं, फ़ाइल को लिखने के लिए इसका उपयोग करें।

किसी फ़ाइल (जैसे सूची) के अलावा कुछ और कॉल करना thefile केवल वैसे ही भ्रम पैदा करने के लिए बाध्य है।

+0

हा, मैं हारता हूं, आप जीतते हैं: डी –

+0

टाइप एरर: अनुक्रम आइटम 0: अपेक्षित स्ट्रिंग , सूची मिली –

+0

धन्यवाद क्या आप मुझे बता सकते हैं कि मैं लिखने के लिए सीएसवी मॉड्यूल का उपयोग कैसे कर सकता हूं? –

2

thefile सूचियों की एक सूची है, न कि वर्ण बफर।

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

है यहाँ कुछ बुरा, वैश्विक उपयोग करते हुए, एक सूची thefile नामकरण, ...

(सही जवाब abarnert की है)।