【问题标题】:Replace csv header without deleting the other rows替换 csv 标题而不删除其他行
【发布时间】:2018-07-22 08:48:51
【问题描述】:

我想替换一个 cvs 文件的标题行text.csv

header_list = ['column_1', 'column_2', 'column_3']

标题将如下所示;

column_1, column_2, column_3

这是我的代码;

import csv
with open('text.csv', 'w') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(header_list)

csv 文件的标题已正确替换。但是,csv 文件中的其余行已被删除。如何仅替换标题而使其他行保持不变?

我正在使用 python v3.6

【问题讨论】:

  • 要么这不是minimal reproducible example,要么你正在破坏整个现有的text.csv,因为你正在用新数据覆盖文件,"w" 不会追加,它覆盖 i>.

标签: python python-3.x csv


【解决方案1】:

这是使用csv 模块的正确方法。
csv.DictReader 将 csv 文件的内容读入字典列表。它采用可选的fieldnames 参数,如果设置该参数,则应用自定义标题并忽略原始标题并将其视为数据行。所以,你需要做的就是阅读你的 csv 使用csv.DictReader 写入文件并使用csv.DictWriter 写入数据。您必须删除reader 中的第一行,因为它包含旧标题并写入新标题。不过,将新数据写入单独的文件确实有意义。

import csv

header = ["column_1", "column_2", "column_3"]

with open('text.csv', 'r') as fp:
    reader = csv.DictReader(fp, fieldnames=header)

    # use newline='' to avoid adding new CR at end of line
    with open('output.csv', 'w', newline='') as fh: 
        writer = csv.DictWriter(fh, fieldnames=reader.fieldnames)
        writer.writeheader()
        header_mapping = next(reader)
        writer.writerows(reader)

【讨论】:

  • 您创建了一个新的 csv。 OP 希望标头位于相同 .csv 的开头
  • @Agile_Eagle,有几种方法可以做到。无论如何,在我看来,写入单独的文件更灵活。需要时可以随时删除旧版本。
  • 您的答案经过测试可以正常工作。但是,有一个副作用。每行末尾都有一个额外的回车符。因此,文件的每一行末尾都有 CR、CR、LF,而不是只有 CR、LF。
  • @user3848207,它看起来确实很奇怪。我假设您正在使用Windows。 This answer 解决您的问题。
  • @taras,我确实在使用 Windows。确实,您得到了完全正确的答案:)。这个答案解决了我的问题。
【解决方案2】:

使用这个:

import csv
header_list = ['column_1', 'column_2', 'column_3']
mystring = ",".join(header_list)
def line_prepender(filename, line):
    with open(filename, 'r+') as csvfile:
        content = csvfile.read()
        csvfile.seek(0, 0)
        csvfile.write(line.rstrip('\r\n') + '\n' + content)

line_prepender("text.csv", mystring)

【讨论】:

  • 谢谢,但该解决方案不起作用。发生的情况是预期的标头被写入或附加到 csv 文件的底部。原始标题保持不变。
  • 非常感谢。我需要离开一段时间。我会在测试后将您的答案标记为正确答案。赞成。
  • 谢谢!经测试可以正常工作。标记为正确答案:)
  • 我做了进一步的测试,发现你的答案不起作用。运行代码后,附加了新的标头,但未替换原始标头。 csv 文件最终有 2 个标题。
  • 好的,知道了。没问题
猜你喜欢
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 2019-06-13
  • 2022-11-19
相关资源
最近更新 更多