Python 如何将新的特定单元格从csv文件添加到另一个文件中而不重复

Python 如何将新的特定单元格从csv文件添加到另一个文件中而不重复,python,python-3.x,csv,Python,Python 3.x,Csv,我想从另一个.csv文件的列更新.csv文件的特定列。但是,当我执行下面的脚本时,经过多次尝试后,output.csv文件要么删除了它的旧字段,要么复制了旧字段。我也不想在脚本再次运行时从输入文件中添加已经添加的字段 打开('Shop Export File.csv','r',encoding='utf-8-sig')作为车间文件: 打开('Shipping CSV.CSV','a',encoding='utf-8-sig',newline='''作为装运文件: shop\u csv=csv.D

我想从另一个.csv文件的列更新.csv文件的特定列。但是,当我执行下面的脚本时,经过多次尝试后,output.csv文件要么删除了它的旧字段,要么复制了旧字段。我也不想在脚本再次运行时从输入文件中添加已经添加的字段

打开('Shop Export File.csv','r',encoding='utf-8-sig')作为车间文件:
打开('Shipping CSV.CSV','a',encoding='utf-8-sig',newline='''作为装运文件:
shop\u csv=csv.DictReader(shop\u文件)
shipping_csv=csv.DictWriter(shipping_文件,字段名=字段名)
对于车间内的r_csv:
数据输入={
“交付至名称”:r[“交付客户”],
“交付至企业名称”:r[“交付公司名称”],
“交付到状态”:r[“交付状态]。条带('AU-'),
“交付至郊区”:r[“交付城市”],
“送达邮政编码”:r[“送达邮政编码”].strip(“”),
“送货至电话号码”:r[“送货电话]。带(“”)
}
shipping_csv.writerow(数据输入)
“Deliver To”是output.csv中的字段名,后者来自input.csv


另一方面,我只希望输出csv文件的特定列被输入csv文件中的列完全覆盖,而不更改其他列。

如果我理解正确,另一种说法是,您希望将两个文件放在一起但删除重复项,对吗?从我所读到的,听起来你没有一个字段被改变的情况,对吗

如果是这种情况,您最好使用
pandas
库将两个文件作为数据帧引入,然后使用
[append]
将两个数据帧追加,然后使用
[drop\u duplicates]

熊猫还可以读取csv文件并写入/附加最终文件

import pandas as pd

df1 = pd.read_csv('file1.csv')
df2 = pd.read_csv('file2.csv')
#this has saved the data from the two different csv files as two dataframes
df1.rename(columns={
    'Deliver To Name':'Delivery Customer',
    'Deliver To Business Name': 'Delivery Company Name',
    'Deliver To State': 'Delivery State',
    'Deliver To Suburb': 'Delivery City',
    'Deliver To Postcode': 'Delivery Zip Code',
    'Deliver To Phone Number': 'Shipping Phone'
    },inplace=True) #rename the columns in df1 so you can append and they will line up
df1['Delivery State'] = df1['Delivery State'].str.strip('AU-')
df1['Delivery Zip Code'] = df1['Delivery Zip Code'].str.strip('"')
df1['Shipping Phone'] = df1['Shipping Phone'].str.strip('"')

df2 = df2.append(df1) #everything in df2 with df1 now appended. any columns that were different between the two will remain, but will have NaN or None for the values from the other df
df2 = df2.drop_duplicates() #looks for every field to be a duplicate. you can specify which columns to look at

df2.to_csv('file2.csv')

如果记录已经存在于第二个文件中,并且您想要更新它,那么这个解决方案仍然根本不考虑。这只是从第一个文件中获取新信息并将其添加到第二个文件中(通过清理)。

我能够找到解决方案,方法是将文件1中的列标题重命名为与文件2标题相同的名称,以便它们可以使用csv.DictReader和csv.DictWriter方法相互添加

最后,我可以通过检查特定行中的名称是否在已存在的名称列表中来防止重复已有的列数据,如果是,它将跳过整行,并获取包含该行信息的其他名称

导入csv
尝试:
打开('Shipping CSV.CSV','r',encoding='utf-8-sig')作为装运读取:
shipping\u old\u data=csv.reader(shipping\u read)
装运名称=[]
对于shipping_old_数据中的行:
发货名称。追加(第[12]行)
打开('Shop Export File.csv','r',encoding='utf-8-sig')作为车间文件:
打开('Shipping CSV.CSV','a',encoding='utf-8-sig',newline='''作为装运文件:
shop\u rows\u as\u dicts=csv.DictReader(shop\u文件)
行=[]
对于车间中的行,按照规定:
电话号码=行['Shipping phone'].strip('“'))
邮政编码=行['Delivery zip code'].strip('“'))
行。追加({
“交付至名称”:行[“交付客户”],
“交付至企业名称”:行[“交付公司名称],
“交付到状态”:行[“交付状态]。带('AU-'),
“交付至郊区”:第[“交付城市”行,
“发送到邮政编码”:f“{zip_code}”,
“发送到电话号码”:f“{Phone_Number}”,
“送货地址第1行”:第[“送货街道名称和编号”],
“项目说明”:行[“项目的变体”]。替换('Product',''))
shipping_csv=csv.DictWriter(shipping_文件,字段名=字段名)
计数器=0
对于行中的行:
如果装运名称中的第['Deliver To Name']行:
通过
其他:
计数器+=1
shipping_csv.writerow(世界其他地区)
打印(f'[+]已成功传输行{counter}')
输入('\n[+]进程已完成。\n按enter键退出。“)
除FileNotFoundError外:
输入('文件名可能已更改。按Enter键退出')

感谢Scottmcc的上述回答,它也帮助我找到了这个解决方案

这两个文件各自有不同的标题,但我希望某些标题的列包含相同的数据。因此,例如,在第一个文件中,头是“传递到状态”,而在第二个文件中,头是“状态传递”。我希望第二个文件中的列与第一个文件中的另一列具有相同的数据,并且其他列保持不变(对于第二个文件)。啊,是的,我完全忽略了这一点。很抱歉,您在第一段代码中明确表示列名不同。我已经编辑了我的回复。正如我在回复中所说,这仍然没有考虑到现有记录的更新。它只是添加新行/记录。但是,如果某个公司或其他什么公司更改了地址,这将导致添加新行,而旧行将保持原样。非常感谢,但是当我运行脚本时,它没有在已经存在的标题下添加信息,而是在新标题下写入新标题和信息,保留所有旧标题不变。因此,csv现在有20列,而不是10列。列标题名称是否完全匹配?比如10对完全匹配的?它们区分大小写(因此“交付给…”和“交付给…”