Python将列中写入的文本文件读入列表

时间:2018-02-09 02:15:25

标签: 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]

我可以更轻松,更简单地编写此流程吗?

2 个答案:

答案 0 :(得分:3)

  • 您可以使用context manger statement with

  • 我实际上质疑你是否需要三个独立的变量 保持每行的值。只需使用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等...是数字值的占位符,因为否则您可能会更好,而不会弄乱文件。如果这是一个不好的假设,请告诉我,以便我可以编辑我的答案。

  1. 文件对象实际上是可迭代的,无需拨打read()readlines()
  2. 使用关键字with的上下文管理器可以确保文件在完成后关闭。
  3. 我一直认为这是一个巧妙的技巧,你可以使用zip(*[...])来转置行和列。
  4. 使用多项作业,您可以获得所需的明确xyz个变量。
  5. 最初询问问题的方式,xyz会有相同的内容并忽略您正在阅读的大部分文件。假设这是不受欢迎的行为,我修复了错误。
  6. 总之,您将获得以下源代码:

    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])