如何防止在遍历csv时消耗行?

vq8itlhq  于 2023-09-28  发布在  其他
关注(0)|答案(2)|浏览(73)

我有一个非常简单的任务要完成:

**1)**读取一个输入csv文件(具有不同长度的头部分),**2)**对其进行一些基本转换(作为 Dataframe ),**3)**将其作为新的csv(包括与输入csv相同的头部分)。

下面的代码运行良好,除了一个令人讨厌的事情:在写入新CSV时忽略列名。

import pandas as pd

with open('input_file.csv', 'r') as f1, open('output_file.csv', 'w') as f2:

    extra = False
    for line in f1:
      if ',' not in line:
          extra = True
          f2.write(line)
      elif extra:
        break

    df = pd.read_csv(f1)

    # some basic processing here to df like below
    df.iat[0, 1] = 0 

    df.to_csv(f2, index=False)

我实际的新csv看起来像下面这样(看看行col1,col2,col3是如何丢失的):

Title=foo
Date=16/08/2023
Category=bar
...
id1,0,2
id2,3,4
id3,5,6

你能解释一下为什么吗?我觉得这与我的循环有关(因此,我的问题的标题)。
这是我的输入csv btw:

Title=foo
Date=16/08/2023
Category=bar
...
col1,col2,col3
id1,1,2
id2,3,4
id3,5,6
3b6akqbq

3b6akqbq1#

只需重新排列/减少关键的循环来捕获包含列名的行:

for line in f1:
    f2.write(line)
    if ',' in line:
        break
mwkjh3gx

mwkjh3gx2#

为什么不重用line

import pandas as pd
with open('input_file.csv', 'r') as f1, open('output_file.csv', 'w') as f2:
    extra = False
    for line in f1:
      if ',' not in line:
          extra = True
          f2.write(line)
      elif extra:
        break
    df = pd.read_csv(f1, names=line.strip().split(','))
    # some basic processing here to df like below
    df.iat[0, 1] = 0 
    df.to_csv(f2, index=False)

或者,移回该行之前的位置:

import pandas as pd
with open('input_file.csv', 'r') as f1, open('output_file.csv', 'w') as f2:
    extra = False
    pos = 0
    for line in f1:
      if ',' not in line:
          extra = True
          f2.write(line)
          pos = f2.tell()
      elif extra:
        f1.seek(pos)
        break
    df = pd.read_csv(f1)
    # some basic processing here to df like below
    df.iat[0, 1] = 0 
    df.to_csv(f2, index=False)

输出df

col1  col2  col3
0  id1     0     2
1  id2     3     4
2  id3     5     6

相关问题