9
votes

TypeError: Attendez un objet tampon de caractère

J'essaie d'écrire une liste d'une liste dans un nouveau fichier, mais je reçois cette erreur:

Traceback (appel le plus récent): fichier "", ligne 1, dans Dowork () Fichier "C: \ Python27 \ Travail \ Comptabilité \ Formatage Fichier QuickBooks \ Sdf.py", ligne 11, à Dowork Fichier Royer () C: \ Python27 \ Travail \ Comptabilité \ Formatage Fichier QuickBooks \ Sdf.py ", Ligne 71, dans Writefile F.Write (thefile) TypeError: Attendez un objet tampon de caractère P> blockQuote>

Comment écrire une liste d'une liste dans un fichier? strong> p>

Voici comment je vais: P>

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


2 commentaires

Vous devez vraiment remplacer la variable globale avec une variable que vous passez à chaque fonction et fermez les fichiers lorsque vous avez terminé avec eux. Et maintenant que nous pouvons voir tout le code, je vous suggère fortement de la réorganiser afin que vous ayez une fonction processus (vous pouvez simplement inverser la ligne la ligne et société < / Code> LOPS) et simplement filtrer la ligne par ligne, de sorte que vous n'avez pas besoin d'une liste et n'avez pas besoin de supprimer les choses de la liste en place, etc. Le tout serait beaucoup plus simple de cette façon.


Dupliqué possible de TypeError: Attendez un personnage Objet tampon - tout en essayant de sauver l'entier à TextFile


3 Réponses :


4
votes

Vous ne pouvez pas écrire une liste dans un fichier; Vous pouvez seulement écrire une chaîne. Convertissez la liste en une chaîne d'une manière ou d'une autre, ou bien itérer sur la liste et écrivez un élément à la fois. Ou vous utilisez le module csv , utilisez-le pour écrire dans le fichier.

appeler autre chose qu'un fichier (tel qu'une liste) thefile est obligé de conduire à la confusion, juste à la manière.


1 commentaires

TypeError: Séquence Article 0: Chaîne attendue, liste trouvée



2
votes

THEFILE est une liste de listes, pas un tampon de caractères.

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


0 commentaires

15
votes

Quel est le message d'erreur indique que vous ne pouvez pas écrire une liste dans un fichier, seul "un objet tampon de caractère", ce qui signifie une chaîne ou quelque chose d'autre qui agit beaucoup comme une chaîne.

Si vous venez de Voulez-vous écrire la liste dans le fichier de la même manière que vous les imprimeriez à la console, vous pouvez écrire str (thefile) ou REC (thefile) (ou même Utilisez la syntaxe redirection dans Imprimer au lieu d'utiliser fichier.write ).

mais vous utilisez le module csv Pour lire l'entrée, vous voulez probablement la sortie dans le même format, vous souhaitez donc probablement utiliser csv pour l'écrire aussi.

Vous lisez comme ceci: xxx

alors écrivez comme ceci: xxx

Je devrais mentionner que je ne structions pas le code comme celui-ci en premier lieu ; Je ferais quelque chose comme ceci: xxx


0 commentaires