Конвертировать некоторые объекты в списке в int - PullRequest
0 голосов
/ 23 сентября 2019

Итак, я читаю файл csv, нажимаю API с входными данными в файле csv, а затем печатаю ответ в другой файл, используя Python.

В данный момент мой файл csv состоит из 12 параметров запроса.из которых я хочу, чтобы 9 передавалось как целое число, а 3 - как строки при обращении к API.

Я не могу преобразовать их в целые числа.Мой код до сих пор, как показано ниже (пока пропустили часть API):

filepath = '/Users/AKG/Work/September19/U-model/Search.csv' 
import requests 
import json
import csv
import os
url = "http://internal-dsp-listing-lg-x.com/v1/predict/RSLD/v1" 
fp = open(filepath, encoding='utf-8') 
for cnt, line in enumerate(fp):
    line = line.split(',')
    d = {"customer_id": line[0],"listing_slot": line[1],"closingIn": line[2],"new_user": line[3],"last_mile_distance": line[4],"stress": line[5],"customer_user_agent": line[6],"listing_restaurant_sla": line[7],"request_id": line[8],"ld": line[9],"city_id": line[10],"restaurant_id": line[11].replace("\n","")} 
    print (line)

Мой вывод:

['\ufeff87068', '4', '-1', '0', '0.916999995708465', '0.9608271718025208', 'ANDROID', '33', 'aa27f680-2ddb-4d61-b685-e29a15f9c85b', '1', '1', '498\n']
['87068', '4', '-1', '0', '0.916999995708465', '0.9608271718025208', 'ANDROID', '33', 'aa27f680-2ddb-4d61-b685-e29a15f9c85b', '0', '1', '498\n']

В.1 Как я могу преобразовать некоторые элементыэтого массива в целое число?

Q.2 Как я могу удалить "\ ufeff" в первом элементе первой строки?

Q.3 Как я могу удалить \ n в последнемэлемент массива?Я использую функцию замены для последнего элемента.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Хотя вы можете проверить, чтобы каждый символ в подстроке isdigit или просто try преобразовался в int, я бы рекомендовал не делать этого.Что если сегмент, для которого следует оставить строку по какой-то причине, также содержит только цифры?Также обратите внимание, что у вас также есть детали, которые могут нуждаться в преобразовании в float.Вместо этого я бы рекомендовал использовать список типов, чтобы определить, как должна быть преобразована каждая часть, затем zip с двумя и выполнить фактическое преобразование.

>>> line = '\ufeff87068,4,-1,0,0.916999995708465,0.9608271718025208,ANDROID,33,aa27f680-2ddb-4d61-b685-e29a15f9c85b,1,1,498\n'
>>> items_raw = line.strip().lstrip('\ufeff').split(",")
>>> types = [int, int, int, int, float, float, str, int, str, int, int, int]
>>> items = [t(x) for t, x in zip(types, items_raw)]    
>>> items
[87068, 4, -1, 0,
 0.916999995708465, 0.9608271718025208,
 'ANDROID',
 33,
 'aa27f680-2ddb-4d61-b685-e29a15f9c85b',
 1, 1, 498]

Вы также можете использовать умножение в списках длясделать список types немного короче и, возможно, более читабельным, в частности, если в списке еще больше записей:

types = [int] * 4 + [float] * 2 + [str, int, str] + [int] * 3

Аналогичным образом вы можете создать другие списки для имен полей иzip их с элементами в словаре понимания:

>>> fields = ["customer_id","listing_slot","closingIn","new_user","last_mile_distance","stress","customer_user_agent","listing_restaurant_sla","request_id","ld","city_id","restaurant_id"]
>>> d = {f: x for f, x in zip(fields, items)}

Или объединить его с преобразованием типов в одном словаре понимания:

>>> d = {f: t(x) for f, t, x in zip(fields, types, items_raw)}

В любом случае, d заканчиваетсякак

{'city_id': 1,
 'closingIn': -1,
 'customer_id': 87068,
 'customer_user_agent': 'ANDROID',
 'last_mile_distance': 0.916999995708465,
 'ld': 1,
 'listing_restaurant_sla': 33,
 'listing_slot': 4,
 'new_user': 0,
 'request_id': 'aa27f680-2ddb-4d61-b685-e29a15f9c85b',
 'restaurant_id': 498,
 'stress': 0.9608271718025208}
0 голосов
/ 23 сентября 2019

Мой вывод:

Вы печатаете line, а не d, поэтому вы видите вещи без замены.;) Ваш .replace('\n', '') правильный.


Q2 / Q3.Да.Вы можете сделать .replace или .strip.Полоса без параметров удалит все пробелы в начале и конце строки, включая \n

Если вы замените простое разбиение следующим:

line = [elem.strip().replace('\ufeff', '') for elem in line.split(',')]

Убедитесь, что ни один элемент не имеет пробеловв начале и в конце, и что ни один элемент не имеет этого символа Юникода.


Q1.Это int(str_value_to_convert) (так int(line[0] и так далее).

Но чтобы не помещать туда столько int(), вы можете использовать эту строку:

line = [int(elem) if elem.isdigit() or (elem[0] == '-' and elem[1:].isdigit()) else elem for elem in line]

.isdigit() проверяет, являются ли все символы в строке цифрами.Не работает для отрицательных целых чисел (потому что - не является цифрой), поэтому я сделал or, проверив, является ли первый символ минусом и является ли остальная часть строки только цифрой.


Еще одно полезное изменение - способ создания словаря.Поскольку вы используете элементы из line по порядку, мы можем просто сжать его со списком меток и использовать явный конструктор dict:

for cnt, line in enumerate(fp):
    line = [elem.strip().replace('\ufeff', '') for elem in line.split(',')]
    line = [int(elem) if elem.isdigit() or (elem[0] == '-' and elem[1:].isdigit()) else elem for elem in line]
    d = dict(zip(["customer_id","listing_slot","closingIn","new_user","last_mile_distance","stress","customer_user_agent","listing_restaurant_sla","request_id","ld","city_id","restaurant_id"], line)) 
...