如何使用Python解析CSV键值文件

4

我有一个需求,需要解析一个键值逗号分隔的文件。请查看附带的样本日志文件格式。

event_1,log_time:2013-11-05T08:33:37:293+00,user_id:2535285332077170,profile_id:8,nickname:2535285332077170,rank_id:7,shop_tr_status:OK,
event_2,log_time:2013-11-05T08:33:37:344+00,rule_id:18372990742769963554,user_id:2535285332077170,profile_id:8,
event_3,log_time:2013-11-05T08:33:37:401+00,user_id:2535285332077170,profile_id:8,nickname:2535285332077170

我的要求是,如果是事件1,则需要记录时间和昵称。

如果是事件2,则需要用户ID和配置文件ID。

如果是事件3,则需要用户ID和昵称。

有人能建议如何最好地处理这个问题吗?

3个回答

3

不要使用csv.reader。你应该使用tablib来处理动态列:

ds = tablib.Dataset()
ds.csv = open(csvfile).read()

然后,您可以使用以下方式添加列:

def event_data(row):
    if row[0] == 'event_1':
        return [row[1], row[4]]
    # .. and so forth

ds.append_col(event_data, header='Event data')

获取该列应该可以给您想要的数据,根据第一列。

如果你没有表头,那么这绝对是另一个不错的选择。同样地,如果你有表头,DictReader已经内置在csv包中,你就不需要导入tablib了。但是如果你没有表头,你应该考虑使用tablib。 - jgranger
即使您有标题,tablib 也要容易得多,并且具有其他有用的功能。在使用它之后,我再也没有直接使用过 stlib csv 模块。 - Pedro Werneck

1
如果您有标题并想提取特定列数据,请尝试:
import csv
with open('csv_file.csv', 'rU') as csv_file:
        csvreader = csv.DictReader(csv_file)
        for row in csvreader:
            print("Rows: " + str(row))
            if row['header1'] == '1':
                print('Data: ' + row['header2'])

CSV文件内容:

header1,header2,header3
1,2,3
4,5,6

输出:

Rows: {'header2': '2', 'header3': '3', 'header1': '1'}
Data: 2
Rows: {'header2': '5', 'header3': '6', 'header1': '4'}

如果你有很多数据,添加标题可以让你的生活更轻松,否则你将不得不使用csv.reader()来解析内容并按需拆分。

我在文件中没有任何标题。值是由键前缀的,根据事件我必须取特定的值。当它是一个普通的csv文件,只有值时,我使用csv读取器创建了字典,然后根据事件取索引并获取值。 - user2479840
答案与问题不相关,因为原帖主想知道如何解析没有标题的 CSV 文件,并提供了一个 CSV 文件示例。 - sgowd

0
使用for row incsv.reader(),然后在for循环中放置if和一些elif。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接