web-dev-qa-db-fra.com

Peut Python supprimer les guillemets doubles d'une chaîne, lors de la lecture dans un fichier texte?

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]
22
Open the way

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
11
Antony Hatchkins
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.

31
Ned Batchelder

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']
14
abyx
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]
9
SilentGhost

Ou vous pouvez simplement remplacer votre ligne

l = re.split("\s+",string.strip(line)).replace('\"','')

avec ça:

l = re.split('[\s"]+',string.strip(line))
7
yu_sha

J'ai utilisé essentiellement pour supprimer le "dans" 25 "en utilisant

Code:
        result = result.strip("\"") #remove double quotes characters 
5
Masud Syed

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! :)

1
A.R.B

À 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']
0
AlexCross

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.

0
Serge