【问题标题】:Change Column Headers using DictWriter使用 DictWriter 更改列标题
【发布时间】:2020-04-05 02:22:28
【问题描述】:

我正在编写一些代码以从输入 .txt 文件生成两个新的 CSV 文件。 .txt 文件有 40 列数据,我正在编写两个新的 csv 文件,每个文件只从 .txt 文件中获取 2 列。

我的代码运行良好,几乎完全符合我的需要。最后一步是重命名两个新 csv 输出中的原始标题。

这是我的代码:

import csv

QATargetHeaders = ['FNAME','LNAME']
FinalTargetHeaders = ['PROJECT_CODE','PHONE_NUMBER']

with open('TEST.txt','r') as csv_input, open('Test_QA2.csv','w') as csv_output:
    reader = csv.DictReader(csv_input, delimiter='^')
    writer = csv.DictWriter(csv_output, fieldnames=QATargetHeaders, extrasaction='ignore')
    writer.writeheader()
    for line in reader:
        writer.writerow(line)
with open('TEST.txt','r') as csv_input, open('Test_FINAL.csv','w') as csv_output:
    reader = csv.DictReader(csv_input, delimiter='^')
    writer = csv.DictWriter(csv_output, fieldnames=FinalTargetHeaders, extrasaction='ignore')
    writer.writeheader()
    for line in reader:
        writer.writerow(line)

对于 TEST_QA2.csv,我需要更改标题:

FNAME = First Name
LNAME = Last Name

对于 TEST_FINAL.csv,我需要更改标题:

PROJECT_CODE = PROJECT ID
PHONE_NUMBER = DEVICE1

有人可以帮我弄清楚如何在这里重写标题吗? TargetHeaders 必须定义为 .txt 文件中的确切列名,以便我的作者知道要复制什么。提前谢谢您

【问题讨论】:

  • 当您定义编写器时,您已经将标题添加为字段名。标头存储在代码中的 QATargetHeaders 和 FinalTargetHeaders 中。将这些变量调整为您想要的变量。
  • 抱歉,我不确定我是否遵循您的建议。你能解释一下我应该在这里做什么吗?

标签: python csv dictionary


【解决方案1】:

linedict。字典键用作标题。因此,您必须在编写新的 csv 之前重命名密钥。您可以通过 dict 理解来做到这一点。

import csv

QATargetHeaders = ['First Name','Last Name']
FinalTargetHeaders = ['PROJECT ID','DEVICE1']

map_QATargetHeaders = (('FNAME', 'First Name'), ('LNAME', 'Last Name'))
map_FinalTargetHeaders = (('PROJECT_CODE', 'PROJECT ID'), ('PHONE_NUMBER', 'DEVICE1LNAME'))

with open('TEST.txt','r') as csv_input, open('Test_QA2.csv','w') as csv_output:
    reader = csv.DictReader(csv_input, delimiter='^')

    writer = csv.DictWriter(csv_output, fieldnames=QATargetHeaders, extrasaction='ignore')
    writer.writeheader()
    for line in reader:
        line = {map[1]:line[map[0]] for map in map_QATargetHeaders}
        writer.writerow(line)

with open('TEST.txt','r') as csv_input, open('Test_FINAL.csv','w') as csv_output:
    reader = csv.DictReader(csv_input, delimiter='^')

    writer = csv.DictWriter(csv_output, fieldnames=FinalTargetHeaders, extrasaction='ignore')
    writer.writeheader()
    for line in reader:
        line = {map[1]:line[map[0]] for map in map_FinalTargetHeaders}
        writer.writerow(line)

【讨论】:

  • 这行不通。我需要在文本文件中定义 TargetHeaders,以便编写者知道要复制哪些数据列。复制列后,有什么方法可以告诉程序 FNAME = First Name 等等?
  • @eklone1 抱歉,我没有正确阅读。我已经更新了我的答案。
【解决方案2】:

不要使用writeheader,而是使用writerow 和字典,将旧标题映射到新标题。然后您可以像以前一样编写其他行。

QATargetHeaders = {'FNAME': 'First Name','LNAME': 'Last Name'}
FinalTargetHeaders = {'PROJECT_CODE': 'PROJECT ID','PHONE_NUMBER': 'DEVICE1'}
...
    writer = csv.DictWriter(csv_output, fieldnames=QATargetHeaders, extrasaction='ignore')
    writer.writerow(QATargetHeaders)  # instead of writeheader
    for line in reader:
        writer.writerow(line)
...

(从 Python 3.7 dictionaries preserve order 开始,列将以正确的顺序出现。如果使用早期版本的 Python,您将需要创建单独的字段名称列表,或使用 OrderedDict,以确保列以正确的顺序出现在 CSV 文件中。)

【讨论】:

  • 谢谢!这行得通!我喜欢这种方法!不知道字典会保持顺序!
猜你喜欢
  • 2018-12-26
  • 2021-04-25
  • 2012-03-12
  • 1970-01-01
  • 2021-01-09
  • 2011-10-06
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
相关资源
最近更新 更多