web-dev-qa-db-fra.com

TypeError: contrainte à Unicode: besoin d'une chaîne ou d'un tampon, liste trouvée

J'essaie de faire fonctionner un script d'analyse de données. Cela fonctionne en ce qui concerne la manipulation des données. Ce que j'essaie de faire, c'est de configurer cela afin que je puisse entrer plusieurs CSV définis par l'utilisateur avec une seule commande.

par exemple.

> python script.py One.csv Two.csv Three.csv 

Si vous avez des conseils sur la façon d'automatiser la dénomination du CSV de sortie afin que si input = test.csv, output = test1.csv, Je l'apprécierais aussi.

Obtenir

TypeError: coercing to Unicode: need string or buffer, list found

pour la ligne

for line in csv.reader(open(args.infile)):

Mon code:

import csv
import pprint
pp = pprint.PrettyPrinter(indent=4)
res = []

import argparse
parser = argparse.ArgumentParser()

#parser.add_argument("infile", nargs="*", type=str)
#args = parser.parse_args()

parser.add_argument ("infile", metavar="CSV", nargs="+", type=str, help="data file") 
args = parser.parse_args()


with open("out.csv","wb") as f:
    output = csv.writer(f) 
    for line in csv.reader(open(args.infile)): 
        for item in line[2:]:

            #to skip empty cells
            if not item.strip():
                continue

            item = item.split(":")
            item[1] = item[1].rstrip("%")

            print([line[1]+item[0],item[1]])
            res.append([line[1]+item[0],item[1]])
            output.writerow([line[1]+item[0],item[1].rstrip("%")])

Je ne comprends pas vraiment ce qui se passe avec l'erreur. Quelqu'un peut-il expliquer cela en termes simples?

Gardez à l'esprit que je suis nouveau dans la programmation/python dans son ensemble et que j'apprends essentiellement seul, donc si possible pourriez-vous expliquer ce qui ne va pas/comment le corriger afin que je puisse le noter pour référence future.

11
user3234810

args.infile Est un liste de noms de fichiers, pas un seul nom de fichier. Faites une boucle dessus:

for filename in args.infile:
    base, ext = os.path.splitext(filename)
    with open("{}1{}".format(base, ext), "wb") as outf, open(filename, 'rb') as inf:
        output = csv.writer(outf) 
        for line in csv.reader(inf): 

Ici, j'ai utilisé os.path.splitext() pour diviser l'extension et le nom de fichier de base afin que vous puissiez générer un nouveau nom de fichier de sortie en ajoutant 1 À la base.

12
Martijn Pieters

Si vous spécifiez un argument nargs à .add_argument, l'argument sera toujours renvoyé sous forme de liste.

En supposant que vous souhaitez traiter tous les fichiers spécifiés, parcourez cette liste:

for filename in args.infile:
    for line in csv.reader(open(filename)): 
        for item in line[2:]:

            #to skip empty cells
[...]

Ou si vous voulez vraiment pouvoir spécifier un seul fichier; se débarrasser de nargs="+".

2
Wooble