Texte de l'Analyse du Fichier avec Python
Je suis en train d'analyser une série de fichiers texte et de les enregistrer dans des fichiers CSV à l'aide de Python (2.7.3). Tous les fichiers texte ont un 4 ligne d'en-tête qui doit être extirpé. Les lignes de données ont différents délimiteurs y compris " (citation), - (dash): colonne, et le vide de l'espace. J'ai trouvé que c'était une douleur de code en C++ avec tous ces différents délimiteurs, j'ai donc décidé de l'essayer en Python audience, il est relativement plus facile à faire par rapport au C/C++.
J'ai écrit un bout de code pour tester une seule ligne de données et cela fonctionne, cependant, je n'arrivais pas à le faire fonctionner pour le fichier réel. Pour l'analyse d'une seule ligne, j'ai été à l'aide de l'objet de texte et "remplacer" la méthode. Il semble que mon actuel de mise en œuvre de lit le fichier texte sous forme de liste, et il n'y a pas de remplacement de la méthode pour les objets de la liste.
Étant un novice en Python, je me suis coincé à ce point. Toute entrée serait appréciée!
Merci!
# function for parsing the data
def data_parser(text, dic):
for i, j in dic.iteritems():
text = text.replace(i,j)
return text
# open input/output files
inputfile = open('test.dat')
outputfile = open('test.csv', 'w')
my_text = inputfile.readlines()[4:] #reads to whole text file, skipping first 4 lines
# sample text string, just for demonstration to let you know how the data looks like
# my_text = '"2012-06-23 03:09:13.23",4323584,-1.911224,-0.4657288,-0.1166382,-0.24823,0.256485,"NAN",-0.3489428,-0.130449,-0.2440527,-0.2942413,0.04944348,0.4337797,-1.105218,-1.201882,-0.5962594,-0.586636'
# dictionary definition 0-, 1- etc. are there to parse the date block delimited with dashes, and make sure the negative numbers are not effected
reps = {'"NAN"':'NAN', '"':'', '0-':'0,','1-':'1,','2-':'2,','3-':'3,','4-':'4,','5-':'5,','6-':'6,','7-':'7,','8-':'8,','9-':'9,', ' ':',', ':':',' }
txt = data_parser(my_text, reps)
outputfile.writelines(txt)
inputfile.close()
outputfile.close()
OriginalL'auteur marillion | 2012-08-13
Vous devez vous connecter pour publier un commentaire.
Je voudrais utiliser un
for
boucle pour parcourir les lignes dans le fichier texte:Si vous souhaitez lire le fichier ligne par ligne, au lieu de charger l'ensemble de la chose au début du script, vous pourriez faire quelque chose comme ceci:
txt = data_parser(my_text, reps)
avec la boucle que vous avez ci-dessus.Vous avez déjà sauté le premier 4 lignes avec la ligne
my_text = inputfile.readlines()[4:]
, si vous préférez lire le fichier ligne par ligne et de ne pas charger le tout dans de la ram au début du script, je peux mettre à jour ma réponse.Désolé, je l'ai eu mal à la première place (voir mon EDIT plus haut), mais merci, ça fonctionne parfaitement!!! Maintenant, je serais très heureux d'apprendre au sujet de la "ligne de lecture-analyser-écrire (ligne par ligne)" façon de faire les choses. J'ai quelques fichiers fichier volumineux avec une taille de +500 MO, ce qui peut gâcher les choses. Pourriez-vous mettre à jour votre réponse avec un deuxième exemple?
J'ai mis à jour ma réponse avec une version qui lit le fichier d'entrée d'une ligne à la fois.
Grandement apprécié, merci!
for i in range(4): inputfile.next()
était ce que je cherchais avant de décider de lire l'ensemble de la chose par le moyen!OriginalL'auteur Joe Day
De la accepté de répondre, elle ressemble à votre comportement souhaité est à son tour
en
Si c'est vrai, alors je pense que quelque chose comme
serait un peu plus simple que la
reps
choses.reps
peu, mais il a trouvé de la documentation un peu de confusion. Votre exemple, il est beaucoup clair. Je vais essayer ça, juste pour le plaisir de l'apprentissage. 1. voulez-vous éliminer les guillemets dans le fichier texte parquoting=False
? 2. pourriez-vous vérifier ma compréhension?date
ligne dans le code divise la partie date de la première et devient une liste par lui-même,day
ettime
sont divisées suivant, et le reste de la ligne est ajoutée à laday
ettime
. Je ne suis pas sûr de savoir comment il ajoute automatiquement des virgules si, dans votrenewline = day + time + line[1]
ligne. Hmm...Oui, il ya beaucoup de différents devis d'options. Je pense que c'est un peu étrange de se débarrasser d'eux tous, en fait, mais peut-être que vous avez besoin pour une raison quelconque. (2) Yep. Les virgules ne sont pas ajoutés dans
newline
- c'est juste une liste.writerow
est lewriter
méthode qui ajoute une virgule à la chaîne de sortie (ou d'onglets ou de tout autre délimiteur nous avons voulu) et serait en mesure de gérer en citant si nous voulions le faire.Ok, je pense que je l'ai eu. De Plus, vous jamais eu besoin d'analyser les données de la portion de la ligne, car il était déjà séparés par des virgules. Une bonne information, merci beaucoup!
OriginalL'auteur DSM
Il existe quelques façons d'aller à ce sujet. Une option serait d'utiliser
inputfile.read()
au lieu deinputfile.readlines()
- vous auriez besoin d'écrire de code distinct pour dépouiller les quatre premières lignes, mais si vous voulez le résultat final comme une seule chaîne de toute façon, cela pourrait faire le plus de sens.Une seconde, option plus simple serait de rejoindre les cordes après entrelacement les quatre premières lignes avec
my_text = ''.join(my_text)
. C'est un peu inefficace, mais si la vitesse n'est pas une préoccupation majeure, le code sera plus simple.Enfin, si vous voulez vraiment la sortie comme une liste de chaînes de caractères au lieu d'une seule chaîne de caractères, vous pouvez simplement modifier vos données de l'analyseur d'itérer sur la liste. Qui pourrait ressemble à quelque chose comme ceci:
OriginalL'auteur Julian