2010-05-28 18 views
8

J'essaye de créer ce script qui vérifiera le nom d'hôte d'ordinateur puis recherchera une liste principale pour la valeur pour retourner une valeur correspondante dans le fichier de csv. Puis ouvrez un autre fichier et faites une recherche de remplacement. Je sais que cela devrait être facile, mais je n'ai pas fait grand-chose en python auparavant. Voici ce que j'ai jusqu'à présent ...Python aide à lire le fichier csv échouant en raison des fins de ligne

masterlist.txt (tab delimited) 
Name     UID 
Bob-Smith.local  bobs 
Carmen-Jackson.local carmenj 
David-Kathman.local davidk 
Jenn-Roberts.local jennr 

Voici le script que j'ai créé jusqu'ici

#GET CLIENT HOST NAME 
import socket 
host = socket.gethostname() 
print host 

#IMPORT MASTER DATA 
import csv, sys 
filename = "masterlist.txt" 
reader = csv.reader(open(filename, "rU")) 

#PRINT MASTER DATA 
for row in reader: 
    print row 

#SEARCH ON HOSTNAME AND RETURN UID 



#REPLACE VALUE IN FILE WITH UID 
#import fileinput 
#for line in fileinput.FileInput("filetoreplace",inplace=1): 
# line = line.replace("replacethistext","UID") 
# print line 

En ce moment, il est juste configuré pour imprimer la liste principale. Je ne suis pas sûr si la liste doit être analysée et placée dans un dictionnaire ou quoi. J'ai vraiment besoin de comprendre comment rechercher le premier champ pour le nom d'hôte et ensuite retourner le champ dans la deuxième colonne.

Merci d'avance pour votre aide, Aaron


MISE À JOUR: Je retire la ligne 194 et dernière ligne de MasterList.txt puis re-couru le script. Les résultats sont les suivants:

Traceback (most recent call last):
File "update.py", line 3, in for row in csv.DictReader(open(fname), delimiter='\t'): File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/csv.py", line 103, in next self.fieldnames File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/csv.py", line 90, in fieldnames self._fieldnames = self.reader.next() _csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?

Le script actuel utilisé est ...

import csv 
fname = "masterlist.txt" 
for row in csv.DictReader(open(fname), delimiter='\t'): 
    print(row) 

Répondre

2

Pour itérer sur un lecteur que vous feriez:

>>> import csv 
>>> for row in csv.DictReader(open(fname), delimiter='\t'): 
    print(row) 


{'Name': 'Bob-Smith.local', 'UID': 'bobs'} 
{'Name': 'Carmen-Jackson.local', 'UID': 'carmenj'} 
{'Name': 'David-Kathman.local', 'UID': 'davidk'} 
{'Name': 'Jenn-Roberts.local', 'UID': 'jennr'} 

Mais puisque vous vouloir associer Name avec UID:

>>> reader = csv.reader(open("masterlist.txt"), delimiter='\t') 
>>> _ = next(reader)         # just discarding header 
>>> d = dict(reader) 
>>> d['Carmen-Jackson.local'] 
'carmenj' 
+0

Je ne suis pas sûr de comprendre. environ 300 lignes Comment puis-je extraire l'UID pour un nom donné qui vient du nom d'hôte? – Aaron

+0

@user: voir mon edit – SilentGhost

+0

Ok, je vois ce que vous dites, donc cela crée un dictionnaire et les associe. Je vais ensuite rechercher le nom dans le dictionnaire? En outre, il semble que je reçois une erreur lorsque j'essaie de lancer le script Erreur: caractère de nouvelle ligne vu dans le champ non coté - avez-vous besoin d'ouvrir le fichier en mode universal-newline? – Aaron

2

Je peupleraient un dictionnaire comme celui-ci:

>>> import csv 
>>> name_to_UID = {} 
>>> for row in csv.DictReader(open(filename, 'rU'), delimiter='\t'): 
    name_to_UID[row['Name']] = row['UID'] 
>>> name_to_UID['Carmen-Jackson.local'] 
'carmenj' 
20

Les deux occurrences de « \ XD5 » dans la ligne 194 et la dernière ligne n'a rien à voir avec le problème.

Le problème semble être un bogue, ou un message d'erreur trompeur, ou une documentation incorrecte/vague, dans le module csv Python 2.6.

Dans le fichier, les lignes se terminent par '\ x0D', alias '\ r' dans la tradition Mac classique. La dernière ligne n'est pas terminée, mais cela n'a rien à voir avec le problème. Le message docs for csv.reader indique "Si csvfile est un objet fichier, il doit être ouvert avec le drapeau" b "sur les plateformes où cela fait une différence." Il est largement connu que cela fait une différence sur Windows. Cependant ouvrir le fichier avec 'rb' ou 'r' ne fait aucune différence dans ce cas - toujours le même message d'erreur. La ligne docs for csv.Dialect.lineterminator indique "La chaîne utilisée pour terminer les lignes produites par l'éditeur, par défaut" \ r \ n "Note: Le lecteur est codé en dur pour reconnaître '\ r' ou '\ n' fin-de-ligne, et ignore lineterminator.Ce comportement peut changer dans le futur. " Il semble reconnaître '\ r' comme une nouvelle ligne mais pas comme une fin de ligne/une fin de champ. Le message d'erreur "_csv.Error: caractère de nouvelle ligne vu dans le champ non coté - avez-vous besoin d'ouvrir le fichier en mode universal-newline?"est déroutant, il est reconnu comme une nouvelle ligne, mais il ne traite pas la nouvelle ligne comme une fin de ligne (et donc implicitement comme une fin de champ)

Il apparaît nécessaire d'ouvrir le fichier en mode 'rU' pour le faire fonctionner.Il n'est pas évident pourquoi le même '\ r' reconnu en mode universal-newline est meilleur

+1

Très intéressant. J'ai ajouté le mode 'rU' lors de l'ouverture du fichier et cela a fonctionné tout de suite! J'apprécie vraiment votre aide avec ça. Pour une raison quelconque, lorsque j'utilise name_to_UID ['Aaron-Hoffman.local'], le script s'exécute correctement mais ne renvoie pas l'UID. Mais si j'essaie d'autres personnes comme name_to_UID ['Beth-Johnson'] cela me donne ... Traceback (dernier appel en dernier): Fichier "update.py", ligne 6, en name_to_UID ['Beth- Johnson.local '] KeyError:' Beth-Johnson.local ' – Aaron

+0

(1) l'appréciation est montrée en votant et en acceptant (2) vous semblez avoir deux NOUVEAUX problèmes; lancez une NOUVELLE question et montrez votre script et la traceback complète et un fichier SAMPLE (disons 5 lignes) qui présente le problème. Sinon, vous aurez juste des suppositions comme ceci: le nouveau problème 1 est dû à 'name_to_UID ['Aaron-Hoffman.local']' (une expression qui est évaluée puis ignorée quand elle n'est pas dans l'interpréteur interactif) au lieu de 'print name_to_UID ['Aaron-Hoffman.local'] 'et le nouveau problème 2 est causé par les fautes de frappe –

+0

Qu'est-ce que le paramètre 'U'? Il n'est pas répertorié dans les documents Python. – thebossman