Преобразование CSV в JSON с помощью цикла for на CENTOS - PullRequest
0 голосов
/ 27 марта 2019

Я хочу преобразовать CSV-файл в JSON-файл, он работает на моем компьютере, но не на моем сервере Centos

Моя версия Python на моем компьютере - Python 3.7.2, и CSV правильно конвертируется в JSON локально.

Итак, я попытался обновить свой python на Centos, моя текущая версия - 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 голосов
/ 28 марта 2019

Небольшой совет по оптимизации и удобочитаемости: по возможности избегайте выбора индекса.
Если вы выполняете итерации как по индексу, так и по значению итерируемого, избегайте использования range (len (x)) и напрямую используйте enumerate, это намного быстрее в python и более читабельно.

Улучшение @ ответа Балдермана:

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)

Список и диктовки немного сложны в начале, но если вы думаете о них как о «циклах с положением после», они не такие странные.

0 голосов
/ 27 марта 2019

Код ниже был протестирован под 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'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...