我正在使用一个函数,该函数接收CSV文件名,将每一行转换为字典,然后返回创建的字典列表(以便能够在以后的函数中进行迭代和组织。我已经通过执行以下操作实现了我想要的功能,但觉得必须有更好的方法。有改进建议吗?
import re
def import_incidents(filename):
"""Imports CSV and returns list of dictionaries for each incident"""
with open(filename, 'r') as file:
data = file.read()
data = data.split('\n')
list_of_data = []
headers = True
for line in data:
line = line.split('","')
if headers == True:
#Skip header and set to false
headers = False
elif len(line) == 1 or line[3] == '':
#File always has a 1 lenth final line, skip it.
#Events can leave blank policies, skip those too.
pass
else:
temp_dict = {}
temp_dict['id'] = re.sub('"', '', line[0])
temp_dict['time'] = re.sub('GMT-0600','',line[1])
temp_dict['source'] = line[2]
temp_dict['policy'] = line[3]
temp_dict['destination'] = line[5]
temp_dict['status'] = line[10]
list_of_data.append(temp_dict)
return list_of_data
print(import_incidents('Incidents (Yesterday Only).csv'))
CSV内容示例:
"ID","Incident Time","Source","Policies","Channel","Destination","Severity","Action","Maximum Matches","Transaction Size","Status",
"9511564","29 Dec. 2015, 08:33:59 AM GMT-0600","Doe, John","Encrypted files","HTTPS","blah.blah.com","Medium","Permitted","0","47.7 KB","Closed - Authorized",
"1848446","29 Dec. 2015, 08:23:36 AM GMT-0600","Smith, Joe","","HTTP","google.com","Low","Permitted","0","775 B","Closed"
你可以用熊猫。它速度快,可以在几行内完成;
import pandas as pd
df = pd.read_csv('incidents.csv')
df['Incident Time'] = df['Incident Time'].str.replace('GMT-0600', '')
list_of_data = df.dropna(subset=['Policies']).to_dict(orient='records')
现在list_of_data
包含:
[{'Action': 'Permitted',
'Channel': 'HTTPS',
'Destination': 'blah.blah.com',
'ID': 9511564,
'Incident Time': '29 Dec. 2015, 08:33:59 AM ',
'Maximum Matches': 0,
'Policies': 'Encrypted files',
'Severity': 'Medium',
'Source': 'Doe, John',
'Status': 'Closed - Authorized',
'Transaction Size': '47.7 KB',
'Unnamed: 11': nan}]
.dropna(subset='Policies')
删除列Policies
中包含NaN
s的行,即缺少值。
如果您不想要DICT列表,请保留数据框:
df = pd.read_csv('incidents.csv', parse_dates=[1]).dropna(subset=['Policies'])
这将Incient Time
读取为非常方便的datetime64[ns]
对象。数据框如下所示:
您重新发明了csv。DictReader()
类,恐怕:
import csv
def import_incidents(filename):
with open(filename, 'r', newline='') as file:
reader = csv.DictReader(file)
for row in reader:
if not row or not row['Policies']:
continue
row['Incident Time'] = re.sub('GMT-0600', '', row['Incident Time'])
yield row
这依赖于字典键的标题行。您可以使用DictReader()
的fieldnames
参数定义自己的字典键(fieldnames
字段按顺序与文件中的列相匹配),但是文件中的第一行仍然像其他行一样读取。您可以使用next()
函数跳过行(请参阅使用Python编辑csv文件时跳过标题)。
问题内容: 我正在努力将列表字典写入.csv文件。 这是我的字典的样子: 我希望.csv文件看起来像: 首先,我写标题: 到目前为止很好…但是,我的问题是我不知道如何将一个列表分配给相应的列。例如: 将随机填充列。另一个问题是,我必须手动填写键,并且不能将其用于具有4个键的另一本词典。 问题答案: 如果您不关心列的顺序(因为字典是无序的),则可以简单地使用: 结果: 如果您确实关心订单,则需要对键
问题内容: 我目前正在使用以下功能比较字典值。有更快或更更好的方法吗? 编辑:两个字典包含相同的键。 问题答案: 如果字典具有相同的键集,并且您需要所有这些打印件以实现任何值差异,那么您将无能为力。也许像这样: 几乎等同于您所拥有的,但是您可能会得到更好的演示,例如在循环使用diffkey之前对其进行排序。
问题内容: 我有一个看起来像这样的csv: 我想制作一个以类别为键的字典,并以剩余数据作为值的字典列表。所以它看起来像这样: (此处缩进以提高可读性)。 我像下面的代码片段一样尝试了一下,但是到那儿我什么也没得到: 问题答案: 使用:
我有一个excel工作表,看起来像这样: 我希望提取这些数据,按列1分组,然后将其添加到字典中,使其如下所示: 到目前为止这是我的代码 但是,我的输出如下所示: 谢啦!
问题内容: 有没有更优雅的方式来编写此代码? 我在做什么:我有键和日期。可能有多个日期分配给键,因此我正在创建一个包含日期列表的字典来表示这一点。以下代码可以正常工作,但是我希望有一个更优雅和Pythonic的方法。 我期望下面的工作,但我不断得到一个NoneType没有属性附加错误。 这可能与以下事实有关: 但为什么? 问题答案: 返回,因为它是就地操作,并且您将其分配回。因此,下一次您实际要做
问题内容: 我有一堆看起来像这样的列表: 我想交换元素如下: 列表的大小可能有所不同,但是它们将始终包含偶数个元素。 我对Python相当陌生,目前正在这样做: 我知道这不是真正的Pythonic,而是想使用更高效的工具。也许列表理解? 问题答案: 无需复杂的逻辑,只需通过切片和步骤重新排列列表即可: TLDR; 编辑带说明 我相信大多数观众已经熟悉列表切片和多重分配。如果您不这样做,我会尽力解释