Fichier délimité par des tabulations à l'aide de csv.reader ne délimitant pas l'emplacement auquel je m'attendais
Je suis en train de faire une boucle par un fichier délimité par des tabulations des résultats de l'élection à l'aide de Python. Le code suivant ne fonctionne pas, mais quand j'utilise un fichier local avec les mêmes résultats (le commentaire sur la ligne), il ne fonctionne pas comme prévu.
La seule chose que je peux penser à est de certains en-têtes ou un type de contenu j'ai besoin de passer l'url, mais je ne peux pas le comprendre.
Pourquoi est-ce arrivé?
import csv
import requests
r = requests.get('http://vote.wa.gov/results/current/export/MediaResults.txt')
data = r.text
#data = open('data/MediaResults.txt', 'r')
reader = csv.reader(data, delimiter='\t')
for row in reader:
print row
Résultats dans:
...
['', '']
['', '']
['2']
['3']
['1']
['1']
['8']
['', '']
['D']
['a']
['v']
['i']
['d']
[' ']
['F']
['r']
['a']
['z']
['i']
['e']
['', '']
...
source d'informationauteur foxyNinja7
Vous devez vous connecter pour publier un commentaire.
donc ce qui se passe, eh bien, un appel à
help
peut jeter un peu de lumière.il semble donc que
csv.reader
s'attend à un itérateur d'une certaine sorte, qui sera de retour une ligne, mais nous sommes passer une chaîne qui itère sur un char de bases qui est pourquoi son analyse, caractère par caractère, un moyen de résoudre ce problème serait de générer un fichier temp, mais nous n'avons pas besoin, nous avons juste besoin de passer aucun objet itérable.note à la suivante, qui tout simplement divise la chaîne à une liste de lignes, avant son de la fed pour le lecteur.
cela semble fonctionner.
Je recommande également à l'aide de
csv.DictReader
son tout à fait utile.fondamentalement, il retourne un dictionnaire pour chaque ligne, à l'aide de l'en-tête de la clé, de cette façon, nous n'avons pas besoin de garder une trace de l'ordre mais au lieu de simplement le nom de la rendre un peu plus facile pour nous ie
row['Votes']
semble plus lisible, alorsrow[4]
...Cela fonctionne parfaitement:
Le premier paramètre à
csv.reader
devrait être:comme par les docset vous passez une chaîne de caractères, pas un objet de fichier. Une chaîne se comporte comme une liste de caractères unique d'où le comportement que vous observez.
Problème Simple: La csv.lecteur ne vous attendez pas à une chaîne de caractères pour son entrée.
Solution Simple: Modifier les entrées:
data.splitlines()
.Le csv lecteur s'attend à un objet iterable qui renvoie les lignes une à une. Une chaîne de caractères, malheureusement, parcourt un caractère à la fois. Pour résoudre le problème, utilisez splitlines() à tourner à la chaîne dans une liste de lignes:
Peut-être que vous voulez de renifler le dialecte à travers le csv API:
Cela va produire des résultats corrects.
Voir aussi
http://docs.python.org/library/csv.html#csv.Sniffer