我要读取的文件hoge.txt
如下
x1 y1 z1
x2 y2 z2
x3 y3 z3
我的代码是
lines = open('hoge.txt').readlines()
line_parts = [line.split() for line in lines]
x = [float(v[0]) for v in line_parts]
y = [float(v[0]) for v in line_parts]
z = [float(v[0]) for v in line_parts]
我可以更轻松、更简单地编写此流程吗?
最佳答案
您可以做几件事来改进您提到的来源。作为免责声明,我假设您文件中的 x1、x2 等...是数值的占位符,否则您最好不要弄乱文件。如果这是一个错误的假设,请告诉我,以便我修改我的答案。
- 文件对象实际上是可迭代的,不需要调用
read()
或readlines()
。 - 使用带有关键字
with
的上下文管理器可以确保文件在您用完后关闭。 - 我一直认为使用
zip(*[...])
来转置行和列是一个绝妙的技巧。 - 使用多重赋值,您可以获得您想要的显式
x
、y
和z
变量。 - 按照问题最初提出的方式,
x
、y
和z
具有相同的内容,并且忽略了您提出的大部分文件正在读。假设这是不受欢迎的行为,我修复了错误。
总之,您将获得以下源代码:
with open('hoge.txt') as file:
x, y, z = zip(*[[float(el) for el in line] for line in file])
可能值得一提的是,对于您可能想要对这些数据执行的任何操作,模块 pandas
可能是您想要使用的工具。您可以使用 read_csv()
函数读取文件,如果您希望像示例代码中那样转置行和列,则可以使用 .T
属性生成的 DataFrame 对象。
此外,您的代码冗长的部分原因是该文件与您想要的使用方式不自然一致。如果您有这样的灵 active 并且不需要该文件做任何其他事情,则更自然的格式是
x1 x2 x3
y1 y2 y3
z1 z2 z3
然后您可以使用稍微不那么冗长的代码。
with open('hoge.txt') as file:
x, y, z = [[float(el) for el in line] for line in file]
最后,对于列表中所有内容的简单类型转换,numpy
模块使用起来很愉快(经过中等学习曲线)并承认 astype()
其数组对象上的方法。或者,如果您想使用原始 Python 列表,我发现 map()
函数在这种情况下更容易阅读。由于您使用的是 Python 3,因此您需要导入 map()
。
from itertools import map
with open('hoge.txt') as file:
x, y, z = zip(*[map(float, line) for line in file])
关于Python 将写在列中的文本文件读取到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48697772/