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]
4

9 回答 9

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

这是一种准系统,如果(例如)在线上没有四个值等情况下会引发异常。

于 2009-11-10T12:23:54.880 回答
14

您可以使用标准库中的一个模块shlex

>>> import shlex
>>> print shlex.split('5.6  4.5  6.8  "6.5"')
['5.6', '4.5', '6.8', '6.5']
于 2009-11-10T12:31:50.627 回答
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
于 2012-10-22T14:25:26.377 回答
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]
于 2009-11-10T12:24:25.113 回答
7

或者您可以简单地替换您的线路

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

有了这个:

l = re.split('[\s"]+',string.strip(line))
于 2009-11-10T12:28:50.780 回答
5

我本质上使用删除“25”中的“

Code:
        result = result.strip("\"") #remove double quotes characters 
于 2016-01-21T23:50:43.523 回答
1

我认为最简单、最有效的做法就是将其切片!

从您的代码:

d = l[3]
returns "6.5"

所以你只需添加另一个语句:

d = d[1:-1]

现在它将返回 6.5 没有前导和结束双引号。

中提琴!:)

于 2012-10-16T23:10:36.763 回答
0

你可以使用正则表达式,试试这样的

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

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

于 2009-11-10T12:27:30.587 回答
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']
于 2015-06-12T07:45:23.887 回答