Skip to main content
 首页 » 编程设计

Python 将写在列中的文本文件读取到列表中

2025年05月04日15Free-Thinker

我要读取的文件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 等...是数值的占位符,否则您最好不要弄乱文件。如果这是一个错误的假设,请告诉我,以便我修改我的答案。

  1. 文件对象实际上是可迭代的,不需要调用read() 或readlines()。
  2. 使用带有关键字 with 的上下文管理器可以确保文件在您用完后关闭。
  3. 我一直认为使用 zip(*[...]) 来转置行和列是一个绝妙的技巧。
  4. 使用多重赋值,您可以获得您想要的显式x、y 和z 变量。
  5. 按照问题最初提出的方式,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])