我尝试按以下格式修改制表符分隔的文件
Channel Text File
Prj unnamed
Author [Unknown]
JobMode Grid
XCells 512
YCells 384
[...]
4,041000;4,041000;4,041000 90,000000;90,000000;90,000000 Aluminum 11 225
Phase X Y Bands Error Euler1 Euler2 Euler3 MAD BC BS
0 0.0000 0.0000 0 3 0.0000 0.0000 0.0000 0.0000 0 255
0 0.5000 0.0000 0 3 0.0000 0.0000 0.0000 0.0000 0 255
0 0.9999 0.0000 0 3 0.0000 0.0000 0.0000 0.0000 0 255
[...]
1 110.49 43.997 12 0 119.81 43.402 254.14 1.0830 199 255
1 110.99 43.997 12 0 119.41 43.282 254.29 1.2132 187 255
1 111.49 43.997 11 0 119.76 43.065 253.84 0.9688 184 255
1 111.99 43.997 12 0 119.69 42.989 253.87 1.0751 189 255
[...]
我希望找到 X 的最大值,根据 Xmax 修改 X 以及更改 Euler1 每行输出180,并将包括标题行在内的所有数据写入新文件。我搜索并发现csv模块适合此目的。所以,我做的是
import csv
from itertools import islice
headerLines = 15
with open("input", "r") as inf:
with open('output', 'w') as outf:
inReader = csv.reader(inf, delimiter='\t')
outWriter = csv.writer(outf, delimiter="\t")
Xmax = max(float(row[1]) for row in islice(inReader, headerLines, None))
for i,row in enumerate(inReader):
if i < headerLines:
outWriter.writerow(row)
else:
row[1] = str(float(row[1])*(-1)+Xmax)
row[5] = str(float(row[5])-180)
outWriter.writerow(row)
我的问题是在搜索 Xmax 时没有数据写入outfile文件。但是,当删除 Xmax 的搜索时,一切似乎都能正常工作,就像此行停用 outWriter.writerow()一样。任何人都可以告诉我,错误在哪里? 当然,使用熊猫可能是另一种选择,但我想知道为什么我使用csv的代码不起作用。谢谢!
答案 0 :(得分:0)
当您islice(inReader, ...)
消费inReader
中的所有数据而不将其保存在任何地方时。您需要将数据存储在变量中,然后才能找到最大值
import csv
from itertools import islice
headerLines = 15
# you can put both context managers in a single "with"
with open("input.csv", "r") as inf, open('output', 'w') as outf:
inReader = csv.reader(inf, delimiter='\t')
outWriter = csv.writer(outf, delimiter="\t")
inLines = list(inReader)
Xmax = max(float(row[1]) for row in islice(inLines, headerLines, None))
for i,row in enumerate(inLines):
# refactor to avoid code duplication
if i >= headerLines:
row[1] = str(float(row[1])*(-1)+Xmax)
row[5] = str(float(row[5])-180)
outWriter.writerow(row)