繁体   English   中英

读取 csv 文件、解析数据并存储在字典中

[英]Read csv file, parse data, and store in a dictionary

我有一个文件,其中包含广播电台、艺术家和以这种格式播放的时间最近播放的歌曲:“2019 年 11 月 4 日晚上 8:02”、“Wagon Wheel”、“Darius Rucker”。 我试图将此文件的内容存储在字符串变量 playlist_csv 中,使用 splitlines() 将记录存储在变量行中,然后遍历行以将数据存储在字典中。 键应该是时间戳的日期时间对象,值应该是歌曲和艺术家的元组:{datetime_key: (song, Artist)}

这是文件的摘录:

"November 4, 2019 8:02 PM","Wagon Wheel","Darius Rucker" 
"November 4, 2019 7:59 PM","Remember You Young","Thomas Rhett" 
"November 4, 2019 7:55 PM","Long Hot Summer","Keith Urban" 

这是所需的字典的样子:

{datetime.datetime(2019, 11, 4, 20, 2): ('Wagon Wheel', 'Darius Rucker'), 
datetime.datetime(2019, 11, 4, 19, 59): ('Remember You Young', 'Thomas Rhett'), 
datetime.datetime(2019, 11, 4, 19, 55): ('Long Hot Summer', 'Keith Urban')}

到目前为止,这是我的代码:

# read the file and store content in string variable playlist_csv
with open('playlist.txt', 'r') as csv_file:
    playlist_csv = csv_file.read().replace('\n', '')
    # use splitlines() method to store records in variable lines (it is list)
    split_playlist = playlist_csv.splitlines()
    # iterate through lines to store data in playlist_dict dictionary
    playlist_dict = {}
    for l in csv.reader(split_playlist, quotechar='"', delimiter=',',
       quoting=csv.QUOTE_ALL, skipinitialspace=True):
       dt=datetime.strptime(l[0], '%B %d, %Y %I:%M %p')
       playlist_dict[l[dt]].append(dt)
print(playlist_dict)

但是,在尝试将这些数据存储在字典中时,我不断遇到错误(特别是“'datetime.datetime' 对象不可下标”和“列表索引必须是整数或切片”在修改代码时)。

我感谢任何帮助!

您首先尝试拆分 csv 文件似乎是不必要的 - csv.reader会为您处理所有这些。 而不是playlist_dict[l[dt]].append(dt)你需要类似playlist_dict[dt].append((song, artist)) 这应该有效:

with open('playlist.txt', 'r') as csv_file:
    playlist = {}
    for time, song, artist in csv.reader(csv_file):
        time = datetime.strptime(time, '%B %d, %Y %I:%M %p')
        if time in playlist:
            playlist[time].append((song, artist))
        else:
            playlist[time] = [(song, artist)]

(您提供给csv.reader的可选参数可能也不需要 - 默认值应该适用于您提供的输入类型。)

或者,如果您在每个日期时间只有一首可能的歌曲/艺术​​家,那么您不需要列表并且可以执行此操作(这似乎是您正在寻找的输出):

with open('playlist.txt', 'r') as f:
    playlist = {datetime.strptime(time, '%B %d, %Y %I:%M %p'): (song, artist) 
                for time, song, artist in csv.reader(f)}

事实证明,对于这种情况,它可能是更好的选择,这里有一个使用 Pandas 的解决方案。 作为奖励,它会计算每首歌曲之间的时间。

import pandas as pd

df = pd.read_csv('../resources/radio_songs.csv', dtype={'song_name': str, 'artist': str},
                 parse_dates=[0], header=None, names=['time_played', 'song_name', 'artist'])

df['time_diff'] = df['time_played'].diff(periods=-1)

数据帧输出:

          time_played           song_name         artist time_diff
0 2019-11-04 20:02:00         Wagon Wheel  Darius Rucker  00:03:00
1 2019-11-04 19:59:00  Remember You Young   Thomas Rhett  00:04:00
2 2019-11-04 19:55:00     Long Hot Summer    Keith Urban       NaT

如果出于某种原因您需要它,这里有一种有趣的方式重新创建该字典格式:

tuples_dict = dict(zip(df['time_played'], zip(df['song_name'], df['artist'])))

输出:

{Timestamp('2019-11-04 20:02:00'): ('Wagon Wheel', 'Darius Rucker'), Timestamp('2019-11-04 19:59:00'): ('Remember You Young', 'Thomas Rhett'), Timestamp('2019-11-04 19:55:00'): ('Long Hot Summer', 'Keith Urban')}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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