Импорт CSV с QUOTE_NONNUMERIC Python не работает должным образом
Я не могу понять это, может быть, я ослеп за то, что долго смотрю на одно и то же...
У меня есть такие строки в файле CSV:
""BIN"",""Afg"",""SONIC/SONIC JET/"",1,8.9095,""Due to the dynamic nature of the exemptions granted to many operators, the Contract Price does not reflect V.A.T. / G.S.T., Mineral Oil Taxes, Federal Excise Taxes or other taxes to which an operator may be exempt. Please contact your salesperson or World Fuel Services if you require assistance in generating a fuel price estimate."",""N/A"",""01-NOV-2013"
Который я пытаюсь импортировать так:
data = csv.DictReader(open(newdatafile), delimiter=',', quoting=csv.QUOTE_NONNUMERIC)
data.fieldnames = [
'iata', 'country', 'fbo', 'quantity', 'price', 'remarks', 'special', 'validdate'
]
for row in data:
fuelentry = FuelPriceImport()
fuelentry.iata = row['iata']
fuelentry.fbo = row['fbo']
fuelentry.min_quantity = row['quantity']
fuelentry.net_price_liter = row['price']
fuelentry.remarks = row['remarks']
fuelentry.save()
Когда я запускаю этот кусок кода, он всегда жалуется на:
could not convert string to float: the Contract Price does not reflect V.A.T. / G.S.T.
Что, очевидно, непосредственно после запятой в строке в двойных кавычках.
не должны QUOTE_NONNUMERIC
избежать именно этого, так как весь текст находится в двойных кавычках?
1 ответ
Решение
Ваш входной формат использует двойные кавычки, что является эквивалентом экранирования кавычек в формате CSV.
Вам придется заменить двойные кавычки на одинарные; Вы можете сделать это на лету с генератором оболочки:
def undoublequotes(fobject):
for line in fobject:
yield line.replace('""', '"')
Это предполагает, что сами данные столбца не содержат двойных кавычек.
Демо-версия:
>>> import csv
>>> from pprint import pprint
>>> def undoublequotes(fobject):
... for line in fobject:
... yield line.replace('""', '"')
...
>>> sample = '''\
... ""BIN"",""Afg"",""SONIC/SONIC JET/"",1,8.9095,""Due to the dynamic nature of the exemptions granted to many operators, the Contract Price does not reflect V.A.T. / G.S.T., Mineral Oil Taxes, Federal Excise Taxes or other taxes to which an operator may be exempt. Please contact your salesperson or World Fuel Services if you require assistance in generating a fuel price estimate."",""N/A"",""01-NOV-2013"
... '''
>>> reader = csv.reader(undoublequotes(sample.splitlines(True)),
... quoting=csv.QUOTE_NONNUMERIC)
>>> pprint(next(reader))
['BIN',
'Afg',
'SONIC/SONIC JET/',
1.0,
8.9095,
'Due to the dynamic nature of the exemptions granted to many operators, the Contract Price does not reflect V.A.T. / G.S.T., Mineral Oil Taxes, Federal Excise Taxes or other taxes to which an operator may be exempt. Please contact your salesperson or World Fuel Services if you require assistance in generating a fuel price estimate.',
'N/A',
'01-NOV-2013']