在Python中按行内数据类型划分字符串
我可以说我在编程和Python方面还是个新手,所以我真的需要帮助来处理一个文件。
我的文件是一个.dat格式的文件,每一行都有一个整数、一个字符串和一个浮点数。我需要把第一个整数和其他整数进行比较,把浮点数和某个值进行比较。我需要把这些值当作数字来用,而不是字符串,这样我才能进行一些数学运算。
这是我写的代码,但我在网上找了很多地方,都找不到能做到这一点的函数:
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 个回答
在编程中,有时候我们需要把一些数据从一个地方传到另一个地方。这就像把一封信从一个人手里递给另一个人一样。在这个过程中,我们可能会遇到一些问题,比如数据格式不对,或者数据传输的速度太慢。
为了让数据传输更顺利,我们可以使用一些工具和方法。比如,有些编程语言提供了内置的函数,可以帮助我们快速处理数据。还有一些库(可以理解为一组现成的工具),可以让我们更方便地进行数据传输。
总之,数据传输是编程中很重要的一部分,掌握一些基本的方法和工具,可以让我们的工作变得更加高效。
vals = line.split()
converted.append((int(vals[0]), vals[1], float(vals[2])))
Ignacio的回答基本上是完全正确的,他在我开始打字之前就已经发了。不过,让我详细解释一下他的两行代码。
读取文件
首先,先说说你的代码的问题:
readfile = open('file_being_read.dat').read()
这段代码会把整个文件的内容读成一个巨大的字符串。当你尝试逐字遍历这个字符串时,你会一个字母一个字母地读取。把那行代码改成这样:
readfile = open('file_being_read.dat')
现在,当你遍历这个文件对象时,你会一行一行地读取文件。
分割数据
你发现遍历文件可以一行一行地获取文本。接下来,你需要把每一行分割成三个值。
如果这些值是用空格分开的(就像你的数据文件片段),Python提供了一个很简单的方法来做到这一点,使用str.split
方法。
>>> line
'249 LEU 89.81637573242188\n'
>>> line.split()
['249', 'LEU', '89.81637573242188']
在这些值之间的任何数量或类型的空白(比如制表符、空格)都是可以的。实际上,最后的换行符也会被去掉。所以现在你得到了一个包含三个字符串的列表。
解释数据
接下来,你需要把这些字符串转换成整数和浮点数。在这里,可以使用内置的int
和float
函数。
>>> 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