python - 使用csv复制标题行和修改文件

时间:2018-06-19 07:39:14

标签: python pandas csv

我尝试按以下格式修改制表符分隔的文件

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的代码不起作用。谢谢!

1 个答案:

答案 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)