use*_*321 3 python csv dictionary list
我有一个CSV文件,我读作每行的字典列表.我想删除列表中具有EmailAddress的所有条目''
.我试过了:
#!/usr/bin/python
import csv
def import_users(location_of_file):
with open(location_of_file, 'r', newline='', encoding='utf-8-sig') as openfile:
reader = csv.DictReader(openfile)
for row in reader:
yield row
def save_csv(data, location):
with open(location, 'w', newline='', encoding='utf-8-sig') as file:
fieldnames = ['EmailAddress', 'GivenName', 'Surname', 'Company', 'Department']
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
for item in data:
writer.writerow(item)
if __name__ == '__main__':
users = list(import_users('C:\Temp\Example.csv'))
for user in users:
if user['EmailAddress'] == '':
del user
else:
pass
save_csv(users, 'C:\Temp\Output.csv')
Run Code Online (Sandbox Code Playgroud)
但我的结果仍然是没有电子邮件地址的条目.我究竟做错了什么?
迭代您正在修改的数据结构是不好的做法(并且会导致超级烦人的错误).因此,您应该制作另一个列表,其中只包含您想要的项目.你可以用循环来做到这一点:
users = list(import_users('C:\Temp\Example.csv'))
filtered_users = []
for user in users:
if user['EmailAddress'] == '':
filtered_users.append(user)
save_csv(filtered_users, 'C:\Temp\Output.csv')
Run Code Online (Sandbox Code Playgroud)
或者使用pythons过滤功能:
users = list(import_users('C:\Temp\Example.csv'))
filtered_users = filter(lambda user: user.get('EmailAddress') != '', users)
save_csv(filtered_users, 'C:\Temp\Output.csv')
Run Code Online (Sandbox Code Playgroud)
您无需在内存中创建列表.您可以改为传递生成器和迭代器:
if __name__ == '__main__':
users = import_users('C:/Temp/Example.csv')
save_csv((user for user in users if user['EmailAddress'] != ''),
'C:/Temp/Output.csv')
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
82 次 |
最近记录: |