在python中按文件的每一行内的数据类型划分字符串

时间:2010-11-26 21:40:38

标签: python string list types split

可以肯定地说我是编程和python中的菜鸟,所以我真的需要帮助处理文件。

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

这是我已经完成的代码,但是我已经查看了谷歌,我找不到这样做的函数:

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”打印:

...
249 LEU 89.81637573242188\n
250 ALA 6.454087734222412\n
251 ILE 42.696006774902344\n
252 VAL 39.9482421875\n
253 LEU 58.06844711303711\n
254 SER 6.285697937011719\n
255 HIS 22.92508316040039\n
256 THR 49.1857795715332\n
257 ASN 15.033650398254395\n
258 SER 12.086835861206055\n
259 VAL 28.70435905456543\n
260 VAL 39.53983688354492\n
261 ASN 18.63718605041504\n
262 PRO 15.275177955627441\n
263 PHE 120.84526062011719\n
264 ILE 26.20943260192871\n
265 TYR 16.6826114654541\n
266 ALA 34.382598876953125\n
267 TYR 179.9381103515625\n
268 ARG 77.62599182128906\n
269 ILE 45.021034240722656\n
270 ARG 133.72328186035156\n
...

希望你们可以帮助我,甚至一些关于如何分割字符串和比较值的一般指导将非常感激。

2 个答案:

答案 0 :(得分:4)

Ignacio's answer基本上是完全正确的,并且在我开始输入之前他发布了它。但是,让我更详细地解释一下他的双线。

读取文件

首先,批评你的代码:

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

这会将整个文件读出一个巨大的字符串。当您尝试迭代此字符串时,您将逐字逐句地迭代它。将该行更改为:

readfile = open('file_being_read.dat')

现在,当您遍历此文件对象时,您将逐行读取该文件。

Tokenising

您已经发现迭代文件可以逐行获取文本。现在,您需要将每一行拆分为这三个值。

如果值是用空格分隔的(就像你的数据文件摘录一样),那么Python可以通过str.split method轻松实现这一点。

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

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

解释

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

>>> vals[0]
'249'
>>> int(vals[0])
249
>>> vals[2]
'89.81637573242188'
>>> float(vals[2])
89.816375732421875

此时,您只需将这些值打包成一个元组并将其添加到converted

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

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

(你可能经常看到一个元组文字周围的括号。这是操作顺序使它们不必要的少数几次之一。你可以在任务的整个右侧放置大括号,它会正常工作。)

把它放在一起

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