用python中每行文件中的数据类型划分字符串

Dividing a string by type of data inside each line of file in python

可以肯定地说,我在编程和Python方面是个笨蛋,所以我真的需要帮助处理一个文件。

我的文件是一个dat文件,每行有一个整数、一个字符串和一个浮点,我需要将第一个int与其他int进行比较,并将浮点与其他一些值进行比较,我需要将这些值作为数字,而不是作为字符串的一部分来执行一些数学运算。

这是我已经完成的代码,但是我已经浏览了所有的Google,我找不到一个函数可以做到这一点:

1
2
3
4
5
6
7
8
9
10
readfile = open('file_being_read.dat').read()

def parsa_lista(file_to_read):
    converted = []
    for line in file_to_read:
       #conversion should happen here and write it to the list named"converted"
       #my google-fu has failed me..
    return converted

print parsa_lista(readfile)

这个文件看起来像这样,但跨越了大约600行。另外,我是在一个"随学随用"的基础上进行这项工作的,我真的找不到帮助,这可能与缺乏数据类型或其他方面的一些基本知识有关。

这是用"%r"打印的列表输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
...
249 LEU 89.81637573242188

250 ALA 6.454087734222412

251 ILE 42.696006774902344

252 VAL 39.9482421875

253 LEU 58.06844711303711

254 SER 6.285697937011719

255 HIS 22.92508316040039

256 THR 49.1857795715332

257 ASN 15.033650398254395

258 SER 12.086835861206055

259 VAL 28.70435905456543

260 VAL 39.53983688354492

261 ASN 18.63718605041504

262 PRO 15.275177955627441

263 PHE 120.84526062011719

264 ILE 26.20943260192871

265 TYR 16.6826114654541

266 ALA 34.382598876953125

267 TYR 179.9381103515625

268 ARG 77.62599182128906

269 ILE 45.021034240722656

270 ARG 133.72328186035156

...

希望你们能帮助我,即使是一些关于如何拆分字符串和比较值的一般指导原则,我也会非常感激。


伊格纳西奥的回答基本上是完全正确的,他甚至在我开始打字之前就把它贴出来了。不过,让我更详细地解释一下他的两行话。

读取文件

首先,对您的代码进行评论:

1
readfile = open('file_being_read.dat').read()

这将把整个文件读入一个巨大的字符串。当您试图迭代这个字符串时,您将一个字母一个字母地迭代它。将该行改为:

1
readfile = open('file_being_read.dat')

现在,当您迭代这个文件对象时,您将一行一行地读取该文件。

令牌化

您发现迭代一个文件可以让您一行一行地获得文本。现在您需要将每一行拆分为这三个值。

如果这些值由空白分隔(如数据文件摘录),那么python使用str.split方法很容易做到这一点。

1
2
3
4
5
>>> line
'249 LEU 89.81637573242188
'

>>> line.split()
['249', 'LEU', '89.81637573242188']

这些值之间任何数量或类型(制表符、空格)的空白都可以。事实上,即使是后面的换行符也会被剥离掉。现在你有了一个三个字符串的列表。

口译

接下来需要将字符串转换为整数和浮点数。在这里,使用内置函数intfloat

1
2
3
4
5
6
7
8
>>> vals[0]
'249'
>>> int(vals[0])
249
>>> vals[2]
'89.81637573242188'
>>> float(vals[2])
89.816375732421875

此时,您只需要将这些值打包成一个元组,并将它们添加到converted中。

1
2
3
datum = int(vals[0]), vals[1], float(vals[2])
>>> datum
(249, 'LEU', 89.816375732421875)

为什么是元组而不是列表?列表是可变的:您可以添加和删除元素。这可能不是你需要的。

(您可能经常看到元组文字周围的括号。这是少数不需要操作顺序的情况之一。你可以在作业的整个右侧加上大括号,这样就可以了。)

把它放在一起

1
2
3
4
5
6
7
def parsa_lista(file_to_read):
    converted = []
    for line in file_to_read:
        vals = line.split()
        datum = int(vals[0]), vals[1], float(vals[2])
        converted.append(datum)
    return converted


1
2
vals = line.split()
converted.append((int(vals[0]), vals[1], float(vals[2])))