for循环中的Readlines()和计算

时间:2015-01-20 15:40:00

标签: python python-2.7

我有一个非常长的txt文件,基本上有这种结构:

   -97990.580   316472.190   452.080
   -97990.580   316472.190   452.070
   -97990.570   316472.190   452.060
   -97990.600   316472.190   452.040

开头三个空白,三个空白作为分隔符。

我想从第2列中减去一个常量值(-316400,00)。我做了一个for循环,它读取每一行并删除单个变量中的每个值。看起来像这个atm:

lineno=0            #Count lines
output_text = ""    #string variable holding all text to be written to   output file

for filen in change:
    lineno += 1
    finput = file(filen, "r")
    data = finput.readlines()
    linesplit = [elem.strip().split('   ') for elem in data]
    x = linesplit[0]
    print x
    y = linesplit[1] #-316400,00
   print y
   z = linesplit[2]
   print z
   output_text += "%s   %s   %s\n" % (x, y, z)   
   fileout.write(output_text)
   finput.close()
fileout.close()

现在输出文件如下所示:

['-97990.580', '316472.190', '452.080']   ['-97990.580', '316472.190', '452.070']   ['-97990.570', '316472.190', '452.060']

它将原始文本文件中的每一行读取为单个列表的元素(如果我打印lineno它是1)。当然,这种方式当然对y变量的减法也不起作用。我使用这个看起来很奇怪的linetrip变量作为linesplit = data.strip()。split(“”)但不适用于列表('list'对象没有属性'readlines')

这里有什么帮助吗?输出基本上应该是这样的:

  -97990.580   472.190   452.080
  -97990.580   472.190   452.070
  -97990.570   472.190   452.060
  -97990.600   472.190   452.040

2 个答案:

答案 0 :(得分:2)

您制作了一份清单清单:

linesplit = [elem.strip().split('   ') for elem in data]

此处,linesplit中的每个元素也是一个列表,每行一个。然后,您继续处理这些行,就像它们是一个行一样。因此x分配了文件中的第一行,y代表第二行,z分配给第三行。

不是一次性读取所有数据,而是通过循环遍历文件对象逐个处理您的行:

with open(filen, "r") as fileinput:
    for line in fileinput:
        x, y, z = line.split()
        y = float(y) - 316400
        output_text = "{}   {:.3f}   {}\n".format(x, y, z)   
        fileout.write(output_text)

with行使用文件对象作为上下文管理器;退出上下文时(with块结束时)文件会自动关闭。

该行可以与line.split()分开;它会删除前导和尾随空格并在任意宽度空格上拆分,无论是3还是其他。然后我使用元组赋值将得到的3个值放入变量xyz。我通过将y转换为浮点数并减去,为您插入了减法316400。这确实意味着您需要小心将格式化回字符串;我的代码将数字格式化为3位小数。

产生的输出的快速演示:

>>> import sys
>>> sample = '''\
...    -97990.580   316472.190   452.080
...    -97990.580   316472.190   452.070
...    -97990.570   316472.190   452.060
...    -97990.600   316472.190   452.040
... '''.splitlines(True)
>>> for line in sample:
...     x, y, z = line.split()
...     y = float(y) - 316400
...     output_text = "{}   {:.3f}   {}\n".format(x, y, z) 
...     sys.stdout.write(output_text)
... 
-97990.580   72.190   452.080
-97990.580   72.190   452.070
-97990.570   72.190   452.060
-97990.600   72.190   452.040

答案 1 :(得分:-1)

来自我的Optionaly .. 首先,您可以隔离每个数据。

a = ['-97990.580', '316472.190', '452.070']
>>> print a[0], a[1], a[2]
-97990.580 316472.190 452.070
>>>