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

标签 python list-comprehension python-3.6

我要读取的文件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. 使用多重赋值,您可以获得您想要的显式xyz 变量。
  5. 按照问题最初提出的方式,xyz 具有相同的内容,并且忽略了您提出的大部分文件正在读。假设这是不受欢迎的行为,我修复了错误。

总之,您将获得以下源代码:

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/

相关文章:

python - 如何在 python 3.6 以下获得类似 Mock().assert_used_once 的行为?

python - 如何覆盖 Flask 配置中的配置参数?

python - 如何找出我的 Python 安装中有哪个 VM?

python - 使用元组过滤和拆包处理空情况

python - 格式化序列中的整数(列表、元组、集合)

python - 根据项目中的值从列表中提取位置

python - 无法使用 pip Python 3.6 安装 numpy 或 pygame

python - 如何统计用户输入错误的次数

javascript - 是否可以在 Javascript 中完成这个简单的 Haskell 赋值?

Erlang 列表理解、排列