在python中格式化csv文件的输出

时间:2017-06-10 14:56:41

标签: python csv

我有一个带有非ascii文本(中文字符)的csv文件,如下所示:

id,name1,category,name2,name3  
cn,北京,capital,北京,北京  
cn,南京,city,南京,南京  
jp,東京,capital,東京,江戸

我正在尝试将此文件写入特定格式,其中名称按类别分组:

"A list of capitals are:  
北京(cn)  
北京(cn)  
北京(cn)  
東京(jp)  
東京(jp)  
江戸(jp) 

A list of cities are:  
南京(cn)  
南京(cn)  
南京(cn)"

换句话说,输出就像:

A list of $category values are
$name1 $id
$name2 $id
$name3 $id

我开始创建一个类别为键的字典,名称是值,但是当我尝试编写这个字典时,文本显示不正确。

这是我的代码:

import csv  
cases = {}  
with open('filename.csv', mode='rU') as f:  
reader = csv.reader(f, delimiter=',')  
for n, row in enumerate(reader):  
if not n:  
    #Skip header row (n = 0).  
    continue  
id,name1,category,name2,name3 = row  
if category not in cases:  
    cases[category] = list()  
cases[category].append((name2,name3))  
print(cases)  

2 个答案:

答案 0 :(得分:0)

<强>更新

按第3列排序:

tail -n +2 test | sort -k2 | awk -F, '{print $2" "$1}'

Python非常酷,但恕我直言,有一些关于编码的内容(二进制/ utf-8 /等),如os.walk中的那些并不那么酷。

由于我们在unix world这里是一个使用awk的解决方案,它可能只是在开箱即用的oneliner中完成工作。

假设您的csv文件名为test,其中第一行是表头:

cat test | awk -F "," '{if (NR>1){print $2" "$1}}'

输入测试:

id,name1,category,name2,name3  
cn,北京,capital,北京,北京  
cn,南京,city,南京,南京  
jp,東京,capital,東京,江戸

输出:

北京 cn
南京 cn
東京 jp

答案 1 :(得分:0)

我们继续, Python 解决方案:

import collections, csv

with open('yourfile.csv', encoding='utf-8') as csvfile:
    reader = csv.DictReader(csvfile)
    d = collections.defaultdict(list)  # dictionary-like object
    for row in reader:
        for i in range(1,4):    # iterating through `name` fields
            d[row['category']].append("%s(%s)" % (row['name' + str(i)], row['id']))

print(dict(d))

输出:

{'capital': ['北京(cn)', '北京(cn)', '北京(cn)', '東京(jp)', '東京(jp)', '江戸(jp)'], 'city': ['南京(cn)', '南京(cn)', '南京(cn)']}

https://docs.python.org/3.6/library/csv.html?highlight=csvreader#csv.DictReader https://docs.python.org/3/library/collections.html#collections.defaultdict