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

问题描述 投票:0回答:2

我想将一个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吗?

python json csv centos
2个回答
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'}]

0
投票

很少的优化和可读性提示:尽可能避免索引选择。 如果你正在迭代索引和iterable的值,避免使用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循环后放置”,那么它们并不那么奇怪。

© www.soinside.com 2019 - 2024. All rights reserved.