我有一个带有非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)
答案 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