【问题标题】:Add rows in csv when second csv has the same first row当第二个 csv 具有相同的第一行时,在 csv 中添加行
【发布时间】:2016-12-16 16:31:02
【问题描述】:

我正在学习 Python,很抱歉提出愚蠢的问题..

我有两个文件:

list.csv

john
mary
joanna
lucas
kate

db.csv

john^chief^portland
mary^secretary^ny
joanna^supervisor^washington

我想要实现的是比较两个文件并作为输出 按字母顺序按第一列 abd 排序,其中名称不在 db 中,在第二列中添加 None,如下所示:

输出.csv

joanna^supervisor^washington
john^chief^portland
kate^None
lucas^None
Mary^secretary^ny

我开始从我在 SO 上找到的这段代码开始与之抗争:

masterlist = list(reader22)

for hosts_row in reader21:
    row = 1
    found = False
    for master_row in masterlist:
        results_row = hosts_row
        if hosts_row[0] == master_row[0]:
            results_row.append('FOUNDTHISLINE in master list (row '
                               + str(row) + ')')
            found = True
            break
        row = row + 1
    if not found:
        results_row.append('THISLINENOTFOUND in master list')
    writer23.writerow(results_row)

请帮助了解如何以最佳方式完成。

【问题讨论】:

  • 那么第三列的值是什么?
  • 当您说“相同的第一行”时,您是指吗?
  • 是的对不起专栏。 MMF:没有第三列

标签: python csv


【解决方案1】:

仅使用 csv 模块和 Python 自己的内置数据结构(例如列表和字典)来做您想做的事情是相当容易和高效的:

import csv

with open('list.csv', 'rb') as csvfile:
    masterlist = sorted(row[0] for row in csv.reader(csvfile))

with open('db.csv', 'rb') as csvfile:
    db = {row[0]: row[1:] for row in csv.reader(csvfile, delimiter='^')}

with open('output.csv', 'wb') as csvfile:
    writer = csv.writer(csvfile, delimiter='^')
    for name in masterlist:
        writer.writerow([name] + db[name] if name in db else [name, 'None', ''])

output.csv 创建的内容:

joanna^supervisor^washington
john^chief^portland
kate^None^
lucas^None^
mary^secretary^ny

【讨论】:

  • 如果我错了,请纠正我,但在 python db = {row[0]: row[1:] for row in csv.reader(csvfile, delimiter='^')} 应该是这样的? db = dict((row[0], row[1:]) for row in csv.reader(csvfile, delimiter='^'))
  • Lucas:我不知道 Python Dictionary displays 是在哪个版本中引入的,但它已经存在了很长时间。也就是说,您展示的alternative 方法从generator expression 创建dict 产生keyvalue 对的序列也应该在2.4 到2.7 的版本中工作。
【解决方案2】:

这是 Pandas 库的完美案例。我知道你只是在学习,但请检查一下数据操作(请忽略编号:))

In [37]: list_df = pd.read_csv('list.csv', header=None)

In [38]: db_df = pd.read_csv('db.csv', sep='^', header=None)

In [51]: db_df
Out[51]:
        0           1           2
0    john       chief    portland
1    mary   secretary          ny
2  joanna  supervisor  washington


In [48]: list_df
Out[48]:
        0
0    john
1    mary
2  joanna
3   lucas
4    kate

In [52]: df = list_df.merge(db_df, how='left')

In [53]: df
Out[53]:
        0           1           2
0    john       chief    portland
1    mary   secretary          ny
2  joanna  supervisor  washington
3   lucas         NaN         NaN
4    kate         NaN         NaN

In [54]: df.sort(0)
Out[54]:
        0           1           2
2  joanna  supervisor  washington
0    john       chief    portland
4    kate         NaN         NaN
3   lucas         NaN         NaN
1    mary   secretary          ny

您可以从那里调用 df.to_csv 函数并获取您正在寻找的输出。

(回写) http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html

【讨论】:

  • 如何写回文件?
  • 答案已编辑以指向文档。它非常简单。
猜你喜欢
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 2015-06-21
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
相关资源
最近更新 更多