我有一个非常长的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
答案 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个值放入变量x
,y
和z
。我通过将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
>>>