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

ffdz8vbo  于 2022-12-30  发布在  Python
关注(0)|答案(4)|浏览(112)

我的播放列表是字典的列表,大概看起来像这样:[{'url':url1,'title':title1}, {'url':url2,'title':title2}]当然,播放列表有一个名字,name1我想做的是在一个函数中,将它保存到CSV文件中。我的愿望是整个字典可以只是CSV文件中的一个项目,而不是将字典划分为多个列。然后我想有另一个函数来导入播放列表。我花了几个小时来做这件事,我很绝望,因为我无法应付
我展示了我所尝试的:要保存播放器:

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)))

它所做的是创建一个列表,其中包含了我的列表中的每一个字符。(例如,print命令只打印“[”

nr7wwzry

nr7wwzry1#

虽然使用eval可能会起作用,但它是一个很大的安全风险!您应该只将其用于测试目的,并且只用于您确信没有不受信任的人篡改过的文件。原因是eval实际上以代码的形式运行文件中的所有内容,因此如果有人在您正在阅读的csv文件中注入了一些恶意代码,您将(不知不觉地)在加载文件时执行它!
实际上,使用JSON保存对象要容易得多,特别是json.dump()json.load()(https://docs.python.org/3/library/json.html#basic-usage)应该是您想要的。
另一种选择是使用pickle库,它是为存储Python对象而设计的,但正如页面所述,它不太安全,所以最好还是坚持使用JSON。另外一个好处是JSON是人类可读的,而pickle会输出一些垃圾:

>>> 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,这可能很方便。

lx0bsm1f

lx0bsm1f2#

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)))
vojdkbi0

vojdkbi03#

你想要一个csv有2列(网址,标题)?我个人会使用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')
z9zf31ra

z9zf31ra4#

要使用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)))

相关问题