【问题标题】:Python code to process CSV file处理 CSV 文件的 Python 代码
【发布时间】:2019-01-17 00:02:20
【问题描述】:

我每天都会更新 CSV 文件。需要根据标准处理和创建新文件 - 如果新数据则应针对该行标记为新建,如果它是对现有数据的更新,则应将其标记为更新。如何编写 Python 代码以根据日期在 CSV 文件中处理和输出如下。

Day1 输入数据

empid,enmname,sal,datekey
1,cholan,100,8/14/2018
2,ram,200,8/14/2018

Day2 输入数据

empid,enmname,sal,datekey
1,cholan,100,8/14/2018
2,ram,200,8/14/2018
3,sundar,300,8/15/2018
2,raman,200,8/15/2018

输出数据

status,empid,enmname,sal,datekey
new,3,sundar,300,8/15/2018
update,2,raman,200,8/15/2018

【问题讨论】:

  • 到目前为止你尝试过什么代码?
  • 使用 datetime,您可以知道当前日期时间,并且您可以从 CSV 文件中知道日期。检查日期,一切顺利。
  • import pandas dataInput = pandas.read_csv('source.csv') RecentData = dataInput[dataInput['datekey']==dataInput.datekey.max()] 我试图提取最近的更新使用上面的代码使用熊猫。

标签: python pandas csv


【解决方案1】:

我感觉很好,所以我会给你一些代码。尝试从中学习。


要处理 CSV 文件,我们需要 csv 模块:

import csv

首先,让我们教计算机如何打开和解析 CSV 文件:

def parse(path):
    with open(path) as f:
        return list(csv.DictReader(f))

csv.DictReader 读取csv 文件的第一行并将其用作列的“名称”。然后它为每个后续行创建一个字典,其中的键是列名。

这一切都很好,但我们只想要每个键的最后一个版本:

def parse(path):
    data = {}
    with open(path) as f:
        for row in csv.DictReader(f):
            data[row["empid"]] = row
    return data

这不仅仅是创建一个包含所有内容的列表,而是创建一个字典,其中键是行的 ID。这样,文件中后面找到的行将覆盖文件中前面找到的行。

现在我们已经教会了计算机如何从文件中提取数据,让我们开始吧:

old_data = parse("file1.csv")
new_data = parse("file2.csv")

遍历字典会得到它的键,即数据集中定义的 id。为了一致性,key in dictionary 表示key 是否是字典中的键之一。所以我们可以这样做:

new = {
    id_: row
    for id_, row in new_data.items()
    if id_ not in old_data
}
updated = {
    id_: row
    for id_, row in new_data.items()
    if id_ in old_data and old_data[id_] != row
}

我把csv.DictWriter放在这里,剩下的让你自己解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-22
    • 2016-02-24
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多