【问题标题】:how to append a column from a csv file to another csv file without using panda?如何在不使用熊猫的情况下将 csv 文件中的列附加到另一个 csv 文件?
【发布时间】:2022-12-24 22:25:17
【问题描述】:

我想从“b.csv”文件中追加一列并将其放入“a.csv”文件中,但它只添加一个字母而不是整个字符串。我尝试在谷歌中搜索但没有答案。我想将该列放在标题“数字”下。这是我的代码:

f = open('b.csv')
default_text = f.read()
with open('a.csv', 'r') as read_obj, \
        open('output_1.csv', 'w', newline='') as write_obj:
    csv_reader = reader(read_obj)
    csv_writer = writer(write_obj)
    for row in csv_reader:
        row.append(default_text[8])
        csv_writer.writerow(row)

这是'a.csv'中的信息

name,age,course,school,number
Leo,18,BSIT,STI
Rommel,23,BSIT,STI
Gaby,33,BSIT,STI
Ranel,31,BSIT,STI

这是'b.csv'中的信息

1212121
1094534
1345684
1093245

【问题讨论】:

  • default_text = f.read() 将文件中的所有文本读入一个字符串。 default_text[8] then 只是这个字符串中的一个字符。
  • 原来如此。谢谢你。我应该为此使用“readlines()”吗?
  • 使用lines = f.readlines()然后迭代for line in lines:
  • @MichHeng 这么喜欢? f = open('b.csv') lines = f.readlines() with open('a.csv', 'r') as read_obj, \ open('output_1.csv', 'w', newline='') as write_obj: csv_reader = reader(read_obj) csv_writer = writer(write_obj) for line in lines: lines.append(lines[0]) csv_writer.writerow(line)

标签: python csv


【解决方案1】:

您可以只连接从两个 CSV 文件中读取的行并将其立即传递给编写器:

import csv
from operator import concat

with open(r'a.csv') as f1, 
        open(r'b.csv') as f2, 
        open(r'output_1.csv', 'w', newline='') as out:
    f1_reader = csv.reader(f1)
    f2_reader = csv.reader(f2)
    writer = csv.writer(out)
    writer.writerow(next(f1_reader))  # write column names
    writer.writerows(map(concat, f1_reader, f2_reader))

因此,我们为 CSV 文件初始化 csv.reader(),为输出初始化 csv.writer()。作为第一个文件(a.csv)包含列名,我们使用next()读取它并传递给.writerow()以将它们写入输出而不进行任何修改。然后使用 map() 我们可以同时迭代两个阅读器应用 operator.concat() 连接从两个阅读器返回的行。我们可以直接传给.writerows(),让它消费map()返回的generator。

【讨论】:

    【解决方案2】:

    如果只有pandas不能用,那么用Tablehelper from 就方便了转换工具图书馆(github)。

    from convtools.contrib.tables import Table
    from convtools import conversion as c
    
    (
        Table.from_csv("tmp/1.csv", header=True)
        # this step wouldn't be needed if your first file wouldn't have missing
        # "number" column
        .drop("number")
        .zip(Table.from_csv("tmp/2.csv", header=["number"]))
        .into_csv("tmp/results.csv")
    )
    

    【讨论】:

      猜你喜欢
      • 2021-04-27
      • 2017-07-28
      • 2018-06-18
      • 2021-06-24
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2017-01-04
      相关资源
      最近更新 更多