Python可以在读取文本文件时从字符串中删除双引号吗?

24

我有一个文本文件,类似于这样,有几个5000行:

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]

当双引号在单引号内部时,您需要转义吗? - barkmadley
9个回答

33
for line in open(name, "r"):
    line = line.replace('"', '').strip()
    a, b, c, d = map(float, line.split())

这种方法有点简陋,如果(例如)在该行上没有四个值等情况,它将引发异常。


这样做有什么优点,使其比使用内置模块更好呢?如我在我的答案中所示。 - abyx
7
shlex相当专业化。它对于完成这项任务来说恰好能够完美运作,但对于提问者来说,学习一些更基础和更灵活的工具可能更重要。 - Ned Batchelder
虽然有一些模块可以去除双引号,但一个简单的映射函数确实可以完成所需的操作,而且没有必要去掉引号,因为浮点函数会处理该转换。 - gr8tech
@gr8tech float() 不会去除双引号。 - Ned Batchelder
这是我做的list(map(float,[1.2,1.3,"5.4"])),也许我漏掉了什么? - gr8tech
这是一个包含两个浮点数和一个字符串的列表。该字符串中没有双引号。尝试一下:float('"3.14"') - Ned Batchelder

14

有一个可以从标准库中使用的模块叫做shlex:

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

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

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]

1
它也可以以不同的方式执行:http://docs.python.org/library/csv.html#csv.QUOTE_ALL - SilentGhost

7
或者您可以直接替换您的行

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

使用以下内容:

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

5

我使用了essence来去除 "25" 中的引号,具体操作如下:

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

1

我认为最简单和最有效的方法是对其进行切片!

根据您的代码:

d = l[3]
returns "6.5"

因此,您只需要添加另一个语句:

d = d[1:-1]

现在它将返回6.5,不带前导和末尾的双引号。

哇! :)


不,这就是 string.replace(), strip() 的作用。但是有更好的方法来取消引号化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']

0
你可以使用正则表达式,尝试像这样的东西。
import re
re.findall("[0-9.]+", file(name).read())

这将为您提供文件中所有数字的字符串列表,不带任何引号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接