2009-11-10 10 views
21

Ich habe einige Textdatei wie diese, mit mehreren 5000 Zeilen:Kann Python doppelte Anführungszeichen aus einer Zeichenfolge entfernen, wenn Textdateien eingelesen werden?

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

so der letzte Term ist eine Zahl zwischen doppelten Anführungszeichen.

Was ich tun möchte, ist, mit Python (wenn möglich), die vier Spalten zu Doppelvariablen zuweisen. Aber das Hauptproblem ist der letzte Begriff, ich fand keine Möglichkeit, die Anführungszeichen auf die Zahl zu entfernen, ist es in Linux möglich?

Dies ist, was ich versuchte:

#!/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

zu entfernen ed, um doppelte Anführungszeichen zu vermeiden, wenn sie in einfachen Anführungszeichen stehen? – barkmadley

Antwort

11

Das csv Modul (Standardbibliothek) tut es automatisch, obwohl die Dokumentation über 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()) 

Diese Art von nackten Knochen sind, und Ausnahmen auslösen, wenn (zum Beispiel) gibt es nicht mehr als vier Werte auf der Linie sind, usw.

+0

Gibt es einen Grund, warum dies vorzuziehen ist, ein eingebautes Modul für diesen Zweck zu verwenden, wie ich in meiner Antwort gezeigt habe? – abyx

+6

'shlex' ist ziemlich spezialisiert. Es funktioniert perfekt für diese Aufgabe, aber es ist vielleicht wichtiger für das OP, einige der grundlegenderen und flexibleren Werkzeuge zuerst zu lernen. –

+0

obwohl es Module gibt, die in der Lage sind, doppelte Anführungszeichen zu entfernen, führt eine einfache Map-Funktion wirklich, was erforderlich ist, und es gibt keine Notwendigkeit, die Anführungszeichen zu entfernen, da die Float-Funktion die Konvertierung übernimmt – gr8tech

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

eine weitere Option Einbaumodul zu verwenden, das heißt für diese Aufgabe bestimmt. nämlich 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 kannte keine csv stripes quotes – abyx

+1

es kann es auch anders machen: http://docs.python.org/library/csv.html#csv.QUOTE_ALL – SilentGhost

0

Sie können regexp verwenden, versuchen Sie so etwas wie dieses

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

Sie Dies gibt eine Liste aller Zahlen in der Datei als Strings ohne Anführungszeichen.

6

Oder Sie können einfach Ihre Linie

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

mit diesem ersetzen:

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

Hi, danke, das ist der beste Ansatz, den ich für mein Problem gefunden habe – flow

14

Es ist ein Modul, das Sie aus der Standardbibliothek shlex genannt verwenden:

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

Ich denke, die einfachste und effizienteste Sache wäre es, es zu schneiden!

aus dem Code:

d = l[3] 
returns "6.5" 

so fügen Sie einfach eine andere Erklärung:

d = d[1:-1] 

jetzt wird es 6.5 zurückzukehren, ohne den führenden und doppelte Anführungszeichen enden.

Viola!:)

+0

Nein, das ist, was 'string.replace(), strip()' sind. Aber es gibt bessere Methoden, um eine Zeile mit csv oder whitespace-separated Format zu entfernen. – smci

0

IMHO nicht sehr spezifisch ist, ist die universellste double Stripper dies:

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

Ich benutzte im Wesentlichen, um die "in" 25 "mit

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