当前位置: 首页 > 知识库问答 >
问题:

使用 DictWriter 更改列标题

莫兴言
2023-03-14

我正在处理一些代码,以从输入.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

有人可以帮我弄清楚如何在这里重写标题吗?必须将 TargetHeader 定义为.txt文件中的确切列名,以便我的编写器知道要复制的内容。提前谢谢你

共有2个答案

宋宏儒
2023-03-14

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

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)
宰父存
2023-03-14

代替 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 开始,字典保留顺序,因此列将以正确的顺序显示。如果使用早期版本的 Python,则需要创建单独的字段名称列表,或使用 OrderedDict,以确保列以正确的顺序显示在 CSV 文件中。

 类似资料:
  • 如何更改身份栏? 例如,我有一张表: 我需要随着时间的推移而改变

  • 问题内容: 为什么以下内容对我不起作用? 问题答案: 因为您的脚本在运行之前运行,所以标签存在于页面中(在DOM中)。可以将脚本放在标签后,或者等待文档完全加载(使用OnLoad函数) 这行不通: 这将起作用: 此示例(jsfiddle链接)维护顺序(首先是脚本,然后是标签),并使用onLoad:

  • 问题内容: 我有以下代码,该代码将pandas数据框的一列中的值用作新数据框的列。数据框第一列中的值成为新数据框的索引。 从某种意义上说,我想将一个邻接表转换成一个邻接矩阵。这是到目前为止的代码: 这适用于此特定实例: 如果col3中的值不是数字,它将失败。我的问题是,是否有更优雅/更稳健的方式来做到这一点? 问题答案: 这看起来像是枢轴工作: 产量 如果您不希望使用MultiIndex列,则可以

  • 问题内容: 我有以下查询: 我想为该选项命名时如何更改标题。 问题答案: 使用这样的别名: 如果要更改列名,则不仅要为此查询使用,而且通常要使用ALTER TABLE

  • 在我的片段中,我通过以下方式设置我的GridLayout: 所以,我只想在用户旋转手机/平板电脑时,将< code>2改为< code>4。我已经了解了< code > onConfigurationChanged ,并尝试让它为我的情况工作,但它并没有以正确的方式进行。当我旋转手机时,应用程序崩溃了... 你能告诉我如何解决这个问题吗? 以下是我找到解决方案的方法,但效果不佳: 提前感谢!

  • 问题内容: 这段代码可以编译,我只是无法在标题栏上更改名称。 问题答案: 如果您的课程扩展了JFrame,请使用 如果没有,并且包含一个名为myFrame的JFrame,则使用 现在,您已经发布了程序,很明显,您只需要一个JTextField即可获得新标题。这些更改将达到目的: 和: 和:

  • 问题内容: 我知道,我们不能使用来重命名列,但是可以。 我的问题是:的主要用途是什么? 例如, 代替 已编辑的 问题已替换 的主要用途是什么? 上面的问题被下面的问题取代 为什么我们必须使用更改列而不是修改列? 问题答案: CHANGE COLUMN如果您已经创建了MySQL数据库,并确定其中一个列的名称不正确,则无需删除它并进行替换,您只需使用 change column 重命名即可。 MODI

  • 问题内容: 我正在使用python + BeautifulSoup解析HTML文档。 现在,我需要用替换HTML文档中的所有元素。 如何更改标签名称,而不更改文档中的其他任何内容? 问题答案: 我不知道您的访问方式,但以下内容对我有用: 命令输出为: 如您所见,变成了。文件中的其他内容都没有改变。我正在使用Python 2.6和BeautifulSoup 3.2.0。 如果您有多个,并且想要全部更