2015-11-25 3 views
0

J'ai actuellement;CSV liste imbriquée en lisant entre guillemets

files = ['a.txt', 'b.txt', 'c.txt'] 
ftypes = [['a', 'b'], ['c'], ['a', 'b', 'c']] 
with open('files.csv', 'wb') as file: 
    writer = csv.writer(file, quoting=csv.QUOTE_MINIMAL) 
    for f, g in zip(files, ftypes): 
     writer.writerow((f, g)) 

pour le lire dans J'ai utilisé;

with open('files.csv', 'r') as rfile: 
    csvread = csv.reader(rfile) 
    files = [] 
    ftypes = [] 
    for row in csvread: 
     files.append(row[0]) 
     ftypes.append(row[1]) 

Dans la csv réelle, la deuxième colonne est correctement remplie avec les sous-listes de remplissage de la 2e colonne, mais à la lecture dans ftypes, il retourne [ « [ « a », « b »] », " ['c'] "," ['a', 'b', 'c'] "] qui est incorrect. Il le traite comme une liste de chaînes, donc je ne peux pas les parcourir comme ça; Comment puis-je corriger mon écriture/lecture afin que la liste imbriquée analyse correctement?

Edit:

contenu du fichier CSV

a.txt,"['a', 'b']" 
b.txt,"['c']" 
c.txt,"['a', 'b', 'c']" 

Il semble que Excel 2013 est l'analyse syntaxique des guillemets doubles et les ignorer, mais python est l'analyse du contenu de csv réels correctement. Quels paramètres dois-je passer dans csv.writer pour corriger cela?

+1

Veuillez coller un échantillon du contenu de votre fichier CSV –

+0

Comment voulez-vous qu'il apparaisse dans Excel? –

Répondre

2

Je pense que vous devriez utiliser Convert string representation of list to list in Python. Les choses qui se sont passées sont assez évidentes - Python lit la ligne CSV, et chaque élément de la ligne est une chaîne. Il ne sait pas quel type il devrait être.

Vous aurez quelque chose comme

import ast 
with open('files.csv', 'r') as rfile: 
    csvread = csv.reader(rfile) 
    files = [] 
    g_list = [] 
    for row in csvread: 
     files.append(row[0]) 
     ftypes.append(ast.literal_eval(row[1])) 

Pour éviter ce hack et vous fixer écrire exactement peut faire ce qui suit:

files = ['a.txt', 'b.txt', 'c.txt'] 
ftypes = [['a', 'b'], ['c'], ['a', 'b', 'c']] 

with open('files.csv', 'wb') as file: 
    writer = csv.writer(file, quoting=csv.QUOTE_MINIMAL) 
    for f, g in zip(files, ftypes): 
     g.insert(0, f) 
     writer.writerow(g) 


ftypes_from_file = [] 
files_from_file = [] 
with open('files.csv', 'r') as rfile: 
    csvread = csv.reader(rfile) 
    files = [] 
    g_list = [] 
    for row in csvread: 
     files_from_file.append(row[0]) 
     ftype = [] 
     for item in row[1:]: 
      ftype.append(item) 
     ftypes_from_file.append(ftype) 

print(ftypes_from_file) 

L'astuce principale à traiter avec un nombre dynamique d'éléments dans la ligne.

J'espère que le nouveau format de la ligne dans CSV sera OK pour vous.

+0

'ftypes.append (ast.literal_eval (row [1]))' fonctionnait très bien! Merci! Ceci, cependant, ne répond pas à la question plus large d'écrire correctement les valeurs en premier lieu. – p014k

+0

Ok, juste une minute :) –

+0

@ p014k fait, s'il vous plaît vérifier –