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.
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.
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="+"
.