繁体   English   中英

从 python 中的 CSV 文件导入字典列表

[英]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.dumppickle.dump都有一个转储到字符串而不是文件的版本,即json.dumpspickle.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.

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