2009-11-10 16 views
21

Mam plik tekstowy, jak ten, z kilkoma liniami 5000:Czy Python może usuwać podwójne cudzysłowy z ciągu znaków podczas czytania w pliku tekstowym?

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

więc ostatni termin oznacza liczbę pomiędzy cudzysłowach.

Co chcę zrobić to za pomocą Python (jeśli to możliwe), aby przypisać cztery kolumny podwoić zmienne. Ale głównym problemem jest ostatni termin, nie znalazłem sposobu na usunięcie podwójnego cudzysłowu na numer, czy to możliwe w Linuksie?

To co próbowałem:

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

ed, aby uniknąć podwójnych cudzysłowów, gdy znajdują się w cudzysłowach? – barkmadley

Odpowiedz

11

Moduł csv (biblioteka standardowa) robi to automatycznie, mimo że dokumentacja nie jest bardzo specyficzny o 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()) 

Jest to rodzaj goły, a jeśli będzie podnosić wyjątki (na przykład) nie istnieją cztery wartości na linii, itp

+0

Czy jest jakikolwiek powód, dla którego jest to lepsze niż użycie wbudowanego modułu do tego celu, co pokazałem w mojej odpowiedzi? – abyx

+6

'shlex' jest dość wyspecjalizowany. Zdarza się, że doskonale nadaje się do tego zadania, ale może być ważniejsze dla OP, aby najpierw nauczyć się bardziej podstawowych i bardziej elastycznych narzędzi. –

+0

chociaż istnieją moduły zdolne do usuwania podwójnych cudzysłowów, prosta funkcja mapy naprawdę spełnia to, co jest wymagane i nie ma potrzeby usuwania cudzysłowów, ponieważ funkcja float zajmie się tą konwersją – gr8tech

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

Inną opcją jest użycie wbudowanego modułu, czyli przeznaczonego do tego zadania w postaci. mianowicie 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 nie wiedział csv paski cytuje – abyx

+1

może to zrobić w inny sposób też: http://docs.python.org/library/csv.html#csv.QUOTE_ALL – SilentGhost

0

Można użyć wyrażenia regularnego, spróbuj coś takiego

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

to daje listę wszystkich numerów w pliku jako ciągi bez żadnych cytatów.

6

Albo można po prostu zastąpić linię

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

z tym:

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

Cześć, dziękuję, to jest najlepsze podejście, które znalazłem dla mojego problemu. – flow

14

Jest moduł można skorzystać ze standardowej biblioteki nazywa shlex:

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

myślę najłatwiejszą i najskuteczniejszą rzeczą byłoby pokroić to!

ze swojego kodu:

d = l[3] 
returns "6.5" 

tak po prostu dodać kolejne oświadczenie:

d = d[1:-1] 

teraz powróci 6.5 bez początkowego i kończy cudzysłów.

altówka!:)

+0

Nie, do tego służą 'string.replace(), strip()'. Istnieją jednak lepsze metody, aby odliczyć linię formatu CSV lub formatu oddzielanego spacjami. – smci

0

IMHO, najbardziej uniwersalny doublequote spychacz jest to:

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

Użyłem w istocie, aby usunąć "w" 25 "przy użyciu

Code: 
     result = result.strip("\"") #remove double quotes characters 
Powiązane problemy