2009-11-10 130 views
21

que tienen algún archivo de texto como este, con varias líneas de 5000:¿Puede Python eliminar las comillas dobles de una cadena, al leer en el archivo de texto?

5.6 4.5 6.8 "6.5" (new line) 
5.4 8.3 1.2 "9.3" (new line) 

por lo que el último término es un número entre comillas dobles.

Lo que quiero hacer es usar Python (si es posible) para asignar las cuatro columnas a las variables dobles. Pero el problema principal es el último término, no encontré la manera de eliminar las comillas dobles del número, ¿es posible en Linux?

Esto es lo que he intentado:

#!/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] 
+0

hace usted ne ed para escapar de las comillas dobles cuando están dentro de comillas simples? – barkmadley

Respuesta

11

El csv módulo (biblioteca estándar) lo hace automáticamente, aunque la documentación no es muy específico sobre 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 
29
for line in open(name, "r"): 
    line = line.replace('"', '').strip() 
    a, b, c, d = map(float, line.split()) 

Esta es una especie de escueto, y se provoca excepciones si (por ejemplo) no son cuatro valores en la línea, etc.

+0

¿Hay alguna razón por la que esto sea preferible al uso de un módulo integrado para este propósito, como lo he mostrado en mi respuesta? – abyx

+6

'shlex' es bastante especializado. Funciona perfectamente para esta tarea, pero puede ser más importante para el OP aprender primero algunas de las herramientas más básicas y más flexibles. –

+0

Aunque hay módulos capaces de eliminar comillas dobles, una simple función de mapa realmente logra lo que se requiere y no hay necesidad de quitar las comillas ya que la función flotante se ocupará de esa conversión – gr8tech

9
for line in open(fname): 
    line = line.split() 
    line[-1] = line[-1].strip('"\n') 
    floats = [float(i) for i in line] 

otra opción es utilizar el módulo incorporado, es decir destinados para esta tarea. es decir, 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] 
+0

+1 no conoce las tiras csv – abyx

+1

puede hacerlo de otra manera: http://docs.python.org/library/csv.html#csv.QUOTE_ALL – SilentGhost

0

Puede utilizar expresiones regulares, intentar algo como esto

import re 
re.findall("[0-9.]+", file(name).read()) 

Esto le dará una lista de todos los números en su archivo como cadenas sin las comillas.

6

O puede simplemente reemplazar su línea de

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

con esto:

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

hola, gracias, este es el mejor enfoque que encontré para mi problema – flow

14

Hay un módulo que se puede utilizar de la biblioteca estándar llamado shlex:

>>> import shlex 
>>> print shlex.split('5.6 4.5 6.8 "6.5"') 
['5.6', '4.5', '6.8', '6.5'] 
1

pienso ¡lo más fácil y eficiente sería rebanarlo!

Desde su código:

d = l[3] 
returns "6.5" 

por lo que simplemente añadir otra declaración:

d = d[1:-1] 

ahora se volverán 6.5 sin el líder y terminar comillas dobles.

viola!:)

+0

No, para eso son 'string.replace(), strip()'. Pero hay mejores métodos para desmarcar una línea de formato separado por csv o whitespace. – smci

0

en mi humilde opinión, el separador comillas dobles más universal es la siguiente:

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'] 
5

Utilicé en esencia para quitar el "en" 25 "usando

Code: 
     result = result.strip("\"") #remove double quotes characters 
Cuestiones relacionadas