2009-11-10 1 views
21

У меня есть текстовый файл, как это, с несколькими линиями 5000:Может ли Python удалять двойные кавычки из строки при чтении в текстовом файле?

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

поэтому последний член представляет собой число двойных кавычек.

Что я хочу сделать, используя Python (если возможно), чтобы назначить четыре столбца для двойных переменных. Но главной проблемой является последний термин, я не нашел способа удалить двойные кавычки в число, возможно ли это в Linux?

Это то, что я пробовал:

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

do you ne чтобы избежать двойных кавычек, когда они находятся внутри одинарных кавычек? – barkmadley

ответ

11

csv модуль (стандартная библиотека) делает это автоматически, хотя документы не очень специфичен о 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()) 

Это своего рода скелетные, и будет вызывать исключения, если (например) не четыре значения на линии и т.д.

+0

Есть ли причина, почему это предпочтительнее использовать встроенный модуль для этой цели, как я показал в своем ответе? – abyx

+6

'shlex' довольно специализирован. Случается, что он отлично работает для этой задачи, но для OP может быть более важным изучить некоторые из наиболее простых и гибких инструментов. –

+0

, хотя есть модули, способные удалять двойные кавычки, простая функция карты действительно выполняет то, что требуется, и нет необходимости снимать кавычки, поскольку функция float позаботится об этом преобразовании – gr8tech

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

другой вариант заключается в использовании встроенный модуль, который предназначен для выполнения этой задачи. а именно 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 не знаю, кавычки csv strips – abyx

+1

он может сделать это и по-другому: http://docs.python.org/library/csv.html#csv.QUOTE_ALL – SilentGhost

0

Вы можете использовать регулярное выражение, попробовать что-то вроде этого

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

Это даст вам список всех чисел в файле в виде строк без всяких кавычек.

6

Или вы можете просто заменить строку

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

с этим:

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

привет, спасибо, это лучший подход, который я нашел для своей проблемы – flow

14

Там есть модуль, который вы можете использовать из стандартной библиотеки под названием shlex:

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

Я думаю, самым простым и эффективным способом было бы нарезать его!

Из кода:

d = l[3] 
returns "6.5" 

так что вы просто добавить еще одно заявление:

d = d[1:-1] 

теперь будет возвращать 6.5 без ведущих и закончить двойные кавычки.

альт!:)

+0

Нет, вот что такое 'string.replace(), strip()' for. Но есть более эффективные методы, позволяющие исключить строку csv или формат, разделенный пробелами. – smci

0

ИМХО, самая универсальная двойная кавычка стриптизерша это:

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

Я использовал по существу для удаления «in» 25 »с использованием

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