在CENTOS上使用for循环将CSV转换为Json问题

时间:2019-03-27 07:37:36

标签: python json csv centos

我想将一个csv文件转换为json文件,它可以在我的计算机上工作,但不能在我的centos服务器上工作

我计算机上的python版本是python 3.7.2,并且csv正确地在本地转换为json。

所以我尝试在Centos上更新python,我的当前版本是python 2.6.6

#Read CSV File
def read_csv(file, json_file, format):
    csv_rows = []
    with open(file) as csvfile:
        reader = csv.DictReader(csvfile)
        title = reader.fieldnames
        for row in reader:
            csv_rows.extend([{title[i]:row[title[i]] for i in range(len(title))}])
        write_json(csv_rows, json_file, format)

我希望我的函数可以读取我的csv文件,但在适当的位置,python返回此错误:

csv_rows.extend([{title[i]:row[title[i]] for i in range(len(title))}])
                                               ^
SyntaxError: invalid syntax

很明显,此错误在我的计算机上不存在,仅在此CentOS服务器上

您认为我必须将python 2更新为python 3吗?

2 个答案:

答案 0 :(得分:0)

下面的代码在python 3.6和2.7下进行了测试

(我相信这是您想要的)

reader = [['1','2','3'],['11','22','33'],['111','222','333']]
csv_rows = []    
title = ['T1','T2','T3']
for row in reader:
    csv_rows.extend([ {title[i]:row[i] for i in range(len(title))} ])

print(csv_rows)

输出

[{'T2': '2', 'T3': '3', 'T1': '1'}, {'T2': '22', 'T3': '33', 'T1': '11'}, {'T2': '222', 'T3': '333', 'T1': '111'}]

答案 1 :(得分:0)

几乎没有优化和可读性的提示:尽可能避免选择索引。
如果您要同时迭代索引和可迭代对象的值,请避免使用range(len(x)),而直接使用enumerate,这在python中要快得多,而且可读性强。

改善@balderman的答案:

reader = [['1','2','3'],['11','22','33'],['111','222','333']]
csv_rows = []
title = ['T1','T2','T3']
for row in reader:
    csv_rows.extend([{val: row[idx] for idx, val in enumerate(title)}])
print(csv_rows)

更好,更清晰的是完全避免使用索引:

reader = [['1','2','3'],['11','22','33'],['111','222','333']]
csv_rows = []
title = ['T1','T2','T3']
for row in reader:
    csv_rows.extend([ {t_val: r_val for (t_val, r_val) in zip(title, row)} ])
print(csv_rows)

更加紧凑(更快):

reader = [['1','2','3'],['11','22','33'],['111','222','333']]
title = ['T1','T2','T3']

csv_rows = [{t_val: r_val for (t_val, r_val) in zip(title, row)} for row in reader]
print(csv_rows)

列表和字典理解在开始时有点棘手,但是如果您将它们视为“ for循环,for置于其后”,它们并不是那么奇怪。