2016-04-11 2 views
0

Je suis en train de lire la colonne « Transcription texte » à partir d'un fichier CSV qui ressemble à ceci -python-cant lire toutes les lignes d'un csv

Order,LearningID,Gender,Race,College, ID ,B,Transcript Text 
1,T66666666B,Male,UNKNOWN,AMC,122333444,,(BEGIN INTERVIEW) 
6,T77777777B,Male,UNKNOWN,AMC,133333333,,INTERVIEWER: CTVA's your major? 
7,T88888888B,Male,UNKNOWN,AMC,144444444,,"STUDENT: Yes, that's right." 

Et mon code à lire la colonne no. 7 (texte Transcript) ressemble à ceci -

import csv  

file_csv = open("test.csv", newline='') 
csv_reader = csv.reader(file_csv, delimiter=',', quotechar='|') 
txt_string ='' 

common_words = ['mmhmm', 'interposing', 'xblank'] 

for i, v in enumerate(csv_reader): 
    print (i) 
    print(v[7]) 
    txt_string += v[7] 

file_csv.close() 

Maintenant, quand je boucle à travers cela, il saute certaines valeurs, toutes les valeurs pour v [7] (colonne - texte de transcription) sont imprimés. Curieusement, les valeurs des compteurs ne s'impriment pas aussi bien.

La sortie ressemble à ceci -

0 
Transcript Text 
3 
STUDENT: Yes, that's right. 

Je me suis assuré que le csv est enregistré en utilisant l'option utf-8 MS Excel, j'ai essayé de placer le codage utf-8 ainsi.

file_csv = open("test.csv", newline='', encoding ='utf-8') 

Mais rien ne fonctionne. Et aussi très bizarrement, chaque fois que je lance ceci, les résultats sont erratiques, c'est-à-dire que certaines lignes qui n'ont pas été imprimées auparavant sont imprimées.

Quel pourrait être le problème ici? .. (en utilisant Python 3.5 et le fichier csv réel j'utilise a environ 25k lignes

+0

Quel système d'exploitation utilisez-vous? –

+0

Pouvez-vous montrer d'abord 2-3 lignes de votre fichier CSV. –

+0

J'utilise Windows 7 – sandunes90

Répondre

0

Ceci est python2, mais la peine d'essayer de voir si elle résout votre problème

Le premier problème que je vois est que vous donnez un caractère de citation de |, mais il semble que votre citation char devrait être " que la 8e colonne (Texte de la transcription) est enveloppée dans ", pas |.

Aussi, j'aime lire la première ligne (en-têtes de colonnes sont présents) et utiliser zip pour créer un dictionnaire de données de la colonne plutôt que l'accès par index (qui peut devenir mal lorsque les colonnes changent la commande)

import csv 

file_csv = open("so.csv") 
csv_reader = csv.reader(file_csv, delimiter=',', quotechar='"') 
conversation = [] 

common_words = ['mmhmm', 'interposing', 'xblank'] 

headers = [header.replace(" ", "_").lower() for header in csv_reader.next()] 
for data in csv_reader: 
    columns = dict(zip(headers, data)) 
    conversation.append(columns["transcript_text"]) 

file_csv.close() 

for i, item in enumerate(conversation): 
    print(i, item) 
+0

Cela a fonctionné, mais je veux utiliser des index dans mon code car je veux filtrer certaines lignes en fonction d'une valeur dans une colonne. Par exemple. - si v [3] = foo alors ajouter v [7] à la chaîne. \t Corriger aussi le quotechar n'a pas corrigé le problème dans python 3. La sortie est maintenant comme ceci - pour l'entrée "ils sont" la sortie est "ils \ x92re". Ce qui signifie qu'il convertit en utf implicitement à travers votre code. – sandunes90

0

Votre quotechar est guillemet "
En outre, à partir python3 vous devez utiliser ce style de gestion des fichiers, essayez:

text = '' 
with open('test.csv', newline='') as csvfile: 
csvFile = csv.reader(csvfile, delimiter=',', quotechar='"') 
for row,data in enumerate(csvFile): 
    print(row, data[7]) 
    text += data[7] 

print(text) 

sortie:

0 Transcript Text 
1 (BEGIN INTERVIEW) 
2 INTERVIEWER: CTVA's your major? 
3 STUDENT: Yes, that's right. 
Transcript Text(BEGIN INTERVIEW)INTERVIEWER: CTVA's your major?STUDENT: Yes, that's right. 
0

Juste à la surface, il semble que vous utilisez le mauvais quotechar de l'csv docs.

Ordonne écrivain objets à ne citer que ces champs qui contiennent des caractères spéciaux tels que delimiter, quotechar ou tout des personnages lineterminator.

Pour une raison quelconque, vous transmettez un caractère de canalisation en tant que quotechar. Mais il est clair, les données que vous avez donné utilise un double guillemet, ce qui est la valeur par défaut et semble très bien fonctionner:

>>> import csv, StringIO 
>>> data = """Order,LearningID,Gender,Race,College, ID ,B,Transcript Text 
... 1,T66666666B,Male,UNKNOWN,AMC,122333444,,(BEGIN INTERVIEW) 
... 6,T77777777B,Male,UNKNOWN,AMC,133333333,,INTERVIEWER: CTVA's your major? 
... 7,T88888888B,Male,UNKNOWN,AMC,144444444,,"STUDENT: Yes, that's right." 
... """ 
>>> fd = StringIO.StringIO(data) 
>>> print list(csv.reader(fd)) 
[['Order', 'LearningID', 'Gender', 'Race', 'College', ' ID ', 'B', 'Transcript Text'], ['1', 'T66666666B', 'Male', 'UNKNOWN', 'AMC', '122333444', '', '(BEGIN INTERVIEW)'], ['6', 'T77777777B', 'Male', 'UNKNOWN', 'AMC', '133333333', '', "INTERVIEWER: CTVA's your major?"], ['7', 'T88888888B', 'Male', 'UNKNOWN', 'AMC', '144444444', '', "STUDENT: Yes, that's right."]] 
0

Changer votre code à la suivante,

with open(file) as f: 
    reader = csv.reader(f) 
    next(reader) # skip the header row 
    for i, row in reader: 
     print(i) 
     print(row[7]) 

Si si cela fonctionne.