J'ai un fichier texte comme celui-ci, avec plusieurs 5000 lignes:
5.6 4.5 6.8 "6.5" (new line)
5.4 8.3 1.2 "9.3" (new line)
donc le dernier terme est un nombre entre guillemets doubles.
Ce que je veux faire, c'est en utilisant Python (si possible), pour affecter les quatre colonnes à des variables doubles. Mais le problème principal est le dernier terme, je n'ai trouvé aucun moyen de supprimer les guillemets doubles au nombre, est-ce possible sous linux?
Voici ce que j'ai essayé:
#!/usr/bin/python
import os,sys,re,string,array
name=sys.argv[1]
infile = open(name,"r")
cont = 0
while 1:
line = infile.readline()
if not line: break
l = re.split("\s+",string.strip(line)).replace('\"','')
cont = cont +1
a = l[0]
b = l[1]
c = l[2]
d = l[3]
Le module csv
(bibliothèque standard) le fait automatiquement, bien que la documentation ne soit pas très spécifique sur skipinitialspace
>>> import csv
>>> with open(name, 'rb') as f:
... for row in csv.reader(f, delimiter=' ', skipinitialspace=True):
... print '|'.join(row)
5.6|4.5|6.8|6.5
5.4|8.3|1.2|9.3
for line in open(name, "r"):
line = line.replace('"', '').strip()
a, b, c, d = map(float, line.split())
C'est une sorte de bare-bones, et soulèvera des exceptions s'il n'y a pas (par exemple) quatre valeurs sur la ligne, etc.
Il y a un module que vous pouvez utiliser dans la bibliothèque standard appelé shlex
:
>>> import shlex
>>> print shlex.split('5.6 4.5 6.8 "6.5"')
['5.6', '4.5', '6.8', '6.5']
for line in open(fname):
line = line.split()
line[-1] = line[-1].strip('"\n')
floats = [float(i) for i in line]
une autre option consiste à utiliser le module intégré, c'est-à-dire prévu pour cette tâche. à savoir csv
:
>>> import csv
>>> for line in csv.reader(open(fname), delimiter=' '):
print([float(i) for i in line])
[5.6, 4.5, 6.8, 6.5]
[5.6, 4.5, 6.8, 6.5]
Ou vous pouvez simplement remplacer votre ligne
l = re.split("\s+",string.strip(line)).replace('\"','')
avec ça:
l = re.split('[\s"]+',string.strip(line))
J'ai utilisé essentiellement pour supprimer le "dans" 25 "en utilisant
Code:
result = result.strip("\"") #remove double quotes characters
Je pense que la chose la plus simple et la plus efficace à faire serait de la couper!
Depuis votre code:
d = l[3]
returns "6.5"
vous ajoutez donc simplement une autre déclaration:
d = d[1:-1]
maintenant, il renverra 6.5 sans les guillemets de début et de fin.
alto! :)
À mon humble avis, le décapant double guillemet le plus universel est le suivant:
In [1]: s = '1 " 1 2" 0 a "3 4 5 " 6'
In [2]: [i[0].strip() for i in csv.reader(s, delimiter=' ') if i != ['', '']]
Out[2]: ['1', '1 2', '0', 'a', '3 4 5', '6']
Vous pouvez utiliser regexp, essayez quelque chose comme ça
import re
re.findall("[0-9.]+", file(name).read())
Cela vous donnera une liste de tous les numéros de votre fichier sous forme de chaînes sans guillemets.