[英]Importing a list of dictionaries from a CSV file in python
我的播放列表是字典列表,看起来像这样: [{'url':url1,'title':title1}, {'url':url2,'title':title2}]
当然,播放列表有a name, name1
我要做的是在一个function中,把它保存到一个CSV的文件中。 我的愿望是整个字典只能是 CSV 文件中的一个项目,而不是将字典分成几列。 然后我想要另一个 function 来导入播放列表。 我几乎花了好几个小时来做这件事,但我很绝望,因为我做不到。
我展示了我的尝试:为了拯救演奏者:
def SavePlaylist():
name = SearchBox.get() + "§"
if len(playlist) >1 and name != "":
newrow = [name, playlist]
with open(os.path.join(sys.path[0], "AntiTubePlaylists.txt"), "a") as f_object:
writer_object = writer(f_object)
writer_object.writerow(newrow)
f_object.close()
要导入播放列表:
with open(os.path.join(sys.path[0], "AntiTubePlaylists.txt"), "r") as csv_file:
csv_reader = csv.reader(csv_file, quotechar='"', delimiter='§')
for row in csv_reader:
playlistt = row[1][2:][:-1]
print(playlistt[0])
playlistmenu.add_command(label=row[0], command=(lambda playlistt = playlistt: ImportPlaylist(playlist)))
它所做的是,它创建了一个列表,其中包含我列表中的每个字符。 (即打印命令只打印“[”
Eval解决问题:
with open(os.path.join(sys.path[0], "AntiTubePlaylists.txt"), "r") as csv_file:
csv_reader = csv.reader(csv_file, quotechar='"', delimiter='§')
for row in csv_reader:
playlistt = row[1][2:][:-1]
playlistt = eval(playlistt)
print(playlistt[0])
playlistmenu.add_command(label=row[0], command=(lambda playlistt = playlistt: ImportPlaylist(playlist)))
你想要一个 csv 有 2 cols (url, title) 吗? 我个人会使用 pandas:从您的字典列表中创建一个 dataframe,然后保存到 csv
例如
import pandas as pd
name1 = [{'url':'url1','title':'title1'},
{'url':'url2','title':'title2'},
{'url':'url3','title':'title3'},
{'url':'url4','title':'title4'}]
df = pd.DataFrame(name1)
df.to_csv('PATH/name1.csv')
虽然使用eval
可能有效,但它存在很大的安全风险,您应该只将它用于测试目的。 并且仅在您确定没有不受信任的人篡改过的文件上,原因是 eval 实际上将文件中的所有内容都作为代码运行,因此如果有人将一些恶意代码注入到您正在阅读的 csv 文件中,您会(不知不觉)加载文件时执行它!
实际上,使用 JSON 保存 object 要容易得多。 具体json.dump()
和json.load()
( https://docs.python.org/3/library/json.html#basic-usage )应该是你想要的。
另一种方法是使用pickle
库,该库用于存储 Python 对象,但正如页面所说,它不太安全,因此您最好坚持使用 JSON。额外的好处是 JSON 是人类可读的,而 pickle output 会不会有些垃圾:
>>> import json
>>> import pickle
>>> name1 = [{'url':'url1','title':'title1'}, {'url':'url2','title':'title2'}]
>>> json.dumps(name1)
'[{"url": "url1", "title": "title1"}, {"url": "url2", "title": "title2"}]'
>>> pickle.dumps(name1)
b'\x80\x04\x95?\x00\x00\x00\x00\x00\x00\x00]\x94(}\x94(\x8c\x03url\x94\x8c\x04url1\x94\x8c\x05title\x94\x8c\x06title1\x94u}\x94(h\x02\x8c\x04url2\x94h\x04\x8c\x06title2\x94ue.'
请注意json.dump
和pickle.dump
都有一个转储到字符串而不是文件的版本,即json.dumps
和pickle.dumps
,这可能很方便。
要使用 JSON,文件需要采用正确的格式。 所以我想出了以下解决方案,注意str(s).replace
; JSON 项目需要双引号。
with open(os.path.join(sys.path[0], "AntiTubePlaylists.txt"), "r") as csv_file:
csv_reader = csv.reader(csv_file, delimiter='§')
for row in csv_reader:
s = str(row[1][2:][:-1])
s = str(s).replace("'",'"')
playlist_import = json.loads(s)
print(playlist_import[0])
playlistmenu.add_command(label=row[0], command=(lambda playlistt = playlist_import: ImportPlaylist(playlistt)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.