2010-07-20 3 views
0

Je suis extraire les lignes que je veux de ce fichier plus volumineux en utilisant ce programme:En utilisant csv pour extraire des lignes modele spécifiques de texte à partir d'un fichier plus volumineux

import csv 

name = ['NAMETHEFIRST,' 'NAMEANOTHERNAME '] 
data = csv.reader(open('C:\\bigfile.csv')) 

with open('C:\\smalldataset.xcl','w') as outf: 
    csv.writer(outf).writerows(l for l in data if l[0] in name) 

Le programme fonctionne. Cependant, je reçois seulement la ligne de données de NAMETHEFIRST et je ne reçois aucune donnée de NAMETHEOTHERNAME écrite dans mon petit fichier de jeu de données. Cela fonctionne exactement comme je veux imprimer toutes les informations pertinentes à partir du grand ensemble de données de la ligne de données pour NAME THE FIRST mais je ne reçois aucune information du second nom de famille écrit dans le fichier plus petit. Pourquoi ça ne marche pas?

+0

Vous parlez de deux fichiers encore votre code est clairement fonctionne avec un seul fichier. De plus, le deuxième élément de la liste 'nom' a de l'espace après. Est-ce intentionnel? – SilentGhost

+0

@SilentGhost: (1) fichier input-large, (2) fichier output-small, 'assert 1 + 1 == 2' –

+0

@SilentGhost: Sa liste n'a qu'un seul élément. –

Répondre

1

Ceci est une liste avec une chaîne:

['NAMETHEFIRST,' 'NAMEANOTHERNAME '] 

Ceci est une liste avec deux chaînes:

['NAMETHEFIRST', 'NAMEANOTHERNAME '] 

Notez le placement de la virgule.

Notez également que votre deuxième chaîne a un espace à la fin.

1

Cette ligne de code

name = ['NAMETHEFIRST,' 'NAMEANOTHERNAME '] 

est équivalent à

name = ['NAMETHEFIRST,NAMEANOTHERNAME '] 

parce que Python suit C en concaténant les constantes de chaîne adjacents au moment de la compilation.

Vous dites « » « Je ne reçois la ligne de données à partir NAMETHEFIRST et je reçois aucune donnée de NAMETHEOTHERNAME écrit à mon petit fichier ensemble de données » « » - mais le code que vous présentez ne produira pas ce résultat ; il sélectionne uniquement les lignes qui commencent par

"NAMETHEFIRST,NAMEANOTHERNAME ", 

Vous obtiendrez le résultat indiqué que si cette ligne est en fait:

name = ['NAMETHEFIRST', 'NAMEANOTHERNAME '] 

et qui est sans doute parce que le deuxième nom dans le fichier n'a pas un espace arrière comme ci-dessus.

Autres problèmes:

csv.writer(outf).writerows(l for l in data if l[0] in name) tente d'être un peu trop intelligent. Si vous le divisez en morceaux de petite taille, vous pouvez utiliser plus facilement un débogueur ou simplement imprimer des instructions pour vous montrer ce qui se passe réellement.

Essayez ceci:

print len(name), name 
data = csv.reader(open('C:\\bigfile.csv', 'rb')) # ALWAYS open csv files in BINARY mode 
with open('C:\\smalldataset.xcl','wb') as outf: # ALWAYS open csv files in BINARY mode 
    writer = csv.writer(outf) 
    for row_index, row in enumerate (data): # don't use 'l' as a variable name 
     print row_index + 1, row 
     if row[0] in name: 
      writer.writerow(row) 
Questions connexes