我想要阅读的文件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]
我可以更轻松,更简单地编写此流程吗?
答案 0 :(得分:3)
我实际上质疑你是否需要三个独立的变量 保持每行的值。只需使用2d列表来保存值 来自文件的每一行。
您的代码有一个小错误。您需要访问文件每行中每个值的1
st索引。 1
以下是具有上述修改的代码:
with open('hoge.txt') as file:
lines = file.readlines()
data = [[float(val[1]) for val in line.split()] for line in lines]
# ... use `data`
1 我当然假设你文件中的值是 不 占位符。如果是,那么只需float(val)
即可。
答案 1 :(得分:3)
您可以采取一些措施来改进您提到的来源。作为免责声明,我假设您的文件中的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()
函数来读取文件,如果您希望在示例代码中调换行和列,则可以在生成的DataFrame对象上使用.T
属性。
此外,您的代码冗长的部分原因是该文件自然不符合您的使用方式。如果你有这样的灵活性,并且不需要其他任何文件,那么更自然的格式是
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])