繁体   English   中英

在 python 中,我如何将结果保存到 csv,AttributeError: 'dict' object 没有属性 'to_csv'

[英]in python , How I can save the result to csv , AttributeError: 'dict' object has no attribute 'to_csv'

如何以安排的方式将结果保存到 csv? 添加额外列的含义解释“添加”和“删除”以及“更改”的内容

我尝试了 diff.to_csv('diff.csv') 并得到了这个错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'to_csv'

这是 python 代码

from csv_diff import load_csv, compare
diff = compare(
    load_csv(open("list1.csv"), key="ean"),
    load_csv(open("list2.csv"), key="ean")
)
diff.to_csv('diff.csv')

额外的信息

list1.csv

price, oldprice,title,brand,category,unit,ean,,
17,,VR BOX Virtual Reality 3D Glasses Bluetooth Game Remote Control For Phone Iphone,other,3d glasses,2023700513,272434,,
18,,3d Glasses,other,3d glasses,1493500513,2272434,,
22,,Zefas Active 3D GlassesFor SmartPhones,zefas,3d glasses,1342700513,2272456,,
22.98,,3D Glasses Circular Polarized Lenses for Polarized TV| 3D Cinemas,other,3d glasses,1992100513,2272483,,
25,,max3 pro,other,3d glasses,1904600513,2272432,,
28.27,,Red Blue Clip on Anaglyph Glasses,other,3d glasses,2068900513,2272453,,

list2.csv

price,oldprice,title,brand,category,unit,ean,,
22.98,,3D Glasses Circular Polarized Lenses for Polarized TV| 3D Cinemas,other,3d  glasses,1992100513,2272483,,
25,,max3 pro,other,3d glasses,1904600513,2272432,,
59,,Red-blue Cyan Anaglyph 3D,terratec,3d glasses,2103700513,2272428,,
65,,Sinogoodies Passive 3D GlassesFor SmartPhones,sinogoodies,3d glasses,1603700513,2272464,,
69.91,,G15-DLP 3D Active Shutter Glasses for DLP-LINK DLP LINK 3D for Optoma Sharp LG Acer BenQ Projectors,other,3d glasses,2039200513,227243,,
70,,Sinogoodies Passive 3D GlassesFor Multi,sinogoodies,3d glasses,1603600513,2272464,,

屏幕运行结果

compare(
        load_csv(open("list1.csv"), key="ean"),
        load_csv(open("list2.csv"), key="ean")
    )

{'added': [{'price': '59', 'oldprice': '', 'title': 'Red-blue Cyan Anaglyph 3D',
 'brand': 'terratec', 'category': '3d glasses', 'unit': '2103700513', 'ean': '22
72428', '': ''}, {'price': '70', 'oldprice': '', 'title': 'Sinogoodies Passive 3
D GlassesFor Multi', 'brand': 'sinogoodies', 'category': '3d glasses', 'unit': '
1603600513', 'ean': '2272464', '': ''}, {'price': '69.91', 'oldprice': '', 'titl
e': 'G15-DLP 3D Active Shutter Glasses for DLP-LINK DLP LINK 3D for Optoma Sharp
 LG Acer BenQ Projectors', 'brand': 'other', 'category': '3d glasses', 'unit': '
2039200513', 'ean': '227243', '': ''}], 'removed': [{'price': '17', 'oldprice':
'', 'title': 'VR BOX Virtual Reality 3D Glasses Bluetooth Game Remote Control Fo
r Phone Iphone', 'brand': 'other', 'category': '3d glasses', 'unit': '2023700513
', 'ean': '272434', '': ''}, {'price': '18', 'oldprice': '', 'title': '3d Glasse
s', 'brand': 'other', 'category': '3d glasses', 'unit': '1493500513', 'ean': '22
72434', '': ''}, {'price': '22', 'oldprice': '', 'title': 'Zefas Active 3D Glass
esFor SmartPhones', 'brand': 'zefas', 'category': '3d glasses', 'unit': '1342700
513', 'ean': '2272456', '': ''}, {'price': '28.27', 'oldprice': '', 'title': 'Re
d Blue Clip on Anaglyph Glasses', 'brand': 'other', 'category': '3d glasses', 'u
nit': '2068900513', 'ean': '2272453', '': ''}], 'changed': [], 'columns_added':
[], 'columns_removed': []}

此解决方案不起作用

import pandas as pd
dataframe = pd.DataFrame(diff)
dataframe.to_csv("data.csv", header=True)

其他解决方案不起作用,因为您的数据没有DataFrame的正确结构。 您需要首先从顶级键访问字典列表。

import pandas

df1  = pandas.DataFrame(diff['added'])
df1['change'] = 'added'
df2 = pandas.DataFrame(diff['removed'])
df2['change'] = 'removed'

df = df1.append(df2)
df.to_csv('diff.csv')

根据评论请求更改

df1 = pandas.read_csv('list1.csv')
df1['version'] = 'list1'
df2 = pandas.read_csv('list2.csv')
df2['version'] = 'list2'

# keep only columns 'version', 'ean', 'price'
diff = df1.append(df2)[['version', 'ean', 'price']]
# keep only duplicated eans, which will only occur
# for eans in both original lists
diff = diff[diff['ean'].duplicated(keep=False)]
# perform a pivot https://pandas.pydata.org/pandas-docs/stable/user_guide/reshaping.html
diff = diff.pivot(index='ean', columns='version', values='price')

# back to a normal dataframe
diff = diff.reset_index()
diff.columns.name = None

# rename columns and keep only what we want
diff = diff.rename(columns={'list1': 'price1', 'list2': 'price2'})[['ean', 'price1', 'price2']]
diff['difference'] = diff['price2'] - diff['price1']

结果图片

您可以使用to_csv提供的pandas方法:

import pandas as pd 

df = pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in diff.items() ]))
df.to_csv('diff.csv')

您可以使用 pandas package pip 安装 Z3A43B4F88325D94022C0EFA9C2FA

import pandas as pd
added_frame = pd.DataFrame(yourdict['added'])
removed_frame = pd.DataFrame(yourdict['removed'])
df = added_frame.append(removed_frame)
df.to_csv("data.csv", header=True)

Pandas 文档

错误'dict' object has no attribute 'to_csv'意味着您的diff变量是字典,因此没有名为.to_csv的方法。

您可以尝试将您的diff强制转换为 csv 文件,但它无法正常工作。 您的diff当前是一个字典,其值为arrays of dictionaries 此格式不适用于 csv。 如果您使用Pandas package 您需要您的字典具有 arrays of strings的值。 这是带有示例的文档

我建议您先考虑如何格式化您的diff ,然后再转换为 csv。

使这项工作的一种选择是从diff字典创建两个 csv。 添加和删除的值实际上是 csv 的正确格式。 这是一个例子:

import csv

keys = diff['added'][0].keys()
with open('file_name.csv', 'w') as output_file:
  dict_writer = csv.DictWriter(output_file, keys)
  dict_writer.writeheader()
  dict_writer.writerows(diff['added'])

这些是 csv package 的文档

编辑:键应该从添加的第一个元素中获取键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM