Python – не удается прочитать значения словаря из файла CSV

avatar
Kiril Climson
7 апреля 2018 в 22:18
535
3
-1

У меня есть два варианта файлов CSV. В одном из них используются двойные кавычки, в другом нет.

A: "shipment_id","status","to_name","to_address_1" etc

B: shipment_id,status,to_name,to_address_1 etc

Как можно прочитать CSV и распечатать значение для shipment_id независимо от того, какой тип CSV отправлен?

Мой код не работает, если в CSV не используются двойные кавычки.

with open(file_location) as f_obj:
    reader = csv.DictReader(f_obj, delimiter=',')
    for line in reader:
         print(line['shipment_id'])
Источник
n1tk
7 апреля 2018 в 22:26
0

То, что вы указали в качестве своих данных, не похоже на dict ... пожалуйста, приведите лучший пример.

juanpa.arrivillaga
7 апреля 2018 в 22:27
0

@sb0709 а? ОП объяснил, что это csv. Почему вы решили, что это dict?

n1tk
7 апреля 2018 в 22:43
0

Не так ясно на основе выборочных данных: A: "shipment_id", "status", "to_name", "to_address_1" и т. д., поэтому создается впечатление, что csv состоит из нескольких dict...

Stop harming Monica
7 апреля 2018 в 23:27
1

Здесь это работает.

n1tk
8 апреля 2018 в 01:29
0

Я думаю, что OP пытается получить данные из «csv» в dict ... потому что это причина DictReader, поэтому он провел некоторое тестирование, и код работает, и, вероятно, проблема не вывода данных в csv, или необходимо указать имена столбцов при чтении или форматировании «csv», чтобы включить имена для каждого столбца. Вот вывод, который я вижу из правильно отформатированного "csv" OrderedDict([('shipment_id', '1233'), ('status', 'No'), ('to_name', 'N'), ('to_address_1', 'С')])

Ответы (3)

avatar
Danny_ds
8 апреля 2018 в 12:01
0

Вы должны иметь возможность использовать quotechar в качестве параметра:

reader = csv.DictReader(f_obj, delimiter=',', quotechar='"')

(или, может быть, '\"' - я не знаю, как Python справляется с этим).

Это должно работать с обеими версиями ваших данных.

Если DictReader не поддерживает параметр quotechar, попробуйте использовать его на csv.reader напрямую.

avatar
n1tk
8 апреля 2018 в 01:50
0

Основываясь на том, как, по моему мнению, должен выглядеть файл .csv, и опыте работы с pandas read_csv, я решил внести свой вклад следующим образом

пример файла test.csv

"1233",No,N,C
9999,OK,C,N

пример файла test1.csv

"321",ok,P,A
980,No,A,G
"1980","No",A,"G"

Код с указанными именами полей для test.csv с print(line['shipment_id']):<1673534136765

import csv
with open('test.csv') as f_obj:
    reader = csv.DictReader(f_obj, delimiter=',', fieldnames=['shipment_id','status','to_name','to_address_1'])
    for line in reader:
        print(line['shipment_id'])

выход:

1233
9999

Код с указанными именами полей для test1.csv с print(line['shipment_id']):<16735391><306

with open('test1.csv') as f_obj:
    reader_ddQ = csv.DictReader(f_obj, delimiter=',', fieldnames=['shipment_id','status','to_name','to_address_1'])
    for line in reader_ddQ:
        print(line['shipment_id'])

выход:

321
980
1980

Код с указанными именами полей для test1.csv с print(line):<1673534>3963514><1677353>test1.csv

with open('test1.csv') as f_obj:
    reader = csv.DictReader(f_obj, delimiter=',', fieldnames=['shipment_id','status','to_name','to_address_1'])
    for line in reader:
        print(line)

выход:

OrderedDict([('shipment_id', '321'), ('status', 'ok'), ('to_name', 'P'), ('to_address_1', 'A')])
OrderedDict([('shipment_id', '980'), ('status', 'No'), ('to_name', 'A'), ('to_address_1', 'G')])
OrderedDict([('shipment_id', '1980'), ('status', 'No'), ('to_name', 'A'), ('to_address_1', 'G')])

Источник для csv.DictReader

avatar
user6683711
7 апреля 2018 в 22:30
0

Попробуйте это:

with open(file_location) as f_obj:
    f_obj = f_obj.read().replace('"','').splitlines()
    reader = csv.DictReader(f_obj, delimiter=',')
    for line in reader:
         print(line['shipment_id'])

.replace('"', '') будет работать, если у него есть двойные кавычки, и ничего не сделает, если нет.

Дайте мне знать, если это сработает :)